BallisticsInsight

Understanding the Trajectory Plot
Why the Trajectory Rises: Understanding Maximum Ordinate

The projectile's maximum ordinate ("max ord") is always slightly above the line of sight (the "line of fire") in this application. This is due to a deliberate small upward "muzzle angle correction" (+0.05°) and the natural arc a projectile takes under gravity.

1. Line of Fire & Maximum Ordinate

  • Line of fire/Line of sight: This is an imaginary straight line at 0° elevation (or the shooter’s aiming angle) from the muzzle toward the target.
  • Max ordinate: The highest point the actual bullet trajectory rises, measured above the line of sight, typically found before the bullet reaches the target.

Even for a "flat shot" (where the target is at the same elevation as the muzzle and the shooter aims straight at it), the max ordinate is slightly above the line of fire.

2. Muzzle Angle Adjustment in the Code

The application's underlying code includes this adjustment:

muzzle_angle_deg_adjusted = inputs.muzzle_angle_deg + 0.05  # Small offset for realistic max ordinate
muzzle_angle_rad = math.radians(muzzle_angle_deg_adjusted)

The code always adds 0.05 degrees (upwards) to the muzzle angle when setting the launch velocity vector.

Purpose: This is a deliberate adjustment to replicate ballistic reality:

  • Gravity immediately starts pulling the bullet down after it leaves the muzzle.
  • If the muzzle were pointed exactly along the line of fire (no elevation), the bullet would instantly start falling below the line of sight, never *rising* above it.
  • Real-world sights are set so the bullet starts climbing above the line of sight ("bore angle") to counteract gravity and reach the target at the same vertical level.
  • The "0.05 degrees" ensures the simulation has the bullet cross *through* the line of sight at the endpoint and gives a small "realistic" arc for the projectile, causing the trajectory to rise slightly above the sight line mid-flight.

3. Mathematical Reason: Gravity & The "Flat Zero" Problem

  • Physics: Even with zero launch angle, the bullet starts to fall due to gravity the instant it leaves the barrel.
  • In reality, shooters "zero" sights such that the bore is pointed ever-so-slightly upward, so the trajectory arcs up, meets, then falls back down to cross the line of sight at the zero distance.
  • This creates a parabolic arc where the bullet must climb a fraction *above* the straight line of sight before dropping back to it, creating a non-zero "max ordinate".

4. Why a Fixed 0.05° Offset?

  • Without this offset, in a naive simulation, the path would never cross the Line of Sight (LOS) if starting at 0° relative to LOS; any drop puts it *below* the sightline forever.
  • The small 0.05° value is chosen for realism: it gives a believable max ordinate for typical flat-shooting firearm trajectories (a few millimeters to centimeters above the sightline at midrange).
  • In complex ballistic calculators, this angle would be iteratively adjusted until the calculated bullet impact at the chosen “zero distance” matched the scope/sight’s line of sight—in reality, it’s a function of distance, gravity, velocity, etc. This fixed offset is a simplification.

5. Where Does the Max Ordinate Get Reported?

The code determines the peak height as follows:

# Find the max y (height) over the trajectory
y_values = sol.y[1]
max_ordinate_idx = np.argmax(y_values)
if np.all(y_values <= 0):  # If all y-values are negative or zero, max ordinate is effectively 0
    max_ord_m = 0.0
    max_ord_x_m = 0.0
else:
    max_ord_m = y_values[max_ordinate_idx]
    max_ord_x_m = sol.y[0, max_ordinate_idx]

The code stores the peak height for the projectile's y position (vertical), which, because of that slight muzzle elevation, is just barely above zero (the line of sight).

Conclusion

The trajectory rises slightly above the line of fire because the code always gives the muzzle a tiny upward angle (0.05°), mimicking the real-world requirement that a bullet must arc upward to compensate for gravity and hit the line of sight at the target distance ("zero"). This "max ordinate"—the bullet’s highest point—will always be a small positive value above the line of sight, just like in real shooting.

If you were to remove the +0.05 adjustment in the simulation, you would find the bullet only falls below the line of fire (assuming a 0° initial muzzle angle relative to the LOS). With the +0.05, it arcs just slightly above before gravity takes over fully.