Jump to content
  • Advertisement
Sign in to follow this  

Relative angles with dot product (2D)

This topic is 2483 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts


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

[font="courier"]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

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
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!