Sign in to follow this  

Relative angles with dot product (2D)

Recommended Posts


I recently found a dot product relative angle calculation for unit vectors as follows:

[font="courier"][code]float Vector2D::angleBetween(const Vector2D& other) const
float dp = dot(other);

if(dp >= 1.0) dp = 1.0f;
else if(dp <=-1.0) dp = -1.0f;

float angPi = (float)acos(dp);

//side test
return y*other.x > x*other.y ? -angPi : angPi;

But i could not figure out where this "side test" came from.
Does it work? And how?

I usually use the traditional atan2 - atan2 calculation, but if this solution is really correct I could use in machines where this atan2 is not implemented.

Share this post

Link to post
Share on other sites
[quote name='Dirk Gregorius' timestamp='1312574437' post='4845187']
You could simply do this:

angle = atan2( abs( cross( v2, v1 ), dot( v2, v1 ) );

Man, you should read the question before giving out some canned answer.

Share this post

Link to post
Share on other sites
Also, just FYI, that" canned answer" is a bit wrong. Although the norm of the cross product gives you the magnitude of the sine of the angle, it doesn't give the sign, which is really what matters. Without that, you have no more information than the cosine gives you. You need the full determinant, sign included. I liked Vini's description as "perp dot product."

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this