diff --git a/Angle.cpp b/Angle.cpp index 7788047..4ad5113 100644 --- a/Angle.cpp +++ b/Angle.cpp @@ -208,12 +208,32 @@ AngleOf AngleOf::operator+(const AngleOf& a) const { return angle; } +template <> +AngleOf AngleOf::operator+=(const AngleOf& a) { + this->value += a.value; + this->Normalize(); + return *this; +} + template AngleOf AngleOf::operator+=(const AngleOf& a) { this->value += a.value; return *this; } +template +void AngleOf::Normalize() { + float angleValue = this->InDegrees(); + if (!isfinite(angleValue)) + return; + + while (angleValue <= -180) + angleValue += 360; + while (angleValue > 180) + angleValue -= 360; + *this = AngleOf::Degrees(angleValue); +} + template AngleOf AngleOf::Normalize(AngleOf angle) { float angleValue = angle.InDegrees(); diff --git a/Angle.h b/Angle.h index 90531ab..69e564b 100644 --- a/Angle.h +++ b/Angle.h @@ -51,6 +51,7 @@ class AngleOf { return AngleOf::Degrees((float)f * a.InDegrees()); } + void Normalize(); static AngleOf Normalize(AngleOf a); static AngleOf Clamp(AngleOf a, AngleOf min, AngleOf max); // static AngleOf Difference(AngleOf a, AngleOf b) { diff --git a/Direction.cpp b/Direction.cpp index 882ea32..c465b4a 100644 --- a/Direction.cpp +++ b/Direction.cpp @@ -22,18 +22,6 @@ DirectionOf::DirectionOf(AngleOf horizontal, AngleOf vertical) { Normalize(); }; -// template -// DirectionOf::DirectionOf(Vector3 v) { -// this->horizontal = AngleOf::Atan2( -// v.Right(), -// v.Forward()); // AngleOf::Radians(atan2f(v.Right(), v.Forward())); -// this->vertical = -// -AngleOf::deg90 - -// AngleOf::Acos( -// v.Up()); // AngleOf::Radians(-(0.5f * pi) - acosf(v.Up())); -// Normalize(); -// } - template const DirectionOf DirectionOf::forward = DirectionOf(AngleOf(), AngleOf()); diff --git a/SwingTwist.cpp b/SwingTwist.cpp index 459efee..1a24600 100644 --- a/SwingTwist.cpp +++ b/SwingTwist.cpp @@ -12,6 +12,16 @@ SwingTwistOf::SwingTwistOf() { template SwingTwistOf::SwingTwistOf(DirectionOf swing, AngleOf twist) { + // Normalize angles + AngleOf deg90 = AngleOf::Degrees(90); + AngleOf deg180 = AngleOf::Degrees(180); + + if (swing.vertical > deg90 || swing.vertical < -deg90) { + swing.horizontal += deg180; + swing.vertical = deg180 - swing.vertical; + twist += deg180; + } + this->swing = swing; this->twist = twist; } @@ -20,8 +30,16 @@ template SwingTwistOf::SwingTwistOf(AngleOf horizontal, AngleOf vertical, AngleOf twist) { - // this->horizontal = horizontal; - // this->vertical = vertical; + // Normalize angles + AngleOf deg90 = AngleOf::Degrees(90); + AngleOf deg180 = AngleOf::Degrees(180); + + if (vertical > deg90 || vertical < -deg90) { + horizontal += deg180; + vertical = deg180 - vertical; + twist += deg180; + } + this->swing = DirectionOf(horizontal, vertical); this->twist = twist; } @@ -30,9 +48,12 @@ template SwingTwistOf SwingTwistOf::Degrees(float horizontal, float vertical, float twist) { - DirectionOf swing = DirectionOf::Degrees(horizontal, vertical); - AngleOf twistAngle = AngleOf::Degrees(twist); - SwingTwistOf orientation = SwingTwistOf(swing, twistAngle); + SwingTwistOf orientation = SwingTwistOf(AngleOf::Degrees(horizontal), + AngleOf::Degrees(vertical), + AngleOf::Degrees(twist)); + // DirectionOf swing = DirectionOf::Degrees(horizontal, vertical); + // AngleOf twistAngle = AngleOf::Degrees(twist); + // SwingTwistOf orientation = SwingTwistOf(swing, twistAngle); return orientation; } @@ -49,7 +70,7 @@ SwingTwistOf SwingTwistOf::FromQuaternion(Quaternion q) { Vector3 angles = Quaternion::ToAngles(q); SwingTwistOf r = SwingTwistOf::Degrees(angles.Up(), angles.Right(), angles.Forward()); - + r.Normalize(); return r; } @@ -131,5 +152,17 @@ AngleOf SwingTwistOf::Angle(const SwingTwistOf& r1, return AngleOf::Degrees(angle); } +template +void SwingTwistOf::Normalize() { + AngleOf deg90 = AngleOf::Degrees(90); + AngleOf deg180 = AngleOf::Degrees(180); + + if (this->swing.vertical > deg90 || this->swing.vertical < -deg90) { + this->swing.horizontal += deg180; + this->swing.vertical = deg180 - this->swing.vertical; + this->twist += deg180; + } +} + template class SwingTwistOf; template class SwingTwistOf; \ No newline at end of file diff --git a/SwingTwist.h b/SwingTwist.h index 0558bbb..7fac16a 100644 --- a/SwingTwist.h +++ b/SwingTwist.h @@ -64,6 +64,8 @@ class SwingTwistOf { static SwingTwistOf AngleAxis(float angle, const DirectionOf& axis); static AngleOf Angle(const SwingTwistOf& r1, const SwingTwistOf& r2); + + void Normalize(); }; using SwingTwistSingle = SwingTwistOf; diff --git a/test/SwingTwistSingle_test.cc b/test/SwingTwistSingle_test.cc index 14f4b81..8885ae4 100644 --- a/test/SwingTwistSingle_test.cc +++ b/test/SwingTwistSingle_test.cc @@ -100,4 +100,32 @@ TEST(SwingTwistSingle, AngleAxis) { << "270 up"; } +TEST(SwingTwistSingle, Normalize) { + SwingTwistSingle s; + + s = SwingTwistSingle::Degrees(0, 0, 0); + EXPECT_EQ(s, SwingTwistSingle::Degrees(0, 0, 0)) << "0 0 0 Normalized"; + + s = SwingTwistSingle::Degrees(0, 180, 0); + EXPECT_EQ(s, SwingTwistSingle::Degrees(180, 0, 180)) << "0 180 0 Normalized"; + + s = SwingTwistSingle::Degrees(0, 180, 180); + EXPECT_EQ(s, SwingTwistSingle::Degrees(180, 0, 0)) << "0 180 180 Normalized"; + + s = SwingTwistSingle::Degrees(270, 90, 0); + EXPECT_EQ(s, SwingTwistSingle::Degrees(-90, 90, 0)) << "270 90 0 Normalized"; + + s = SwingTwistSingle::Degrees(270, 270, 0); + EXPECT_EQ(s, SwingTwistSingle::Degrees(-90, -90, 0)) + << "270 270 0 Normalized"; + + s = SwingTwistSingle::Degrees(270, 225, 0); + EXPECT_EQ(s, SwingTwistSingle::Degrees(90, -45, -180)) + << "270 225 0 Normalized"; + + s = SwingTwistSingle::Degrees(270, 0, 225); + EXPECT_EQ(s, SwingTwistSingle::Degrees(-90, 0, -135)) + << "270 0 225 Normalized"; +} + #endif \ No newline at end of file