diff --git a/Angle.cpp b/Angle.cpp index 3376e97..5b71d0d 100644 --- a/Angle.cpp +++ b/Angle.cpp @@ -19,57 +19,8 @@ float Angle::Normalize(float angle) { angle -= 360; return angle; } - -float Angle::Clamp(float angle, float min, float max) { - float normalizedAngle = Normalize(angle); - float r = Float::Clamp(normalizedAngle, min, max); - return r; -} - -float Angle::Difference(float a, float b) { - float r = Normalize(b - a); - return r; -} - -float Angle::MoveTowards(float fromAngle, float toAngle, float maxAngle) { - float d = toAngle - fromAngle; - float sign = signbit(d) ? -1 : 1; - d = sign * Float::Clamp(fabs(d), 0, maxAngle); - return fromAngle + d; -} - -float Angle::CosineRuleSide(float a, float b, float gamma) { - float a2 = a * a; - float b2 = b * b; - float d = a2 + b2 - 2 * a * b * cos(gamma * Angle::Deg2Rad); - // Catch edge cases where float inacuracies lead tot nans - if (d < 0) - return 0; - - float c = sqrtf(d); - return c; -} - -float Angle::CosineRuleAngle(float a, float b, float c) { - float a2 = a * a; - float b2 = b * b; - float c2 = c * c; - float d = (a2 + b2 - c2) / (2 * a * b); - // Catch edge cases where float inacuracies lead tot nans - if (d >= 1) - return 0; - if (d <= -1) - return 180; - - float gamma = acos(d) * Angle::Rad2Deg; - return gamma; -} - -float Angle::SineRuleAngle(float a, float beta, float b) { - float alpha = asin(a * sin(beta * Angle::Deg2Rad) / b); - return alpha; -} */ + //---------------------- template @@ -82,11 +33,25 @@ AngleOf::AngleOf(T angle) : value(angle) {} template <> AngleOf AngleOf::Degrees(float angle) { + if (isfinite(angle)) { + while (angle < -180) + angle += 360; + while (angle >= 180) + angle -= 360; + } + return AngleOf(angle); } template <> AngleOf AngleOf::Radians(float angle) { + if (isfinite(angle)) { + while (angle <= -pi) + angle += 2 * pi; + while (angle > pi) + angle -= 2 * pi; + } + return AngleOf(angle * Rad2Deg); } @@ -104,10 +69,6 @@ float AngleOf::InRadians() const { template <> AngleOf AngleOf::Degrees(float angle) { - if (!isfinite(angle)) { - return AngleOf(0); - } - // map float [-180..180) to integer [-32768..32767] signed short value = (signed short)(angle / 360.0F * 65536.0F); return AngleOf(value); @@ -140,9 +101,6 @@ float AngleOf::InRadians() const { template <> AngleOf AngleOf::Degrees(float angle) { - if (!isfinite(angle)) - return AngleOf(0); - // map float [-180..180) to integer [-128..127) signed char value = (signed char)(angle / 360.0F * 256.0F); return AngleOf(value); @@ -197,6 +155,23 @@ bool AngleOf::operator<=(AngleOf a) { return this->value <= a.value; } +template +signed int Passer::LinearAlgebra::AngleOf::Sign(AngleOf a) { + if (a.value < 0) + return -1; + if (a.value > 0) + return 1; + return 0; +} + +template +AngleOf Passer::LinearAlgebra::AngleOf::Abs(AngleOf a) { + if (Sign(a) < 0) + return -a; + else + return a; +} + template AngleOf AngleOf::operator-() const { AngleOf angle = AngleOf(-this->value); @@ -246,23 +221,24 @@ AngleOf AngleOf::Normalize(AngleOf angle) { return AngleOf::Degrees(angleValue); } -template <> -AngleOf AngleOf::Clamp(AngleOf angle, - AngleOf min, - AngleOf max) { - float normalizedAngle = Normalize(angle).InDegrees(); - float r = Float::Clamp(normalizedAngle, min.InDegrees(), max.InDegrees()); - return r; +template +AngleOf AngleOf::Clamp(AngleOf angle, AngleOf min, AngleOf max) { + float r = Float::Clamp(angle.InDegrees(), min.InDegrees(), max.InDegrees()); + return AngleOf::Degrees(r); } -template <> -AngleOf AngleOf::MoveTowards(AngleOf fromAngle, - AngleOf toAngle, - AngleOf maxAngle) { - float d = toAngle.InDegrees() - fromAngle.InDegrees(); - int sign = signbit(d) ? -1 : 1; - d = sign * Float::Clamp(fabsf(d), 0, maxAngle.InDegrees()); - return fromAngle.InDegrees() + d; +template +AngleOf AngleOf::MoveTowards(AngleOf fromAngle, + AngleOf toAngle, + float maxDegrees) { + maxDegrees = fmaxf(0, maxDegrees); // filter out negative distances + AngleOf d = toAngle - fromAngle; + float dDegrees = Abs(d).InDegrees(); + d = AngleOf::Degrees(Float::Clamp(dDegrees, 0, maxDegrees)); + if (Sign(d) < 0) + d = -d; + + return fromAngle + d; } template @@ -291,41 +267,83 @@ AngleOf AngleOf::Atan(float f) { return AngleOf::Radians(atanf(f)); } -template <> -AngleOf AngleOf::CosineRuleSide(float a, float b, float gamma) { +// template <> +// float AngleOf::CosineRuleSide(float a, float b, AngleOf gamma) +// { +// float a2 = a * a; +// float b2 = b * b; +// float d = +// a2 + b2 - +// 2 * a * b * Cos(gamma); // cosf(gamma * +// Passer::LinearAlgebra::Deg2Rad); +// // Catch edge cases where float inacuracies lead tot nans +// if (d < 0) +// return 0.0f; + +// float c = sqrtf(d); +// return c; +// } + +template +float AngleOf::CosineRuleSide(float a, float b, AngleOf gamma) { float a2 = a * a; float b2 = b * b; - float d = a2 + b2 - 2 * a * b * cosf(gamma * Passer::LinearAlgebra::Deg2Rad); + float d = + a2 + b2 - + 2 * a * b * Cos(gamma); // cosf(gamma * Passer::LinearAlgebra::Deg2Rad); // Catch edge cases where float inacuracies lead tot nans if (d < 0) - return 0.0f; + return 0; float c = sqrtf(d); return c; } -template <> -AngleOf AngleOf::CosineRuleAngle(float a, float b, float c) { +// template <> +// AngleOf AngleOf::CosineRuleAngle(float a, float b, float c) { +// float a2 = a * a; +// float b2 = b * b; +// float c2 = c * c; +// float d = (a2 + b2 - c2) / (2 * a * b); +// // Catch edge cases where float inacuracies lead tot nans +// if (d >= 1) +// return 0.0f; +// if (d <= -1) +// return 180.0f; + +// float gamma = acosf(d) * Rad2Deg; +// return gamma; +// } +template +AngleOf AngleOf::CosineRuleAngle(float a, float b, float c) { float a2 = a * a; float b2 = b * b; float c2 = c * c; float d = (a2 + b2 - c2) / (2 * a * b); // Catch edge cases where float inacuracies lead tot nans if (d >= 1) - return 0.0f; + return AngleOf(); if (d <= -1) - return 180.0f; + return AngleOf::Degrees(180); - float gamma = acosf(d) * Rad2Deg; + // float gamma = acosf(d) * Rad2Deg; + AngleOf gamma = Acos(d); return gamma; } -template <> -AngleOf AngleOf::SineRuleAngle(float a, - AngleOf beta, - float b) { - float deg2rad = Deg2Rad; - float alpha = asinf(a * sinf(beta.InDegrees() * deg2rad) / b); +// template <> +// AngleOf AngleOf::SineRuleAngle(float a, +// AngleOf beta, +// float b) { +// float deg2rad = Deg2Rad; +// float alpha = asinf(a * sinf(beta.InDegrees() * deg2rad) / b); +// return alpha; +// } +template +AngleOf AngleOf::SineRuleAngle(float a, AngleOf beta, float b) { + // float deg2rad = Deg2Rad; + // float alpha = asinf(a * sinf(beta.InDegrees() * deg2rad) / b); + AngleOf alpha = Asin(a * Sin(beta) / b); return alpha; } diff --git a/Angle.h b/Angle.h index c5e55a1..59ba151 100644 --- a/Angle.h +++ b/Angle.h @@ -21,20 +21,20 @@ class AngleOf { static AngleOf Degrees(float f); static AngleOf Radians(float f); - // float ToFloat() const; float InDegrees() const; float InRadians() const; inline T GetBinary() const { return this->value; } - // static AngleOf pi; - bool operator==(const AngleOf a) const; bool operator>(AngleOf a); bool operator>=(AngleOf a); bool operator<(AngleOf a); bool operator<=(AngleOf a); + static signed int Sign(AngleOf a); + static AngleOf Abs(AngleOf a); + AngleOf operator-() const; AngleOf operator-(const AngleOf& a) const; AngleOf operator+(const AngleOf& a) const; @@ -55,7 +55,7 @@ class AngleOf { // }; static AngleOf MoveTowards(AngleOf fromAngle, AngleOf toAngle, - AngleOf maxAngle); + float maxAngle); static float Cos(AngleOf a); static float Sin(AngleOf a); @@ -65,7 +65,7 @@ class AngleOf { static AngleOf Asin(float f); static AngleOf Atan(float f); - static AngleOf CosineRuleSide(float a, float b, float gamma); + static float CosineRuleSide(float a, float b, AngleOf gamma); static AngleOf CosineRuleAngle(float a, float b, float c); static AngleOf SineRuleAngle(float a, AngleOf beta, float c); diff --git a/FloatSingle.cpp b/FloatSingle.cpp index fb6f301..a8c5db1 100644 --- a/FloatSingle.cpp +++ b/FloatSingle.cpp @@ -2,16 +2,16 @@ // License, v. 2.0.If a copy of the MPL was not distributed with this // file, You can obtain one at https ://mozilla.org/MPL/2.0/. -#include #include "FloatSingle.h" +#include const float Float::epsilon = 1e-05f; const float Float::sqrEpsilon = 1e-10f; float Float::Clamp(float f, float min, float max) { - if (f < min) - return min; - if (f > max) - return max; - return f; + if (f < min) + return min; + if (f > max) + return max; + return f; } \ No newline at end of file diff --git a/Polar.cpp b/Polar.cpp index 2ca014b..35d1576 100644 --- a/Polar.cpp +++ b/Polar.cpp @@ -102,8 +102,8 @@ PolarOf PolarOf::operator+(const PolarOf& v) const { return PolarOf(this->distance + v.distance, this->angle); } - float newDistance = - Angle::CosineRuleSide(v.distance, this->distance, rotation).InDegrees(); + float newDistance = AngleOf::CosineRuleSide(v.distance, this->distance, + AngleOf::Degrees(rotation)); float angle = Angle::CosineRuleAngle(newDistance, this->distance, v.distance) .InDegrees(); @@ -133,9 +133,8 @@ PolarOf PolarOf::operator/=(float f) { template float PolarOf::Distance(const PolarOf& v1, const PolarOf& v2) { - float d = Angle::CosineRuleSide(v1.distance, v2.distance, - v2.angle.InDegrees() - v1.angle.InDegrees()) - .InDegrees(); + float d = + AngleOf::CosineRuleSide(v1.distance, v2.distance, v2.angle - v1.angle); return d; } diff --git a/test/Angle16_test.cc b/test/Angle16_test.cc new file mode 100644 index 0000000..3f0fec2 --- /dev/null +++ b/test/Angle16_test.cc @@ -0,0 +1,239 @@ +#if GTEST +#include + +#include +#include + +#include "Angle.h" + +#define FLOAT_INFINITY std::numeric_limits::infinity() + +TEST(Angle16, Construct) { + float angle = 0.0F; + Angle16 a = Angle16::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = -180.0F; + a = Angle16::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = 270.0F; + a = Angle16::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), -90); +} + +TEST(Angle16, Negate) { + float angle = 0; + Angle16 a = Angle16::Degrees(angle); + a = -a; + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = 90.0F; + a = Angle16::Degrees(angle); + a = -a; + EXPECT_FLOAT_EQ(a.InDegrees(), -angle); +} + +TEST(Angle16, Subtract) { + Angle16 a = Angle16::Degrees(0); + Angle16 b = Angle16::Degrees(45.0F); + Angle16 r = a - b; + EXPECT_FLOAT_EQ(r.InDegrees(), -45); +} + +TEST(Angle16, Add) { + Angle16 a = Angle16::Degrees(-45); + Angle16 b = Angle16::Degrees(45.0F); + Angle16 r = a + b; + EXPECT_FLOAT_EQ(r.InDegrees(), 0); +} + +TEST(Angle16, Compare) { + Angle16 a = Angle16::Degrees(45); + bool r = false; + + r = a > Angle16::Degrees(0); + EXPECT_TRUE(r) << "45 > 0"; + + r = a > Angle16::Degrees(90); + EXPECT_FALSE(r) << "45 > 90"; + + r = a > Angle16::Degrees(-90); + EXPECT_TRUE(r) << "45 > -90"; +} + +TEST(Angle16, Normalize) { + Angle16 r = Angle16(); + + r = Angle16::Normalize(Angle16::Degrees(90.0f)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize 90"; + + r = Angle16::Normalize(Angle16::Degrees(-90)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize -90"; + + r = Angle16::Normalize(Angle16::Degrees(270)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize 270"; + + r = Angle16::Normalize(Angle16::Degrees(270 + 360)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize 270+360"; + + r = Angle16::Normalize(Angle16::Degrees(-270)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize -270"; + + r = Angle16::Normalize(Angle16::Degrees(-270 - 360)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize -270-360"; + + r = Angle16::Normalize(Angle16::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Normalize 0"; + + if (false) { // std::numeric_limits::is_iec559) { + // Infinites are not supported + r = Angle16::Normalize(Angle16::Degrees(FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), FLOAT_INFINITY) << "Normalize INFINITY"; + + r = Angle16::Normalize(Angle16::Degrees(-FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), -FLOAT_INFINITY) << "Normalize INFINITY"; + } +} + +TEST(Angle16, Clamp) { + Angle16 r = Angle16(); + + // Clamp(1, 0, 2) will fail because Angle16 does not have enough resolution + // for this. Instead we use Clamp(10, 0, 20) etc. + r = Angle16::Clamp(Angle16::Degrees(10), Angle16::Degrees(0), + Angle16::Degrees(20)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-2) << "Clamp 10 0 20"; + + r = Angle16::Clamp(Angle16::Degrees(-10), Angle16::Degrees(0), + Angle16::Degrees(20)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp -10 0 20"; + + r = Angle16::Clamp(Angle16::Degrees(30), Angle16::Degrees(0), + Angle16::Degrees(20)); + EXPECT_NEAR(r.InDegrees(), 20, 1.0e-2) << "Clamp 30 0 20"; + + r = Angle16::Clamp(Angle16::Degrees(10), Angle16::Degrees(0), + Angle16::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp 10 0 0"; + + r = Angle16::Clamp(Angle16::Degrees(0), Angle16::Degrees(0), + Angle16::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp 0 0 0"; + + r = Angle16::Clamp(Angle16::Degrees(0), Angle16::Degrees(10), + Angle16::Degrees(-10)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-2) << "Clamp 0 10 -10"; + + if (false) { // std::numeric_limits::is_iec559) { + // Infinites are not supported + r = Angle16::Clamp(Angle16::Degrees(10), Angle16::Degrees(0), + Angle16::Degrees(FLOAT_INFINITY)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-2) << "Clamp 1 0 INFINITY"; + + r = Angle16::Clamp(Angle16::Degrees(10), Angle16::Degrees(-FLOAT_INFINITY), + Angle16::Degrees(10)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-2) << "Clamp 1 -INFINITY 1"; + } +} + +// TEST(Angle16, Difference) { +// Angle16 r = 0; + +// r = Angle16::Difference(0, 90); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference 0 90"; + +// r = Angle16::Difference(0, -90); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 0 -90"; + +// r = Angle16::Difference(0, 270); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 0 270"; + +// r = Angle16::Difference(0, -270); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference 0 -270"; + +// r = Angle16::Difference(90, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 90 0"; + +// r = Angle16::Difference(-90, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference -90 0"; + +// r = Angle16::Difference(0, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Difference 0 0"; + +// r = Angle16::Difference(90, 90); +// EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Difference 90 90"; + +// if (std::numeric_limits::is_iec559) { +// r = Angle16::Difference(0, INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), INFINITY) << "Difference 0 INFINITY"; + +// r = Angle16::Difference(0, -INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), -INFINITY) << "Difference 0 -INFINITY"; + +// r = Angle16::Difference(-INFINITY, INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), INFINITY) << "Difference -INFINITY +// INFINITY"; +// } +// } + +TEST(Angle16, MoveTowards) { + Angle16 r = Angle16(); + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(90), 30); + EXPECT_NEAR(r.InDegrees(), 30, 1.0e-2) << "MoveTowards 0 90 30"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(90), 90); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 90"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(-90), 180); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 -90 -180"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(90), 270); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 270"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(90), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 90 -30"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(-90), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -30"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(-90), -90); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -90"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(-90), -180); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -180"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(-90), -270); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -270"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(90), 0); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 90 0"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(0), 0); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 0 0"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(0), 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 0 30"; + + if (false) { // std::numeric_limits::is_iec559) { + // infinites are not supported + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(90), + FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 FLOAT_INFINITY"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), + Angle16::Degrees(FLOAT_INFINITY), 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 30) << "MoveTowards 0 FLOAT_INFINITY 30"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), Angle16::Degrees(-90), + -FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r.InDegrees(), FLOAT_INFINITY) + << "MoveTowards 0 -90 -FLOAT_INFINITY"; + + r = Angle16::MoveTowards(Angle16::Degrees(0), + Angle16::Degrees(-FLOAT_INFINITY), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 30) << "MoveTowards 0 -FLOAT_INFINITY -30"; + } +} +#endif \ No newline at end of file diff --git a/test/Angle8_test.cc b/test/Angle8_test.cc new file mode 100644 index 0000000..bb220c5 --- /dev/null +++ b/test/Angle8_test.cc @@ -0,0 +1,239 @@ +#if GTEST +#include + +#include +#include + +#include "Angle.h" + +#define FLOAT_INFINITY std::numeric_limits::infinity() + +TEST(Angle8, Construct) { + float angle = 0.0F; + Angle8 a = Angle8::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = -180.0F; + a = Angle8::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = 270.0F; + a = Angle8::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), -90); +} + +TEST(Angle8, Negate) { + float angle = 0; + Angle8 a = Angle8::Degrees(angle); + a = -a; + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = 90.0F; + a = Angle8::Degrees(angle); + a = -a; + EXPECT_FLOAT_EQ(a.InDegrees(), -angle); +} + +TEST(Angle8, Add) { + Angle8 a = Angle8::Degrees(-45); + Angle8 b = Angle8::Degrees(45.0F); + Angle8 r = a + b; + EXPECT_FLOAT_EQ(r.InDegrees(), 0); +} + +TEST(Angle8, Subtract) { + Angle8 a = Angle8::Degrees(0); + Angle8 b = Angle8::Degrees(45.0F); + Angle8 r = a - b; + EXPECT_FLOAT_EQ(r.InDegrees(), -45); +} + +TEST(Angle8, Compare) { + Angle8 a = Angle8::Degrees(45); + bool r = false; + + r = a > Angle8::Degrees(0); + EXPECT_TRUE(r) << "45 > 0"; + + r = a > Angle8::Degrees(90); + EXPECT_FALSE(r) << "45 > 90"; + + r = a > Angle8::Degrees(-90); + EXPECT_TRUE(r) << "45 > -90"; +} + +TEST(Angle8, Normalize) { + Angle8 r = Angle8(); + + r = Angle8::Normalize(Angle8::Degrees(90.0f)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize 90"; + + r = Angle8::Normalize(Angle8::Degrees(-90)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize -90"; + + r = Angle8::Normalize(Angle8::Degrees(270)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize 270"; + + r = Angle8::Normalize(Angle8::Degrees(270 + 360)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize 270+360"; + + r = Angle8::Normalize(Angle8::Degrees(-270)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize -270"; + + r = Angle8::Normalize(Angle8::Degrees(-270 - 360)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize -270-360"; + + r = Angle8::Normalize(Angle8::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Normalize 0"; + + if (false) { // std::numeric_limits::is_iec559) { + // Infinites are not supported + r = Angle8::Normalize(Angle8::Degrees(FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), FLOAT_INFINITY) << "Normalize INFINITY"; + + r = Angle8::Normalize(Angle8::Degrees(-FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), -FLOAT_INFINITY) << "Normalize INFINITY"; + } +} + +TEST(Angle8, Clamp) { + Angle8 r = Angle8(); + + // Clamp(1, 0, 2) will fail because Angle8 does not have enough resolution for + // this. Instead we use Clamp(10, 0, 20) etc. + r = Angle8::Clamp(Angle8::Degrees(10), Angle8::Degrees(0), + Angle8::Degrees(20)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-0) << "Clamp 10 0 20"; + + r = Angle8::Clamp(Angle8::Degrees(-10), Angle8::Degrees(0), + Angle8::Degrees(20)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp -10 0 20"; + + r = Angle8::Clamp(Angle8::Degrees(30), Angle8::Degrees(0), + Angle8::Degrees(20)); + EXPECT_NEAR(r.InDegrees(), 20, 1.0e-0) << "Clamp 30 0 20"; + + r = Angle8::Clamp(Angle8::Degrees(10), Angle8::Degrees(0), + Angle8::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp 10 0 0"; + + r = Angle8::Clamp(Angle8::Degrees(0), Angle8::Degrees(0), Angle8::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp 0 0 0"; + + r = Angle8::Clamp(Angle8::Degrees(0), Angle8::Degrees(10), + Angle8::Degrees(-10)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-0) << "Clamp 0 10 -10"; + + if (false) { // std::numeric_limits::is_iec559) { + // Infinites are not supported + r = Angle8::Clamp(Angle8::Degrees(10), Angle8::Degrees(0), + Angle8::Degrees(FLOAT_INFINITY)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-0) << "Clamp 1 0 INFINITY"; + + r = Angle8::Clamp(Angle8::Degrees(10), Angle8::Degrees(-FLOAT_INFINITY), + Angle8::Degrees(10)); + EXPECT_NEAR(r.InDegrees(), 10, 1.0e-0) << "Clamp 1 -INFINITY 1"; + } +} + +// TEST(Angle8, Difference) { +// Angle8 r = 0; + +// r = Angle8::Difference(0, 90); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference 0 90"; + +// r = Angle8::Difference(0, -90); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 0 -90"; + +// r = Angle8::Difference(0, 270); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 0 270"; + +// r = Angle8::Difference(0, -270); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference 0 -270"; + +// r = Angle8::Difference(90, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 90 0"; + +// r = Angle8::Difference(-90, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference -90 0"; + +// r = Angle8::Difference(0, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Difference 0 0"; + +// r = Angle8::Difference(90, 90); +// EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Difference 90 90"; + +// if (std::numeric_limits::is_iec559) { +// r = Angle8::Difference(0, INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), INFINITY) << "Difference 0 INFINITY"; + +// r = Angle8::Difference(0, -INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), -INFINITY) << "Difference 0 -INFINITY"; + +// r = Angle8::Difference(-INFINITY, INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), INFINITY) << "Difference -INFINITY +// INFINITY"; +// } +// } + +TEST(Angle8, MoveTowards) { + Angle8 r = Angle8(); + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(90), 30); + EXPECT_NEAR(r.InDegrees(), 30, 1.0e-0) << "MoveTowards 0 90 30"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(90), 90); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 90"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(-90), 180); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 -90 -180"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(90), 270); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 270"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(90), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 90 -30"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(-90), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -30"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(-90), -90); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -90"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(-90), -180); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -180"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(-90), -270); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -270"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(90), 0); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 90 0"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(0), 0); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 0 0"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(0), 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 0 30"; + + if (false) { // std::numeric_limits::is_iec559) { + // infinites are not supported + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(90), + FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 FLOAT_INFINITY"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(FLOAT_INFINITY), + 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 30) << "MoveTowards 0 FLOAT_INFINITY 30"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), Angle8::Degrees(-90), + -FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r.InDegrees(), FLOAT_INFINITY) + << "MoveTowards 0 -90 -FLOAT_INFINITY"; + + r = Angle8::MoveTowards(Angle8::Degrees(0), + Angle8::Degrees(-FLOAT_INFINITY), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 30) << "MoveTowards 0 -FLOAT_INFINITY -30"; + } +} + +#endif \ No newline at end of file diff --git a/test/AngleSingle_test.cc b/test/AngleSingle_test.cc new file mode 100644 index 0000000..cc0774e --- /dev/null +++ b/test/AngleSingle_test.cc @@ -0,0 +1,247 @@ +#if GTEST +#include + +#include +#include + +#include "Angle.h" + +#define FLOAT_INFINITY std::numeric_limits::infinity() + +TEST(AngleSingle, Construct) { + float angle = 0.0F; + AngleSingle a = AngleSingle::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = -180.0F; + a = AngleSingle::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = 270.0F; + a = AngleSingle::Degrees(angle); + EXPECT_FLOAT_EQ(a.InDegrees(), -90); +} + +TEST(AngleSingle, Negate) { + float angle = 0; + AngleSingle a = AngleSingle::Degrees(angle); + a = -a; + EXPECT_FLOAT_EQ(a.InDegrees(), angle); + + angle = 90.0F; + a = AngleSingle::Degrees(angle); + a = -a; + EXPECT_FLOAT_EQ(a.InDegrees(), -angle); +} + +TEST(AngleSingle, Add) { + AngleSingle a = AngleSingle::Degrees(-45); + AngleSingle b = AngleSingle::Degrees(45.0F); + AngleSingle r = a + b; + EXPECT_FLOAT_EQ(r.InDegrees(), 0); +} + +TEST(AngleSingle, Subtract) { + AngleSingle a = AngleSingle::Degrees(0); + AngleSingle b = AngleSingle::Degrees(45.0F); + AngleSingle r = a - b; + EXPECT_FLOAT_EQ(r.InDegrees(), -45); +} + +TEST(AngleSingle, Compare) { + AngleSingle a = AngleSingle::Degrees(45); + bool r = false; + + r = a > AngleSingle::Degrees(0); + EXPECT_TRUE(r) << "45 > 0"; + + r = a > AngleSingle::Degrees(90); + EXPECT_FALSE(r) << "45 > 90"; + + r = a > AngleSingle::Degrees(-90); + EXPECT_TRUE(r) << "45 > -90"; +} + +TEST(AngleSingle, Normalize) { + Angle r = AngleSingle(); + + r = AngleSingle::Normalize(AngleSingle::Degrees(90.0f)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize 90"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(-90)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize -90"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(270)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize 270"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(270 + 360)); + EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Normalize 270+360"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(-270)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize -270"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(-270 - 360)); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Normalize -270-360"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Normalize 0"; + + if (std::numeric_limits::is_iec559) { + r = AngleSingle::Normalize(AngleSingle::Degrees(FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), FLOAT_INFINITY) << "Normalize INFINITY"; + + r = AngleSingle::Normalize(AngleSingle::Degrees(-FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), -FLOAT_INFINITY) << "Normalize INFINITY"; + } +} + +TEST(AngleSingle, Clamp) { + Angle r = AngleSingle(); + + r = AngleSingle::Clamp(AngleSingle::Degrees(1), AngleSingle::Degrees(0), + AngleSingle::Degrees(2)); + EXPECT_FLOAT_EQ(r.InDegrees(), 1) << "Clamp 1 0 2"; + + r = AngleSingle::Clamp(AngleSingle::Degrees(-1), AngleSingle::Degrees(0), + AngleSingle::Degrees(2)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp -1 0 2"; + + r = AngleSingle::Clamp(AngleSingle::Degrees(3), AngleSingle::Degrees(0), + AngleSingle::Degrees(2)); + EXPECT_FLOAT_EQ(r.InDegrees(), 2) << "Clamp 3 0 2"; + + r = AngleSingle::Clamp(AngleSingle::Degrees(1), AngleSingle::Degrees(0), + AngleSingle::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp 1 0 0"; + + r = AngleSingle::Clamp(AngleSingle::Degrees(0), AngleSingle::Degrees(0), + AngleSingle::Degrees(0)); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Clamp 0 0 0"; + + r = AngleSingle::Clamp(AngleSingle::Degrees(0), AngleSingle::Degrees(1), + AngleSingle::Degrees(-1)); + EXPECT_FLOAT_EQ(r.InDegrees(), 1) << "Clamp 0 1 -1"; + + if (std::numeric_limits::is_iec559) { + r = AngleSingle::Clamp(AngleSingle::Degrees(1), AngleSingle::Degrees(0), + AngleSingle::Degrees(FLOAT_INFINITY)); + EXPECT_FLOAT_EQ(r.InDegrees(), 1) << "Clamp 1 0 INFINITY"; + + r = AngleSingle::Clamp(AngleSingle::Degrees(1), + AngleSingle::Degrees(-FLOAT_INFINITY), + AngleSingle::Degrees(1)); + EXPECT_FLOAT_EQ(r.InDegrees(), 1) << "Clamp 1 -INFINITY 1"; + } +} + +// TEST(AngleSingle, Difference) { +// Angle r = 0; + +// r = AngleSingle::Difference(0, 90); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference 0 90"; + +// r = AngleSingle::Difference(0, -90); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 0 -90"; + +// r = AngleSingle::Difference(0, 270); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 0 270"; + +// r = AngleSingle::Difference(0, -270); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference 0 -270"; + +// r = AngleSingle::Difference(90, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), -90) << "Difference 90 0"; + +// r = AngleSingle::Difference(-90, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "Difference -90 0"; + +// r = AngleSingle::Difference(0, 0); +// EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Difference 0 0"; + +// r = AngleSingle::Difference(90, 90); +// EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "Difference 90 90"; + +// if (std::numeric_limits::is_iec559) { +// r = AngleSingle::Difference(0, INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), INFINITY) << "Difference 0 INFINITY"; + +// r = AngleSingle::Difference(0, -INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), -INFINITY) << "Difference 0 -INFINITY"; + +// r = AngleSingle::Difference(-INFINITY, INFINITY); +// EXPECT_FLOAT_EQ(r.InDegrees(), INFINITY) << "Difference -INFINITY +// INFINITY"; +// } +// } + +TEST(AngleSingle, MoveTowards) { + AngleSingle r = AngleSingle(); + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 30) << "MoveTowards 0 90 30"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), 90); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 90"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), 180); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 180"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), 270); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 270"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 90 -30"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(-90), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -30"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(-90), -90); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -90"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(-90), -180); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -180"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(-90), -270); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -270"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), 0); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 90 0"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), AngleSingle::Degrees(0), + 0); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 0 0"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), AngleSingle::Degrees(0), + 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 0 30"; + + if (std::numeric_limits::is_iec559) { + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(90), FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r.InDegrees(), 90) << "MoveTowards 0 90 FLOAT_INFINITY"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(FLOAT_INFINITY), 30); + EXPECT_FLOAT_EQ(r.InDegrees(), 30) << "MoveTowards 0 FLOAT_INFINITY 30"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(-90), -FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -90 -FLOAT_INFINITY"; + + r = AngleSingle::MoveTowards(AngleSingle::Degrees(0), + AngleSingle::Degrees(-FLOAT_INFINITY), -30); + EXPECT_FLOAT_EQ(r.InDegrees(), 0) << "MoveTowards 0 -FLOAT_INFINITY -30"; + } +} + +#endif \ No newline at end of file diff --git a/test/Angle_test.cc b/test/Angle_test.cc index 299e3c6..6cda76e 100644 --- a/test/Angle_test.cc +++ b/test/Angle_test.cc @@ -1,3 +1,4 @@ +/* #if GTEST #include @@ -219,4 +220,5 @@ TEST(Angle, MoveTowards) { } } -#endif \ No newline at end of file +#endif +*/ \ No newline at end of file diff --git a/test/DiscreteAngle_test.cc b/test/DiscreteAngle_test.cc index 373c74d..91a7cc8 100644 --- a/test/DiscreteAngle_test.cc +++ b/test/DiscreteAngle_test.cc @@ -1,3 +1,4 @@ +/* #if GTEST #include @@ -77,4 +78,5 @@ TEST(Angle16, Add) { EXPECT_FLOAT_EQ(r.InDegrees(), 0); } -#endif \ No newline at end of file +#endif +*/ \ No newline at end of file diff --git a/test/FloatSingle_test.cc b/test/FloatSingle_test.cc index 3083985..58e9d6d 100644 --- a/test/FloatSingle_test.cc +++ b/test/FloatSingle_test.cc @@ -9,33 +9,33 @@ #define FLOAT_INFINITY std::numeric_limits::infinity() TEST(FloatC, Clamp) { - float r = 0; + float r = 0; - r = Float::Clamp(1, 0, 2); - EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 0 2"; + r = Float::Clamp(1, 0, 2); + EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 0 2"; - r = Float::Clamp(-1, 0, 2); - EXPECT_FLOAT_EQ(r, 0) << "Clamp -1 0 2"; + r = Float::Clamp(-1, 0, 2); + EXPECT_FLOAT_EQ(r, 0) << "Clamp -1 0 2"; - r = Float::Clamp(3, 0, 2); - EXPECT_FLOAT_EQ(r, 2) << "Clamp 3 0 2"; + r = Float::Clamp(3, 0, 2); + EXPECT_FLOAT_EQ(r, 2) << "Clamp 3 0 2"; - r = Float::Clamp(1, 0, 0); - EXPECT_FLOAT_EQ(r, 0) << "Clamp 1 0 0"; + r = Float::Clamp(1, 0, 0); + EXPECT_FLOAT_EQ(r, 0) << "Clamp 1 0 0"; - r = Float::Clamp(0, 0, 0); - EXPECT_FLOAT_EQ(r, 0) << "Clamp 0 0 0"; + r = Float::Clamp(0, 0, 0); + EXPECT_FLOAT_EQ(r, 0) << "Clamp 0 0 0"; - r = Float::Clamp(0, 1, -1); - EXPECT_FLOAT_EQ(r, 1) << "Clamp 0 1 -1"; + r = Float::Clamp(0, 1, -1); + EXPECT_FLOAT_EQ(r, 1) << "Clamp 0 1 -1"; - if (std::numeric_limits::is_iec559) { - r = Float::Clamp(1, 0, FLOAT_INFINITY); - EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 0 INFINITY"; + if (std::numeric_limits::is_iec559) { + r = Float::Clamp(1, 0, FLOAT_INFINITY); + EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 0 INFINITY"; - r = Float::Clamp(1, -FLOAT_INFINITY, 1); - EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 -INFINITY 1"; - } + r = Float::Clamp(1, -FLOAT_INFINITY, 1); + EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 -INFINITY 1"; + } } #endif \ No newline at end of file diff --git a/test/Polar_test.cc b/test/Polar_test.cc index 9797969..a470593 100644 --- a/test/Polar_test.cc +++ b/test/Polar_test.cc @@ -62,7 +62,7 @@ TEST(Polar, FromSpherical) { p = Polar::FromSpherical(s); EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance FromSpherical(-1 0 0)"; - EXPECT_FLOAT_EQ(p.angle.InDegrees(), 180.0F) + EXPECT_FLOAT_EQ(p.angle.InDegrees(), -180.0F) << "p.angle FromSpherical(-1 0 0)"; s = Spherical(0, Angle::Degrees(0), Angle::Degrees(90)); diff --git a/test/Spherical_test.cc b/test/Spherical_test.cc index cd8dcad..69226de 100644 --- a/test/Spherical_test.cc +++ b/test/Spherical_test.cc @@ -71,7 +71,7 @@ TEST(Spherical, FromPolar) { s = Spherical::FromPolar(p); EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(-1 0)"; - EXPECT_FLOAT_EQ(s.direction.horizontal.InDegrees(), 180.0F) + EXPECT_FLOAT_EQ(s.direction.horizontal.InDegrees(), -180.0F) << "s.hor Polar(-1 0)"; EXPECT_FLOAT_EQ(s.direction.vertical.InDegrees(), 0.0F) << "s.vert Polar(-1 0)";