A list of variables are at the bottom of this page.

I developed this derivation to find the effects of canting on the elevation and azimuth angles (angles of bore relative to the line of sight). This grew out of a number of posts on LongRangeHunting.Com in which the standard sin() and cos() formulas were posted. I am not proposing that the sin() and cos() formulas be dropped, but I think it is important to understand that they are approximations.

The coordinate system for this derivation has the X and Y axes parallel to the ground with the Y axis down range, the X axis to the shooters left and the Z axis up.

These formulas assume a positive initial elevation angle and zero initial azimuth angle. They then provide, using the input cant angle, a new elevation and azimuth angle. The basis for the this derivation is the rotation of the initial velocity vector around the Y axis (range) by some angle, cant to the right. The line of sight (centerline of the scope) is parallel to the Y axis.

cant picture

Given the inital conditions shown above, we can rotate the initial velocity vector, V around the Y axis by the cant angle, β, creating a new vector V'. The components of the rotated velocity vector,V'x, V'y, V'z are found by using a rotation matrix. Note that since we are only interested in the new elevation and azimuth angles, we can substitude a unit vector (vector of length 1.0), v, pointing in the same direction as V, which is

v = [0, cos(ε), sin(ε)]

where ε is the initial elevation. Rotation of v by the angle β around the Y axis to find v' the rotated unit vector, a vector pointing in the direction of the canted velocity vector

v' =
* v

Some might notice a missing sign in the rotation matrix because β is defined positive in a clockwise direction when looking down range. This gives

v' = [sin(ε)*sin(β), cos(ε), sin(ε)*cos(β)]

With this new vector and the definition of the vector dot product, A·B = |A||B|cos(c) where

A·B = Ax*Bx + Ay*By + Az*Bz
|A| = [Ax*Ax + Ay*Ay + Az*Az]1/2
|B| = [Bx*Bx + By*By + Bz*Bz]1/2

and c is the angle between vectors A and B we can find the new elevation and azimuth angles.

The vector in the X-Y plane, v'' (parallel to the "ground") is just the X and Y components of v' or

v'' = [sin(ε)*sin(β), cos(ε), 0]

Then the new elevation angle, ε', be found by solving

v'·v'' = |v'||v''|cos(ε')


v'·v'' = sin2(ε)*sin2(β) + cos2(ε)


v'·v'' = |v'||v''|cos(ε') = [sin2(ε)*cos2(β) + cos2(ε)]1/2 cos(ε')

Equating v'·v'' and solving for cos(ε') we have

cos(ε') = [sin2(ε)*sin2(β) + cos2(ε)]1/2


ε' = cos-1[sin2(ε)*sin2(β) + cos2(ε)]1/2

Note that |v'| = 1.0 since v is a unit vector (length 1.0 by definition) and v' is just a rotated copy of v.

To find the new azimuth angle, the angle between v'' and the Y axis, we use the dot product of v'' and a unit vector in the Y direction, y = [0,1,0]

y·v'' = |v''||y|cos(α')

But like |v| and |v'| the length of |y| is 1 so

y·v'' = cos(ε)*1 = |v''|cos(α')

and as before

|v''| = [sin2(ε)*sin2(β) + cos2(ε)]1/2

Plugging this into the previous equation and solving for α' gives

α' = cos-1(cos(ε)/[sin2(ε)*sin2(β) + cos2(ε)]1/2)

The two equations for ε' and α' give the new elevation and azimuth angles. To correct for canted drop and windage, one only need to take the difference between the initial elevation and the canted elevation and multiply by range. For windage, the initial azimuth was zero, to multiplying the new azimuth α' by the range will give the new windage.


ε Initial elevation (angle between bore and line of sight) α Initial azimuth, zero
β Cant angle v Unit vector in direction of muzzle velocity
v' Unit velocity vector rotated by cant angle, β v'' Vector component of v' in X-Y plane