(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
- include <cmath>
- 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