12 #ifndef hifi_AngleUtil_h
13 #define hifi_AngleUtil_h
19 static float pi() {
return 180.0f; }
20 static float twicePi() {
return 360.0f; }
21 static float halfPi() {
return 90.0f; }
26 static float pi() {
return 3.141592653589793f; }
27 static float twicePi() {
return 6.283185307179586f; }
28 static float halfPi() {
return 1.5707963267948966f; }
33 static float pi() {
return 0.5f; }
34 static float twicePi() {
return 1.0f; }
35 static float halfPi() {
return 0.25f; }
41 template<
class UnitFrom,
class UnitTo >
42 float angleConvert(
float a) {
44 return a * (UnitTo::halfPi() / UnitFrom::halfPi());
51 template<
class Unit >
52 float angleSignedNormal(
float a) {
55 float result = fmod(a, Unit::twicePi());
56 if (result >= Unit::pi()) {
58 result -= Unit::twicePi();
60 }
else if (result < -Unit::pi()) {
62 result += Unit::twicePi();
70 template<
class Unit >
71 float angleUnsignedNormal(
float a) {
73 return angleSignedNormal<Unit>(a - Unit::pi()) + Unit::pi();
84 template<
class Unit >
85 void angleHorizontalPolar(
float& azimuth,
float& altitude) {
87 altitude = angleSignedNormal<Unit>(altitude);
88 if (altitude > Unit::halfPi()) {
90 altitude = Unit::pi() - altitude;
91 azimuth += Unit::pi();
93 }
else if (altitude < -Unit::halfPi()) {
95 altitude = -Unit::pi() - altitude;
96 azimuth += Unit::pi();
98 azimuth = angleUnsignedNormal<Unit>(azimuth);