[Home]  [Edit this page]  [Recent Changes]  [Special Pages]  [Help
CppAngle

(C++) Angle, calculate the angle between two coordinats

The function GetAngle calculates the angle between two coordinats.

All it needs is the distance between these two coordinats.

The resulting angle will be in the range [0.0, 2.0 * pi], these angles ordered like a clock:
 12 o'clock is 0.0 * pi 
  3 o'clock is 0.5 * pi
  6 o'clock is 1.0 * pi
  9 o'clock is 1.5 * pi


  1. include <cmath>
  2. include <cassert>
//From http://www.richelbilderbeek.nl/CppAngle.htm double GetAngle(const double dX, const double dY) { //In which quadrant are we? if (dX > 0) { if (dY > 0) { //dX > 0 && dY > 0 //Quadrant IV assert(dX > 0.0 && dY > 0.0); const double angle = (1.0 * M_PI) - std::atan(dX / dY); assert(angle > 0.5 * M_PI && angle < 1.0 * M_PI); return angle; } else if (dY < 0) { //dX > 0 && dY <= 0 //Quadrant I assert(dX > 0.0 && dY < 0.0); const double angle = (0.0 * M_PI) - std::atan(dX / dY); assert(angle > 0.0 * M_PI && angle < 0.5 * M_PI); return angle; } else { //dX > 0.0 && dY == 0.0 //On Y-axis, right side assert(dX > 0.0 && dY == 0.0); const double angle = (0.5 * M_PI); return angle; } } else if (dX < 0.0) { if (dY > 0.0) { //dX < 0 && dY > 0 //Quadrant III assert(dX < 0.0 && dY > 0.0); const double angle = (1.0 * M_PI) - std::atan(dX / dY); assert(angle > 1.0 * M_PI && angle < 1.5 * M_PI); return angle; } else if (dY < 0.0) { //dX < 0 && dY < 0 //Quadrant II assert(dX < 0.0 && dY < 0.0); const double angle = (2.0 * M_PI) - std::atan(dX / dY); assert(angle > 1.5 * M_PI && angle < 2.0 * M_PI); return angle; } else { //dX < 0 && dY == 0 //On X-axis assert(dX < 0.0 && dY == 0.0); const double angle = (1.5 * M_PI); return angle; } } else { if (dY > 0.0) { //dX == 0 && dY > 0.0) //On Y-axis, right side of origin assert(dX==0.0 && dY > 0.0); const double angle = (1.0 * M_PI); return angle; } else if (dY < 0.0) { //dX == 0 && dY < 0.0) //On Y-axis, left side of origin assert(dX==0.0 && dY < 0.0); const double angle = (0.0 * M_PI); return angle; } else { //dX == 0 && dY == 0.0) //On origin assert(dX==0.0 && dY == 0.0); const double angle = (0.0 * M_PI); return angle; } } } int main() { for (double angle = 0.0; angle < 2.0 * M_PI; angle += 0.0001) { const double dX = std::sin(angle); const double dY = -std::cos(angle); const double newAngle = GetAngle(dX,dY); const double difference = newAngle - angle; assert(difference > -0.000000001 && difference < 0.000000001); } }


Code links



last edited (August 9, 2007) by bilderbikkel, Number of views: 1313, Current Rev: 6 (Diff)

[Edit this page]  [Page history]  [What links here]  [Discuss this topic]  [Printer Friendly]  

Members

Username:

Password:


Register
Forgot Password?




Programmers Heaven - for .NET, Java, C/C++ and WEB Developers!
© 1996-2008 Community Networks Ltd. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited. Violators of this policy may be subject to legal action. Please read Terms Of Use and Privacy Statement for more information. Development by Tore Nestenius at .NET Consultant - Synchron Data.