diff --git a/AngleAxis.cpp b/AngleAxis.cpp index 2ed8321..d7d7732 100644 --- a/AngleAxis.cpp +++ b/AngleAxis.cpp @@ -5,44 +5,47 @@ #include "AngleAxis.h" template -AngleAxis::AngleAxis() { - this->angle = AngleOf(); - this->axis = Direction(); +AngleAxisOf::AngleAxisOf() { + this->angle = 0.0F; + this->axis = DirectionOf(); } template -AngleAxis::AngleAxis(AngleOf angle, Direction axis) { +AngleAxisOf::AngleAxisOf(float angle, DirectionOf axis) { this->angle = angle; this->axis = axis; } template -AngleAxis::AngleAxis(float angle, Vector3 axis) { - this->angle = AngleOf(angle); - this->axis = Direction(axis); +AngleAxisOf::AngleAxisOf(float angle, Vector3 axis) { + this->angle = angle; + this->axis = DirectionOf(axis); } template -AngleAxis::AngleAxis(Quaternion q) { +AngleAxisOf::AngleAxisOf(Quaternion q) { float angle; Vector3 axis; q.ToAngleAxis(&angle, &axis); - this->angle = AngleOf(angle); - this->axis = Direction(axis); + this->angle = angle; + this->axis = DirectionOf(axis); } template -Quaternion AngleAxis::ToQuaternion() { +const AngleAxisOf AngleAxisOf::zero = + AngleAxisOf(0.0, DirectionOf(0, 0)); + +template +Quaternion AngleAxisOf::ToQuaternion() { Vector3 axisVector = this->axis.ToVector3(); - float angleFloat = this->angle.ToFloat(); - Quaternion q = Quaternion::AngleAxis(angleFloat, axisVector); + Quaternion q = Quaternion::AngleAxis(this->angle, axisVector); return q; } template -Direction AngleAxis::GetSwing() { +DirectionOf AngleAxisOf::GetSwing() { return this->axis; } -template class AngleAxis; -template class AngleAxis; +template class AngleAxisOf; +template class AngleAxisOf; diff --git a/AngleAxis.h b/AngleAxis.h index fbd0ec2..821e774 100644 --- a/AngleAxis.h +++ b/AngleAxis.h @@ -12,22 +12,30 @@ namespace Passer { namespace LinearAlgebra { -template -class AngleAxis { - public: - AngleOf angle; - Direction axis; +// Isn't this the same as SphericalOf ????????????? - AngleAxis(); - AngleAxis(AngleOf angle, Direction axis); - AngleAxis(Quaternion q); - AngleAxis(float angle, Vector3 axis); +template +class AngleAxisOf { + public: + float angle; + DirectionOf axis; + + AngleAxisOf(); + AngleAxisOf(float angle, DirectionOf axis); + AngleAxisOf(Quaternion q); + AngleAxisOf(float angle, Vector3 axis); + + const static AngleAxisOf zero; Quaternion ToQuaternion(); - Direction GetSwing(); + DirectionOf GetSwing(); }; +using AngleAxisSingle = AngleAxisOf; +using AngleAxis16 = AngleAxisOf; +using AngleAxis = AngleAxisOf; + } // namespace LinearAlgebra } // namespace Passer using namespace Passer::LinearAlgebra; diff --git a/Direction.cpp b/Direction.cpp index f17f271..dac8e50 100644 --- a/Direction.cpp +++ b/Direction.cpp @@ -10,45 +10,61 @@ #include template -Direction::Direction() { - this->horizontalAngle = AngleOf(0.0f); - this->verticalAngle = AngleOf(0.0f); +DirectionOf::DirectionOf() { + this->horizontal = AngleOf(0.0f); + this->vertical = AngleOf(0.0f); } template -Direction::Direction(AngleOf horizontal, AngleOf vertical) { - this->horizontalAngle = horizontal; - this->verticalAngle = vertical; +DirectionOf::DirectionOf(AngleOf horizontal, AngleOf vertical) { + this->horizontal = horizontal; + this->vertical = vertical; }; template -Direction::Direction(Vector3 v) { - this->horizontalAngle = +DirectionOf::DirectionOf(Vector3 v) { + this->horizontal = atan2f(v.Right(), v.Forward()) * Passer::LinearAlgebra::Rad2Deg; - this->verticalAngle = 90 - acosf(v.Up()) * Passer::LinearAlgebra::Rad2Deg; + this->vertical = 90 - acosf(v.Up()) * Passer::LinearAlgebra::Rad2Deg; } template -const Direction Direction::forward = Direction(0.0f, 0.0f); +const DirectionOf DirectionOf::forward = DirectionOf(0.0f, 0.0f); template -const Direction Direction::back = Direction(180.0f, 0.0f); +const DirectionOf DirectionOf::back = DirectionOf(180.0f, 0.0f); template -const Direction Direction::up = Direction(0.0f, 90.0f); +const DirectionOf DirectionOf::up = DirectionOf(0.0f, 90.0f); template -const Direction Direction::down = Direction(0.0f, -90.0f); +const DirectionOf DirectionOf::down = DirectionOf(0.0f, -90.0f); template -const Direction Direction::left = Direction(-90.0f, 0.0f); +const DirectionOf DirectionOf::left = DirectionOf(-90.0f, 0.0f); template -const Direction Direction::right = Direction(90.0f, 0.0f); +const DirectionOf DirectionOf::right = DirectionOf(90.0f, 0.0f); template -Vector3 Direction::ToVector3() { - Vector3 v = Quaternion::Euler(-(this->verticalAngle.ToFloat()), - this->horizontalAngle.ToFloat(), 0) * +DirectionOf Passer::LinearAlgebra::DirectionOf::operator+( + const DirectionOf& v) const { + DirectionOf r = DirectionOf(this->horizontal + v.horizontal, + this->vertical + v.vertical); + return r; +} + +template +DirectionOf Passer::LinearAlgebra::DirectionOf::operator+=( + const DirectionOf& v) { + this->horizontal += v.horizontal; + this->vertical += v.vertical; + return *this; +} + +template +Vector3 DirectionOf::ToVector3() { + Vector3 v = Quaternion::Euler(-(this->vertical.InDegrees()), + this->horizontal.InDegrees(), 0) * Vector3::forward; return v; } -template class Direction; -template class Direction; -template class Direction; \ No newline at end of file +template class DirectionOf; +template class DirectionOf; +template class DirectionOf; \ No newline at end of file diff --git a/Direction.h b/Direction.h index 6978b0a..348f4d7 100644 --- a/Direction.h +++ b/Direction.h @@ -13,25 +13,32 @@ namespace LinearAlgebra { struct Vector3; template -class Direction { +class DirectionOf { public: - AngleOf horizontalAngle; - AngleOf verticalAngle; + AngleOf horizontal; + AngleOf vertical; - Direction(); - Direction(AngleOf horizontal, AngleOf vertical); - Direction(Vector3 v); + DirectionOf(); + DirectionOf(AngleOf horizontal, AngleOf vertical); + DirectionOf(Vector3 v); - const static Direction forward; - const static Direction back; - const static Direction up; - const static Direction down; - const static Direction left; - const static Direction right; + const static DirectionOf forward; + const static DirectionOf back; + const static DirectionOf up; + const static DirectionOf down; + const static DirectionOf left; + const static DirectionOf right; + + DirectionOf operator+(const DirectionOf& v) const; + DirectionOf operator+=(const DirectionOf& v); Vector3 ToVector3(); }; +using DirectionSingle = DirectionOf; +using Direction16 = DirectionOf; +using Direction = DirectionOf; + } // namespace LinearAlgebra } // namespace Passer using namespace Passer::LinearAlgebra;