This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/geo/Angle.h
FrankE d283d9b326 geometry changes/fixes/new features
new grid walkers + fixes
new test-cases
worked on step/and turn detection
android offline-data-reader
worked on vap-grouping
2016-09-07 10:16:51 +02:00

78 lines
2.3 KiB
C++
Executable File

#ifndef ANGLE_H
#define ANGLE_H
#include <cmath>
#include "../Assertions.h"
#include "Point2.h"
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) {
Assert::isFalse( (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 radians from (0,0) to (p.x,p.y) between 0 (to-the-right) and <2_PI */
static float getRAD_2PI(const Point2& p) {
return getRAD_2PI(0, 0, p.x, p.y);
}
/** 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) {
Assert::isBetween(r1, 0.0f, (float)(2*M_PI), "r1 out of bounds");
Assert::isBetween(r2, 0.0f, (float)(2*M_PI), "r2 out of bounds");
float tmp = std::abs(r1-r2);
return (tmp <= M_PI) ? (tmp) : (2*M_PI-tmp);
}
/**
* gets the angular difference between
* - the given radians [0:2PI]
* - as a change-in-direction between [-PI:+PI]
*/
static float getSignedDiffRAD_2PI(const float r1, const float r2) {
Assert::isBetween(r1, 0.0f, (float)(2*M_PI), "r1 out of bounds"); // [0:360] deg
Assert::isBetween(r2, 0.0f, (float)(2*M_PI), "r2 out of bounds"); // [0:360] deg
float diff = r1-r2;
if (diff > +M_PI) {diff = -(2*M_PI - diff);}
else if (diff < -M_PI) {diff = +(2*M_PI + diff);}
Assert::isBetween(diff, (float)-M_PI, (float)(+M_PI), "result out of bounds"); // [-180:+180] deg
return diff;
}
/** convert degrees to radians */
static constexpr float degToRad(const float deg) {
return deg / 180.0f * M_PI;
}
/** convert radians to degrees */
static float radToDeg(const float rad) {
return rad * 180.0f / M_PI;
}
/** get a pointer vector (length 1) pointing to the given angle (in radians) */
static Point2 getPointer(const float rad) {
const float x = cos(rad);
const float y = sin(rad);
return Point2(x,y);
}
};
#endif // ANGLE_H