[Home]
[Edit this page]
[Recent Changes]
[Special Pages]
[Help]
CppAngle
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:
[Edit this page] [Page history] [What links here] [Discuss this topic] [Printer Friendly]
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
//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); } }
- include <cmath>
- include <cassert>
Code links
[Edit this page] [Page history] [What links here] [Discuss this topic] [Printer Friendly]
