diff --git a/include/J3ML/LinearAlgebra/Vector2.h b/include/J3ML/LinearAlgebra/Vector2.h index e927afd..9d6d4a3 100644 --- a/include/J3ML/LinearAlgebra/Vector2.h +++ b/include/J3ML/LinearAlgebra/Vector2.h @@ -3,12 +3,12 @@ #include namespace LinearAlgebra { - // A 2D (x, y) ordered pair. + /// A 2D (x, y) ordered pair. class Vector2 { public: - // Default Constructor - Initializes values to zero + /// Default Constructor - Initializes values to zero Vector2(); - // Constructs a new Vector2 with the value (X, Y) + /// Constructs a new Vector2 with the value (X, Y) Vector2(float X, float Y); Vector2(const Vector2& rhs); // Copy Constructor //Vector2(Vector2&&) = default; // Move Constructor @@ -44,73 +44,88 @@ namespace LinearAlgebra { Vector2 Clamp(const Vector2& min, const Vector2& max) const; static Vector2 Clamp(const Vector2& min, const Vector2& middle, const Vector2& max); - // Returns the magnitude between the two vectors. + /// Returns the magnitude between the two vectors. float Distance(const Vector2& to) const; static float Distance(const Vector2& from, const Vector2& to); + float DistanceSq(const Vector2& to) const; + static float DistanceSq(const Vector2& from, const Vector2& to); + + float MinElement() const; + + float MaxElement() const; + float Length() const; static float Length(const Vector2& of); float LengthSquared() const; static float LengthSquared(const Vector2& of); - // Returns the length of the vector, which is sqrt(x^2 + y^2) + /// Returns the length of the vector, which is sqrt(x^2 + y^2) float Magnitude() const; static float Magnitude(const Vector2& of); - // Returns a float value equal to the magnitudes of the two vectors multiplied together and then multiplied by the cosine of the angle between them. - // For normalized vectors, dot returns 1 if they point in exactly the same direction, - // -1 if they point in completely opposite directions, and 0 if the vectors are perpendicular. + bool IsFinite() const; + static bool IsFinite(const Vector2& v); + + /// Returns a float value equal to the magnitudes of the two vectors multiplied together and then multiplied by the cosine of the angle between them. + /// For normalized vectors, dot returns 1 if they point in exactly the same direction, + /// -1 if they point in completely opposite directions, and 0 if the vectors are perpendicular. float Dot(const Vector2& rhs) const; static float Dot(const Vector2& lhs, const Vector2& rhs); - // Projects one vector onto another and returns the result. (IDK) + /// Projects one vector onto another and returns the result. (IDK) Vector2 Project(const Vector2& rhs) const; - // @see Project + /// @see Project static Vector2 Project(const Vector2& lhs, const Vector2& rhs); - // Returns a copy of this vector, resized to have a magnitude of 1, while preserving "direction" + /// Returns a copy of this vector, resized to have a magnitude of 1, while preserving "direction" Vector2 Normalize() const; static Vector2 Normalize(const Vector2& of); - // Linearly interpolates between two points. - // Interpolates between the points and b by the interpolant t. - // The parameter is (TODO: SHOULD BE!) clamped to the range[0, 1]. - // This is most commonly used to find a point some fraction of the wy along a line between two endpoints (eg. to move an object gradually between those points). + /// Linearly interpolates between two points. + /// Interpolates between the points and b by the interpolant t. + /// The parameter is (TODO: SHOULD BE!) clamped to the range[0, 1]. + /// This is most commonly used to find a point some fraction of the wy along a line between two endpoints (eg. to move an object gradually between those points). Vector2 Lerp(const Vector2& rhs, float alpha) const; - // @see Lerp + /// @see Lerp static Vector2 Lerp(const Vector2& lhs, const Vector2& rhs, float alpha); - // Note: Input vectors MUST be normalized first! + /// Note: Input vectors MUST be normalized first! float AngleBetween(const Vector2& rhs) const; static float AngleBetween(const Vector2& lhs, const Vector2& rhs); - // Adds two vectors. + /// Adds two vectors. Vector2 operator +(const Vector2& rhs) const; Vector2 Add(const Vector2& rhs) const; static Vector2 Add(const Vector2& lhs, const Vector2& rhs); - // Subtracts two vectors. + /// Subtracts two vectors. Vector2 operator -(const Vector2& rhs) const; Vector2 Sub(const Vector2& rhs) const; static Vector2 Sub(const Vector2& lhs, const Vector2& rhs); - // Multiplies this vector by a scalar value. + /// Multiplies this vector by a scalar value. Vector2 operator *(float rhs) const; Vector2 Mul(float scalar) const; static Vector2 Mul(const Vector2& lhs, float rhs); - // Divides this vector by a scalar. + /// Multiplies this vector by a vector, element-wise + /// @note Mathematically, the multiplication of two vectors is not defined in linear space structures, + /// but this function is provided here for syntactical convenience. + Vector2 Mul(const Vector2& v) const + { + return {this->x*v.x, this->y*v.y}; + } + + /// Divides this vector by a scalar. Vector2 operator /(float rhs) const; Vector2 Div(float scalar) const; static Vector2 Div(const Vector2& lhs, float rhs); - // Unary operator + + /// Unary operator + Vector2 operator +() const; // TODO: Implement Vector2 operator -() const; - // Assigns a vector to another - - - + /// Assigns a vector to another Vector2& operator+=(const Vector2& rhs); // Adds a vector to this vector, in-place. Vector2& operator-=(const Vector2& rhs); // Subtracts a vector from this vector, in-place Vector2& operator*=(float scalar); diff --git a/src/J3ML/LinearAlgebra/Vector2.cpp b/src/J3ML/LinearAlgebra/Vector2.cpp index f401f0d..c2ae8ca 100644 --- a/src/J3ML/LinearAlgebra/Vector2.cpp +++ b/src/J3ML/LinearAlgebra/Vector2.cpp @@ -231,5 +231,17 @@ namespace LinearAlgebra { return *this / scalar; } + bool Vector2::IsFinite(const Vector2 &v) { + return v.IsFinite(); + } + + float Vector2::MinElement() const { + return std::min(x, y); + } + + float Vector2::MaxElement() const { + return std::max(x, y); + } + } \ No newline at end of file