Skip to main content
Study & Revision Note Crime Scene Investigation Bench Formula Sheet Exam Revision Note Level: Foundational πŸ”“ Free Read

Bloodstain Pattern Analysis (BPA): Angle of Impact & Area of Origin Trigonometry

Overview & Learning Objectives

Quick laboratory and field reference note for measuring elliptical bloodstain width-to-length ratios (W/L), computing angle of impact (alpha), and determining 2D area of convergence and 3D area of origin.

Table of Contents

1. Elliptical Bloodstain Geometry

When a spherical droplet of blood strikes a planar target surface at an acute angle $\alpha$ ($0^\circ < \alpha \le 90^\circ$), momentum elongation produces an elliptical stain whose minor axis (width $W$) and major axis (length $L$, excluding satellite spines/tails) satisfy Victor Balthazard’s trigonometric relationship:

$$\sin(\alpha) = \frac{\text{Width } (W)}{\text{Length } (L)} \implies \alpha = \arcsin\left(\frac{W}{L}\right)$$

NOTE Exclude Scallops & Tails from Length (L)
When measuring major axis $L$ with a digital caliper or forensic macro scale, measure strictly from the leading edge of the ellipse to the opposite reconstructed elliptical arcβ€”never include the elongated wave cast-off tail or satellite spatter.

2. Reference Lookup Table ($W/L$ to Angle $\alpha$)

Width $W$ (mm)Length $L$ (mm)Ratio ($W/L$)Angle of Impact ($\alpha$)Stain Morphology
1.508.640.1736$10.0^\circ$Highly elongated; pronounced directional tail
2.505.000.5000$30.0^\circ$Classic elliptical impact spatter
3.545.000.7071$45.0^\circ$Moderately elliptical; minimal spine formation
4.504.501.0000$90.0^\circ$Circular drop; perpendicular impact

3. Height Above Floor ($Z$) at Area of Origin

Once strings or laser trajectories from multiple stains converge in 2D plan view at a distance $D$ from the leading edge of a stain to the 2D Area of Convergence, the vertical height $Z$ of the Area of Origin (assuming linear trajectory approximation) is:

$$Z = D \cdot \tan(\alpha)$$

 1import math
 2
 3def compute_bloodstain_origin(width_mm: float, length_mm: float, distance_to_convergence_cm: float) -> dict:
 4    if width_mm > length_mm:
 5        raise ValueError("Width W cannot exceed Length L.")
 6    ratio = width_mm / length_mm
 7    alpha_rad = math.asin(ratio)
 8    alpha_deg = math.degrees(alpha_rad)
 9    height_z_cm = distance_to_convergence_cm * math.tan(alpha_rad)
10    return {
11        "w_l_ratio": round(ratio, 4),
12        "angle_of_impact_deg": round(alpha_deg, 2),
13        "estimated_height_z_cm": round(height_z_cm, 2)
14    }
15
16print(compute_bloodstain_origin(width_mm=2.4, length_mm=4.8, distance_to_convergence_cm=65.0))