In my previous programming years, when determining the angle given three right sides of a right triangle, I always use arctangent (
Math.Atan2 in .NET). Arctangent is always available for me especially when the length of the hypotenuse of a right triangle is not given.
Until I came across with vectors.
Everyone knows that the output angle of the arctangent ranges between
PI/2. However, It cannot be equal to either
PI/2. Just looking at the graph of arctangent would be clear enough.
In linear algebra, say for example, two vectors are given, both from the origin but at different directions. In determining the angle between two vectors, many would think it will be
Angle = Arctangent (Cross Product of two vectors / Dot product of two vectors)
However, when these two vectors are perpendicular to each other, this is the point that the arctangent will fail. Why is that so? Getting the dot product of two perpendicular vectors will eventually lead to a value of zero, which will fail when used to divide a number.
With this in mind, many would think we have to set first a condition whether the angle will be
PI/2 when the computed dot product of these two vectors is zero. Then, we can determine if the angle is
PI/2 depending of the sign returned by the cross product of two vectors.
In addition to a lengthy code that will result with these conditions, we may sometimes want to determine the angle of two vectors when these vectors product an obtuse triangle, which is impossible using arctangent.
To comply with the above statement, we can use the formula below.
Angle = Arccosine (Dot product of two vectors / Product of lengths of two vectors)
Although there is a division involved here, vectors will always have lengths so producing a zero divisor will never happen, and so no failure in division. Also, the result of the arccosine is ranging from
PI, so you won’t need to make additional painstaking work just to come up with an angle greater than or equal to
PI/2 using arctangents.
Tip: To provide an angle that is greater than
PI (or less than
-PI), use the cross product and check whether the vector produced by the cross product is pointing upward or downward normal to the plane. Then adjusting the angle by this condition can be straightforward.