Normally, if we were to find the angle between two vectors, say **up-vector** and **dir-vector**, what we would do is to do a dot product between them. Since

and

However, since the calculated angle is the smallest / nearest angle between the two vectors, we can’t derive the (rotational) direction of one vector from the other. Thus in the following figure, it’s hard to figure out whether the **direction vector** is on the left or right of the **up vector**. The angle between two vectors calculated using dot product is always between 0° to 180°, thus we are not able to derive the direction from it.

One way to solve this issue is to take advantage of cosine behavior, where cosine of angles between 0° to 90° degrees are positive.

By introducing an extra ‘right’ vector which is right angle from the up-vector, we could further calculate the dot product between **right vector** and **dir vector** to check if the cosine of angle between them is positive or negative, and from it we could derive the rotational direction of the vector.

Programmatically, it could be coded as:

double calculateAngle( vec dir_vec, vec up_vec ) {
vec right_vec = vec( -up_vec.y, up_vec.x );
dir_vec.normalize();
up_vec.normalize();
right_vec.normalize();
float dot_product = up_vec.dot( dir_vec );
float angle = rad2deg( acos( dot_product ) );
float dot_product_right = right_vec.dot( dir_vec );
if( dot_product_right < 0.0 )
angle = -angle;
return angle;
}

### Like this:

Like Loading...