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

Back to the page