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