#ifndef ANGLE_H #define ANGLE_H #include #include struct Angle { public: /** get the radians from (x1,y1) to (x2,y2) between 0 (to-the-right) and <2_PI */ static float getRAD_2PI(const float x1, const float y1, const float x2, const float y2) { _assertFalse( (x1==x2)&&(y1==y2), "(x1,y1) must not equal (x2,y2)!!"); const float tmp = std::atan2(y2-y1, x2-x1); return (tmp < 0) ? (tmp + 2*M_PI) : (tmp); } /** get the degrees from (x1,y1) to (x2,y2) between 0 (to-the-right) and <360 */ static float getDEG_360(const float x1, const float y1, const float x2, const float y2) { return radToDeg(getRAD_2PI(x1,y1,x2,y2)); } /** * gets the angular difference between * - the given radians [0:2PI] * - as a change-in-direction between [0:PI] */ static float getDiffRAD_2PI_PI(const float r1, const float r2) { _assertBetween(r1, 0, 2*M_PI, "r1 out of bounds"); _assertBetween(r2, 0, 2*M_PI, "r2 out of bounds"); float tmp = std::abs(r1-r2); return (tmp <= M_PI) ? (tmp) : (2*M_PI-tmp); //float tmp2 = fmod(tmp, M_PI); //return fmod(std::abs(r2 - r1), M_PI); } /** convert degrees to radians */ static constexpr float degToRad(const float deg) { return deg / 180 * M_PI; } /** convert radians to degrees */ static float radToDeg(const float rad) { return rad * 180 / M_PI; } }; #endif // ANGLE_H