# Elevation angle

How the drop at the target becomes an elevation in mil, and, for the Classic choice, how the sight height is counted on a slope.

## Generated table

**Setting:** Elevation angle

| Choice | Used by |
|---|---|
| Drop ÷ range (Standard) | Standard |
| True angle (arctangent) | Physics, Spin |
| Classic (sight height ÷ cos slope) | Classic |

## What it does

Every flight the solver computes ends, at each range, with a drop: how far below the line of sight the bullet passes when the rifle is zeroed. This setting decides how that drop becomes the elevation in mil you dial.

- **Drop ÷ range (Standard):** elevation is the drop divided by the range, times 1000. This is the small-angle shortcut: it treats the angle as equal to its tangent.
- **True angle (arctangent):** elevation is the exact angle whose tangent is the drop divided by the range, times 1000. It is a little smaller than the shortcut, and the gap grows quickly with the size of the come-up.
- **Classic (sight height ÷ cos slope):** elevation is computed exactly as for Drop ÷ range, but on a slope the sight height is divided by the cosine of the slope angle, which puts the scope farther from the bore. This rule reproduces the classic reference's slope cards. On a level shot nothing changes.

## When to choose it

Use the model's own choice unless you are comparing models. Drop ÷ range matches the baseline reference; True angle is the exact geometry and is what the Physics and Spin models use; Classic reproduces the classic reference on slopes. If you want to know which one your scope follows, a turret tracking test is the way to find out; this page does not know. The three differ by well under 0.1 mil except for True angle at extreme range, and by up to about 0.1 mil at 100 yd for Classic on a 30° slope.

## How to picture it

Draw the line of sight as a horizontal line (tilt the whole picture for a slope; the geometry is the same) with the target on it at distance $R$. The bullet's path crosses the line of sight near the zero range, rises above it, and comes back down through it near the target if you dialed the right elevation. With the zero dialed and nothing else, the bullet instead passes below the target by the drop $d$.

**The conversion.** Draw a right triangle with the range $R$ along the line of sight and the drop $d$ at right angles to it. The angle at the rifle is what you must raise the barrel by. Drop ÷ range reads the *tangent* of that angle as if it were the angle. The true angle is the angle itself. For a small angle they are almost the same number; for a large one the tangent is bigger, so Drop ÷ range reports slightly more elevation than the true angle does. Both are drawn on the same triangle, so they agree on the flight; only the number reported differs.

**The sight height.** Draw the bore and, above it and parallel, the line of sight, a distance apart that is the sight height. On a level shot that gap is 2.5 in on a typical rifle. On a slope, Drop ÷ range and True angle keep the gap perpendicular to the line of sight at that same size. Classic divides the gap by the cosine of the slope: 2.5 in becomes 2.9 in at 30°. The bullet then starts that much farther below the line of sight, while the bore is still pointed from the level zero, so it crosses the line of sight lower than it would. The extra gap is a fixed length, so as an angle it is large at 100 yd and shrinks in proportion to the range.

## The math

| Symbol | Meaning | Unit |
|---|---|---|
| $R$ | range along the line of sight to the target | m |
| $y$ | height of the bullet above the line of sight at range $R$ in the zeroed flight, negative below | m |
| $d$ | the drop, $-y$ | m |
| $h$ | sight height, from the profile | m |
| $\theta$ | inclination of the line of sight, positive uphill (in the zeroing pass the zero slope $\theta_z$ is used instead) | rad |
| $\theta_z$ | the zero slope used when the rifle is zeroed (0 when none is given) | rad |
| $y_0$ | height of the bullet above the line of sight at the muzzle | m |
| $E$ | come-up before the corrections below | mil |
| $J$ | aerodynamic jump, from the `aeroJump` option or the Spin model | mil |
| $f$ | the drop scale factor for the Mach at the target (1 when the profile has none) | none |
| $s$ | the scope's elevation factor, from the profile | none |
| $e$ | the elevation reported | mil |

**The start of the flight.** Every flight is computed in a frame whose first axis is the line of sight and whose second is at right angles to it, so the sight height sets where the bullet starts:

$$
y_0 = -h \qquad \text{for } \texttt{baseline} \text{ and } \texttt{true}
$$

$$
y_0 = -\frac{h}{\cos\theta} \qquad \text{for } \texttt{classic}
$$

Nothing else in the flight depends on this option. The zero is found with the same start height at the zero slope $\theta_z$, so the rifle's bore angle is set with $h/\cos\theta_z$ under `'classic'` and $h$ otherwise; on a level zero both are $h$. On a slope the shot then starts at $-h/\cos\theta$ with the bore angle from the zero, so to first order the bullet passes a fixed length lower than it would with the other values, and the shot needs more elevation by

$$
\Delta e \approx \frac{1000\,h\,(1/\cos\theta - 1)}{R}
$$

For $h = 2.5$ in and $\theta = 30^\circ$ that length is 0.387 in, which is 0.107 mil at 100 yd and falls in proportion to the range. This assumes the rifle was zeroed level. The zeroing flight uses the same rule at the zero slope $\theta_z$, so the difference is zero when $\theta_z = \theta$ and in general uses $(1/\cos\theta - 1/\cos\theta_z)$ in place of $(1/\cos\theta - 1)$.

**The come-up.** From the drop $d = -y$:

$$
E = 1000\,\frac{d}{R} \qquad \text{for } \texttt{baseline} \text{ and } \texttt{classic}
$$

$$
E = 1000\,\arctan\frac{d}{R} \qquad \text{for } \texttt{true}
$$

and the reported elevation, for every value, is

$$
e = \frac{(E - J)\,f}{s}
$$

**How big the difference is.** Write $x = d/R$. Then $x - \arctan x \approx x^3/3$, so True angle is below Drop ÷ range by

$$
E_{\text{baseline}} - E_{\text{true}} \approx \frac{E_{\text{baseline}}^{3}}{3\times 10^{6}} \qquad (E \text{ in mil})
$$

It grows with the cube of the come-up: about 0.005 mil at 25 mil, 0.05 mil at 53 mil, 0.08 mil at 62 mil.

**Where else the come-up is used.** The classic spin-drift value of `spinDrift` is a fixed fraction $k(\text{twist})$ of $E$ (before $J$, $f$, $s$), so it follows this option's choice of $E$. The default spin-drift value uses time of flight instead and does not.

**Under `flight` `'dialed'`.** The solver finds, for each range, the barrel elevation that puts the bullet on the line of sight, and reports that angle as the elevation, without the conversion above; Drop ÷ range and True angle then give the same numbers. The start-height rule for `'classic'` still applies (see [flight](flight.md)).

## The algorithm

The option is read in two places. The first is the start of every flight, which also runs inside the zeroing loop.

```
function flight(input, bore, ranges):
    th = radians(input.inclination)
    if input.angle == 'classic':
        y0 = -input.sight_height / cos(th)
    else:                                  // 'baseline' or 'true'
        y0 = -input.sight_height
    start the bullet at (0, y0) with the muzzle velocity at angle `bore`
    integrate; at each requested range report y, z, time, speed, Mach
```

The zeroing loop calls `fly` with the zero slope and adjusts the bore angle until the bullet is on the line of sight at the zero range.

```
function zeroAngle(input, zero_range, zero_slope, height):
    repeat up to 50 times:
        y = fly(input with zero slope, no wind, no Coriolis, bore, [zero_range]).y
        miss = y - height
        bore = bore - miss / (zero_range)
        stop when |miss| < 1e-9 m
```

The second place is the conversion of each flight's drop into the reported come-up.

```
function comeUp(sample, R, angle, dial):
    if dial is given:                      // flight 'dialed'
        return 1000 * dial
    if angle == 'true':
        return -1000 * atan2(sample.y, R)
    return -1000 * sample.y / R            // 'baseline' and 'classic'

function solve(profile, env, target, options):
    bore = zeroAngle(...)                  // start height by `angle`
    fly the card (and, for lapse 'path'/'spinref' or flight 'dialed', refine; those loops use -y/R whatever `angle` is)
    for each range:
        e = comeUp(...)
        e = e - jump                       // aero jump
        e = e * dsf(Mach)
        report e / ssf_elev
```

The refinement loops for `lapse` `'path'`/`'spinref'` and for `flight` `'dialed'` use drop ÷ range for their own iteration (the height they feed the air), whatever `angle` is: it is only a guess for where the bullet is, and the reported number comes from the table above.

## On a real shot

Read from the tables below (every number in this paragraph is copied from them). On the Standard model, True angle needs -0.050 mil against Drop ÷ range on the level shot north, with the windage and the velocity at the target unchanged. This follows from the math section: the shot needs about 53 mil of come-up (read from a separate solve of the same shot, not from the table), and the cube law gives a few hundredths of a mil. The east, uphill and downhill shots show -0.048, -0.048 and -0.047. Their come-up is a little smaller (about 52 mil on each, again from a separate solve, not from the table), and the difference scales with its cube. Classic reads 0.000 on every shot in this table. That is also from the math: the slopes here are 10°, so the extra sight height is the sight height times (1/cos 10° - 1), under four hundredths of an inch, and at 3520 yd that angle is below the precision shown. Classic acts at short range on steep slopes, and the shots in these first tables are not that; the short-range tables at the end show it.

The second table is under the Classic model's other settings. True angle again lowers the elevation by -0.050 on the level shots and by -0.048 and -0.047 on the slopes. The windage column now moves, by +0.001. The Classic model's spin drift is a fixed fraction of the come-up (see the math section), so when True angle makes the come-up smaller, the spin drift it subtracts is smaller by that fraction of the difference. On the Standard model the spin-drift formula uses time of flight, so there the windage column stays at 0.000. The East and North columns of this table are identical because the Classic model has the Earth-rotation correction off.

Short-range tables (100 yd, 30°). Here Classic acts. On the Standard model, uphill and downhill, Classic needs +0.107 mil more elevation than Drop ÷ range, with windage 0.000 and velocity 0.0. This is the math section's first-order shift: the sight height times (1/cos 30° - 1) is a fraction of an inch, and at 100 yd (3600 in of range, and a mil is a thousandth of the range) that is about a tenth of a mil. It is the same uphill and downhill because the rule contains only the cosine of the slope, which does not change sign. True angle reads 0.000 on both, since a come-up this small makes the arctangent and the tangent equal at the precision shown. Windage does not move, even under the Classic model's spin drift (third short-range table, where the reference row is Classic and the other two rows read -0.107 mil with windage 0.000): the range here is the zero range, so the spin drift subtracted for the zero is computed from the same flight and the same come-up as the one the row uses, and the two cancel whichever value is chosen. This holds only at the zero range; at other ranges the second table shows the windage moving with the elevation.

**Changing only this setting on the Standard model**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 3520 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. All other settings are the Standard model's. In the first column (North, level) the reference arc reaches 223 ft above the line of sight at 2160 yd.

| Value | Shown in the app as | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|
| `'baseline'` | Drop ÷ range (Standard) | reference | reference | reference | reference |
| `'true'` | True angle (arctangent) | -0.050 / 0.000 / 0.0 | -0.048 / 0.000 / 0.0 | -0.048 / 0.000 / 0.0 | -0.047 / 0.000 / 0.0 |
| `'classic'` | Classic (sight height ÷ cos slope) | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 |

Each cell is the change from the reference row (`'baseline'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

**Each value under the Classic model's other settings**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 3520 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. All other settings are the Classic model's. In the first column (North, level) the reference arc reaches 223 ft above the line of sight at 2160 yd.

| Value | Shown in the app as | North, level | East, level | North, 10° uphill | North, 10° downhill |
|---|---|---|---|---|---|
| `'baseline'` | Drop ÷ range (Standard) | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 | 0.000 / 0.000 / 0.0 |
| `'true'` | True angle (arctangent) | -0.050 / +0.001 / 0.0 | -0.050 / +0.001 / 0.0 | -0.048 / +0.001 / 0.0 | -0.047 / +0.001 / 0.0 |
| `'classic'` | Classic (sight height ÷ cos slope) | reference | reference | reference | reference |

Each cell is the change from the reference row (`'classic'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

**Short range on a steep slope: 100 yd, 30° uphill, Standard model**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 100 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. The shot is changed from the scenario's for this table: 100 yd, 30° uphill. All other settings are the Standard model's. In the first column (North, 30° uphill) the reference arc reaches 0 ft above the line of sight at 100 yd.

| Value | Shown in the app as | North, 30° uphill |
|---|---|---|
| `'baseline'` | Drop ÷ range (Standard) | reference |
| `'true'` | True angle (arctangent) | 0.000 / 0.000 / 0.0 |
| `'classic'` | Classic (sight height ÷ cos slope) | +0.107 / 0.000 / 0.0 |

Each cell is the change from the reference row (`'baseline'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

**Short range on a steep slope: 100 yd, 30° downhill, Standard model**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 100 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. The shot is changed from the scenario's for this table: 100 yd, 30° downhill. All other settings are the Standard model's. In the first column (North, 30° downhill) the reference arc reaches 0 ft above the line of sight at 100 yd.

| Value | Shown in the app as | North, 30° downhill |
|---|---|---|
| `'baseline'` | Drop ÷ range (Standard) | reference |
| `'true'` | True angle (arctangent) | 0.000 / 0.000 / 0.0 |
| `'classic'` | Classic (sight height ÷ cos slope) | +0.107 / 0.000 / 0.0 |

Each cell is the change from the reference row (`'baseline'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

**Short range on a steep slope: 100 yd, 30° uphill, under the Classic model's other settings**

The shot: a 350 gr 0.375 in bullet at 3048 fps muzzle velocity, fired at 100 yd in air of 60 °F, 40 % humidity, 24.43 inHg at the firing line, latitude 42.1°, wind 10 mph from the right (90° to the line of fire), the same wind in every column; site altitude 5,500 ft. In the app, type it as "Site altitude" (shown when the profile's model reads one); left blank, the classic values count from sea level and can differ from this table. The shot is changed from the scenario's for this table: 100 yd, 30° uphill. All other settings are the Classic model's. In the first column (North, 30° uphill) the reference arc reaches 0 ft above the line of sight at 100 yd.

| Value | Shown in the app as | North, 30° uphill |
|---|---|---|
| `'baseline'` | Drop ÷ range (Standard) | -0.107 / 0.000 / 0.0 |
| `'true'` | True angle (arctangent) | -0.107 / 0.000 / 0.0 |
| `'classic'` | Classic (sight height ÷ cos slope) | reference |

Each cell is the change from the reference row (`'classic'`) in the same shot, as elevation (mil) / windage (mil) / velocity at the target (fps). Elevation: plus means more elevation must be dialed. Windage: plus means the windage correction moves to the right (dial further right); this is a correction, not where the bullet lands. Velocity: plus means the bullet arrives faster. A zero means no difference at the shown precision.

---

[All reference pages](../index.md)
