diff --git a/include/Angle.h b/include/Angle.h index 29f84f1..0220b40 100644 --- a/include/Angle.h +++ b/include/Angle.h @@ -6,11 +6,14 @@ #define ANGLE_H class Angle { -public: - static float Normalize(float angle); - static float Clamp(float angle, float min, float max); - static float Difference(float a, float b); - static float MoveTowards(float fromAngle, float toAngle, float maxAngle); + public: + const static float Rad2Deg; + const static float Deg2Rad; + + static float Normalize(float angle); + static float Clamp(float angle, float min, float max); + static float Difference(float a, float b); + static float MoveTowards(float fromAngle, float toAngle, float maxAngle); }; #endif \ No newline at end of file diff --git a/include/Vector2.h b/include/Vector2.h index e9bd353..cc835dd 100644 --- a/include/Vector2.h +++ b/include/Vector2.h @@ -6,22 +6,22 @@ #define VECTOR2_H extern "C" { - /// - /// 2-dimensional Vector representation - /// - /// This is a C-style implementation - /// This uses the right-handed coordinate system. - typedef struct Vec2 { - /// - /// The right axis of the vector - /// - float x; - /// - /// The upward/forward axis of the vector - /// - float y; +/// +/// 2-dimensional Vector representation +/// +/// This is a C-style implementation +/// This uses the right-handed coordinate system. +typedef struct Vec2 { + /// + /// The right axis of the vector + /// + float x; + /// + /// The upward/forward axis of the vector + /// + float y; - } Vec2; +} Vec2; } /// @@ -29,195 +29,203 @@ extern "C" { /// /// This uses the right-handed coordinate system. struct Vector2 : Vec2 { -public: - /// - /// Create a new 2-dimensinal zero vector - /// - Vector2(); - /// - /// Create a new 2-dimensional vector - /// - /// x axis value - /// y axis value - Vector2(float x, float y); - /// - /// Create a vector from C-style Vec2 - /// - /// The C-style Vec - Vector2(Vec2 v); + public: + /// + /// Create a new 2-dimensinal zero vector + /// + Vector2(); + /// + /// Create a new 2-dimensional vector + /// + /// x axis value + /// y axis value + Vector2(float x, float y); + /// + /// Create a vector from C-style Vec2 + /// + /// The C-style Vec + Vector2(Vec2 v); - ~Vector2(); + ~Vector2(); - /// - /// A vector with zero for all axis - /// - const static Vector2 zero; - /// - /// A vector with values (1, 0) - /// - const static Vector2 right; - /// - /// A vector3 with values (-1, 0) - /// - const static Vector2 left; - /// - /// A vector with values (0, 1) - /// - const static Vector2 up; - /// - /// A vector with values (0, -1) - /// - const static Vector2 down; - /// - /// A vector with values (0, 1) - /// - const static Vector2 forward; - /// - /// A vector with values (0, -1) - /// - const static Vector2 back; + /// + /// A vector with zero for all axis + /// + const static Vector2 zero; + /// + /// A vector with values (1, 0) + /// + const static Vector2 right; + /// + /// A vector3 with values (-1, 0) + /// + const static Vector2 left; + /// + /// A vector with values (0, 1) + /// + const static Vector2 up; + /// + /// A vector with values (0, -1) + /// + const static Vector2 down; + /// + /// A vector with values (0, 1) + /// + const static Vector2 forward; + /// + /// A vector with values (0, -1) + /// + const static Vector2 back; - /// - /// The length of a vector - /// - /// The vector for which you need the length - /// The length of the given vector - static float Magnitude(const Vector2& vector); - /// - /// The length of this vector - /// - /// The length of this vector - float magnitude() const; - /// - /// The squared length of a vector - /// - /// The vector for which you need the squared length - /// The squatred length - /// The squared length is computationally simpler than the real length. - /// Think of Pythagoras A^2 + B^2 = C^2. - /// This leaves out the calculation of the squared root of C. - static float SqrMagnitude(const Vector2& vector); - /// - /// The squared length of this vector - /// - /// The squared length - /// The squared length is computationally simpler than the real length. - /// Think of Pythagoras A^2 + B^2 = C^2. - /// This leaves out the calculation of the squared root of C. - float sqrMagnitude() const; - /// - /// Connvert a vector to a length of 1 - /// - /// The vector to convert - /// The vector with length 1 - static Vector2 Normalize(Vector2 vector); - /// - /// Convert the vector to a length of a - /// - /// The vector with length 1 - Vector2 normalized() const; + /// + /// The length of a vector + /// + /// The vector for which you need the length + /// The length of the given vector + static float Magnitude(const Vector2& vector); + /// + /// The length of this vector + /// + /// The length of this vector + float magnitude() const; + /// + /// The squared length of a vector + /// + /// The vector for which you need the squared + /// length The squatred length The squared length + /// is computationally simpler than the real length. Think of Pythagoras A^2 + + /// B^2 = C^2. This leaves out the calculation of the squared root of C. + static float SqrMagnitude(const Vector2& vector); + /// + /// The squared length of this vector + /// + /// The squared length + /// The squared length is computationally simpler than the real length. + /// Think of Pythagoras A^2 + B^2 = C^2. + /// This leaves out the calculation of the squared root of C. + float sqrMagnitude() const; + /// + /// Connvert a vector to a length of 1 + /// + /// The vector to convert + /// The vector with length 1 + static Vector2 Normalize(Vector2 vector); + /// + /// Convert the vector to a length of a + /// + /// The vector with length 1 + Vector2 normalized() const; - /// - /// Negate the vector - /// - /// The negated vector - /// This will result in a vector pointing in the opposite direction - Vector2 operator -(); - /// - /// Subtract a vector from this vector - /// - /// The vector to subtract from this vector - /// The result of the subtraction - Vector2 operator -(const Vector2& vector) const; + /// + /// Negate the vector + /// + /// The negated vector + /// This will result in a vector pointing in the opposite direction + Vector2 operator-(); + /// + /// Subtract a vector from this vector + /// + /// The vector to subtract from this vector + /// The result of the subtraction + Vector2 operator-(const Vector2& vector) const; - /// - /// Add another vector to this vector - /// - /// The vector to add - /// The result of adding the vector - Vector2 operator +(const Vector2& vector2) const; + /// + /// Add another vector to this vector + /// + /// The vector to add + /// The result of adding the vector + Vector2 operator+(const Vector2& vector2) const; - /// - /// Scale a vector using another vector - /// - /// The vector to scale - /// A vector with scaling factors - /// The scaled vector - /// Each component of the vector v1 will be multiplied with the - /// component from the scaling vector v2. - static Vector2 Scale(const Vector2& vector1, const Vector2& vector2); - /// - /// Scale a vector uniformly up - /// - /// The scaling factor - /// The scaled vector - /// Each component of the vector will be multipled with the same factor. - Vector2 operator *(float factor) const; - /// - /// Scale a vector uniformy down - /// - /// The scaling factor - /// The scaled vector - /// Each componet of the vector will be divided by the same factor. - Vector2 operator /(const float& factor); + /// + /// Scale a vector using another vector + /// + /// The vector to scale + /// A vector with scaling factors + /// The scaled vector + /// Each component of the vector v1 will be multiplied with the + /// component from the scaling vector v2. + static Vector2 Scale(const Vector2& vector1, const Vector2& vector2); + /// + /// Scale a vector uniformly up + /// + /// The scaling factor + /// The scaled vector + /// Each component of the vector will be multipled with the same factor. + Vector2 operator*(float factor) const; + /// + /// Scale a vector uniformy down + /// + /// The scaling factor + /// The scaled vector + /// Each componet of the vector will be divided by the same factor. + Vector2 operator/(const float& factor); - /// - /// The dot product of two vectors - /// - /// The first vector - /// The second vector - /// The dot product of the two vectors - static float Dot(const Vector2& vector1, const Vector2& vector2); + /// + /// The dot product of two vectors + /// + /// The first vector + /// The second vector + /// The dot product of the two vectors + static float Dot(const Vector2& vector1, const Vector2& vector2); - /// - /// Check is this vector is equal to the given vector - /// - /// The vector to check against - /// True if it is identical to the given vector - /// Note this uses float comparison to check equality which - /// may have strange effects. Equality on float should be avoided. - bool operator ==(const Vector2& vector); + /// + /// Check is this vector is equal to the given vector + /// + /// The vector to check against + /// True if it is identical to the given vector + /// Note this uses float comparison to check equality which + /// may have strange effects. Equality on float should be avoided. + bool operator==(const Vector2& vector); - /// - /// The distance between two vectors - /// - /// The first vector - /// The second vectors - /// The distance between the two vectors - static float Distance(const Vector2& vector1, const Vector2& vector2); + /// + /// The distance between two vectors + /// + /// The first vector + /// The second vectors + /// The distance between the two vectors + static float Distance(const Vector2& vector1, const Vector2& vector2); - /// - /// Calculate the angle between two vectors - /// - /// The first vector - /// The second vector - /// - /// This reterns an unsigned angle which is the shortest distance - /// between the two vectors. Use Vector3::SignedAngle if a - /// signed angle is needed. - static float Angle(Vector2 vector1, Vector2 vector2); + /// + /// Calculate the angle between two vectors + /// + /// The first vector + /// The second vector + /// The angle + /// This reterns an unsigned angle which is the shortest distance + /// between the two vectors. Use Vector3::SignedAngle if a + /// signed angle is needed. + static float Angle(Vector2 vector1, Vector2 vector2); - /// - /// Calculate the angle between two vectors rotation around an axis. - /// - /// The starting vector - /// The ending vector - /// The axis to rotate around - /// The signed angle - static float SignedAngle(Vector2 from, Vector2 to); + /// + /// Calculate the angle between two vectors rotation around an axis. + /// + /// The starting vector + /// The ending vector + /// The axis to rotate around + /// The signed angle + static float SignedAngle(Vector2 from, Vector2 to); - /// - /// Lerp between two vectors - /// - /// The from vector - /// The to vector - /// The interpolation distance (0..1) - /// The lerped vector - /// The factor f is unclamped. Value 0 matches the *from* vector, Value 1 matches the *to* vector - /// Value -1 is *from* vector minus the difference between *from* and *to* etc. - static Vector2 Lerp(Vector2 from, Vector2 to, float f); + /// + /// Rotate the vector + /// + /// The vector to rotate + /// Angle in radias to rotate + /// The rotated vector + static Vector2 Rotate(Vector2 v, float angle); - static float ToFactor(Vector2 a, Vector2 b); + /// + /// Lerp between two vectors + /// + /// The from vector + /// The to vector + /// The interpolation distance (0..1) + /// The lerped vector + /// The factor f is unclamped. Value 0 matches the *from* vector, Value 1 + /// matches the *to* vector Value -1 is *from* vector minus the difference + /// between *from* and *to* etc. + static Vector2 Lerp(Vector2 from, Vector2 to, float f); + + static float ToFactor(Vector2 a, Vector2 b); }; #endif \ No newline at end of file diff --git a/src/Angle.cpp b/src/Angle.cpp index e2747d5..4f68d3f 100644 --- a/src/Angle.cpp +++ b/src/Angle.cpp @@ -2,33 +2,38 @@ // 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 "Angle.h" +#include #include "FloatSingle.h" -float Angle::Normalize(float angle) { - if (!isfinite(angle)) - return angle; +const float Angle::Rad2Deg = 57.29578F; +const float Angle::Deg2Rad = 0.0174532924F; - while (angle <= -180) angle += 360; - while (angle > 180) angle -= 360; - return angle; +float Angle::Normalize(float angle) { + if (!isfinite(angle)) + return angle; + + while (angle <= -180) + angle += 360; + while (angle > 180) + 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 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 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 d; + float d = toAngle - fromAngle; + float sign = signbit(d) ? -1 : 1; + d = sign * Float::Clamp(fabs(d), 0, maxAngle); + return fromAngle + d; } diff --git a/src/Vector2.cpp b/src/Vector2.cpp index 3613cc2..c65c40d 100644 --- a/src/Vector2.cpp +++ b/src/Vector2.cpp @@ -2,30 +2,27 @@ // 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 "Vector2.h" - -const float Deg2Rad = 0.0174532924F; -const float Rad2Deg = 57.29578F; -const float epsilon = 1E-05f; +#include +#include "Angle.h" +#include "FloatSingle.h" Vector2::Vector2() { - x = 0; - y = 0; + x = 0; + y = 0; } Vector2::Vector2(float _x, float _y) { - x = _x; - y = _y; + x = _x; + y = _y; } Vector2::Vector2(Vec2 v) { - x = v.x; - y = v.y; + x = v.x; + y = v.y; } -Vector2::~Vector2() { -} +Vector2::~Vector2() {} const Vector2 Vector2::zero = Vector2(0, 0); const Vector2 Vector2::right = Vector2(1, 0); @@ -36,95 +33,107 @@ const Vector2 Vector2::forward = Vector2(0, 1); const Vector2 Vector2::back = Vector2(0, -1); float Vector2::Magnitude(const Vector2& a) { - return sqrtf(a.x * a.x + a.y * a.y); + return sqrtf(a.x * a.x + a.y * a.y); } float Vector2::magnitude() const { - return (float)sqrtf(x * x + y * y); + return (float)sqrtf(x * x + y * y); } float Vector2::SqrMagnitude(const Vector2& a) { - return a.x * a.x + a.y * a.y; + return a.x * a.x + a.y * a.y; } float Vector2::sqrMagnitude() const { - return(x * x + y * y); + return (x * x + y * y); } Vector2 Vector2::Normalize(Vector2 v) { - float num = Vector2::Magnitude(v); - Vector2 result = Vector2::zero; - if (num > epsilon) { - result = v / num; - } - return result; + float num = Vector2::Magnitude(v); + Vector2 result = Vector2::zero; + if (num > Float::epsilon) { + result = v / num; + } + return result; } Vector2 Vector2::normalized() const { - float num = this->magnitude(); - Vector2 result = Vector2::zero; - if (num > epsilon) { - result = ((Vector2)*this) / num; - } - return result; + float num = this->magnitude(); + Vector2 result = Vector2::zero; + if (num > Float::epsilon) { + result = ((Vector2) * this) / num; + } + return result; } -Vector2 Vector2::operator -(const Vector2& v2) const { - return Vector2(this->x - v2.x, this->y - v2.y); +Vector2 Vector2::operator-(const Vector2& v2) const { + return Vector2(this->x - v2.x, this->y - v2.y); } -Vector2 Vector2::operator -() { - return Vector2(-this->x, -this->y); +Vector2 Vector2::operator-() { + return Vector2(-this->x, -this->y); } -Vector2 Vector2::operator +(const Vector2& v2) const { - return Vector2(this->x + v2.x, this->y + v2.y); +Vector2 Vector2::operator+(const Vector2& v2) const { + return Vector2(this->x + v2.x, this->y + v2.y); } Vector2 Vector2::Scale(const Vector2& p1, const Vector2& p2) { - return Vector2(p1.x * p2.x, p1.y * p2.y); + return Vector2(p1.x * p2.x, p1.y * p2.y); } -Vector2 Vector2::operator *(float f) const { - return Vector2(this->x * f, this->y * f); +Vector2 Vector2::operator*(float f) const { + return Vector2(this->x * f, this->y * f); } Vector2 Vector2::operator/(const float& d) { - return Vector2(this->x / d, this->y / d); + return Vector2(this->x / d, this->y / d); } float Vector2::Dot(const Vector2& v1, const Vector2& v2) { - return v1.x * v2.x + v1.y * v2.y; + return v1.x * v2.x + v1.y * v2.y; } bool Vector2::operator==(const Vector2& v) { - return (this->x == v.x && this->y == v.y); + return (this->x == v.x && this->y == v.y); } float Vector2::Distance(const Vector2& p1, const Vector2& p2) { - return Magnitude(p1 - p2); + return Magnitude(p1 - p2); } float Vector2::Angle(Vector2 from, Vector2 to) { - return (float) fabs(SignedAngle(from, to)); + return (float)fabs(SignedAngle(from, to)); } float Vector2::SignedAngle(Vector2 from, Vector2 to) { - float sqrMagFrom = from.sqrMagnitude(); - float sqrMagTo = to.sqrMagnitude(); + float sqrMagFrom = from.sqrMagnitude(); + float sqrMagTo = to.sqrMagnitude(); - if (sqrMagFrom == 0 || sqrMagTo == 0) - return 0; - if (!isfinite(sqrMagFrom) || !isfinite(sqrMagTo)) - return nanf(""); + if (sqrMagFrom == 0 || sqrMagTo == 0) + return 0; + if (!isfinite(sqrMagFrom) || !isfinite(sqrMagTo)) + return nanf(""); - float angleFrom = atan2(from.y, from.x); - float angleTo = atan2(to.y, to.x); - return (angleTo - angleFrom) * Rad2Deg; + float angleFrom = atan2(from.y, from.x); + float angleTo = atan2(to.y, to.x); + return (angleTo - angleFrom) * Angle::Rad2Deg; +} + +Vector2 Rotate(Vector2 v, float angle) { + float sin = (float)sinf(angle * Angle::Deg2Rad); + float cos = (float)cosf(angle * Angle::Deg2Rad); + + float tx = v.x; + float ty = v.y; + v.x = (cos * tx) - (sin * ty); + v.y = (sin * tx) + (cos * ty); + return v; } Vector2 Vector2::Lerp(Vector2 from, Vector2 to, float f) { - Vector2 v = from + (to - from) * f; - return v; + Vector2 v = from + (to - from) * f; + return v; } float Vector2::ToFactor(Vector2 a, Vector2 b) { - return (1 - Vector2::Dot(a, b)) / 2; + return (1 - Vector2::Dot(a, b)) / 2; } + diff --git a/test/Vector2_test.cc b/test/Vector2_test.cc index 26a9324..e5f0391 100644 --- a/test/Vector2_test.cc +++ b/test/Vector2_test.cc @@ -420,7 +420,10 @@ TEST(Vector2, SignedAngle) { TEST(Vector2, DISABLED_Lerp) { } -TEST(Vector2, DIABLED_ToFactor) { +TEST(Vector2, DISABLED_ToFactor) { +} + +TEST(Vector2, DISABLED_Rotate) { } #endif \ No newline at end of file