// This Source Code Form is subject to the terms of the Mozilla Public // 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/. #ifndef VECTOR2_H #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; } Vec2; } /// /// A 2-dimensional vector /// /// 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); ~Vector2(); /// /// A vector with zero for all axis /// const static Vector2 zero; /// /// A vector with values (1, 1) /// const static Vector2 one; /// /// 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; /// /// 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; /// /// 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); /// /// 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); /// /// 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); /// /// Rotate the vector /// /// The vector to rotate /// Angle in radias to rotate /// The rotated vector static Vector2 Rotate(Vector2 v, float angle); /// /// 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