// 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, 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 /// /// 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); /// /// 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); }; #endif