1
0
forked from josh/j3ml

Implement Vector2 functions

This commit is contained in:
2024-01-26 15:55:42 -05:00
parent 08974413ae
commit 79f6b2f154
2 changed files with 53 additions and 26 deletions

View File

@@ -3,12 +3,12 @@
#include <cstddef> #include <cstddef>
namespace LinearAlgebra { namespace LinearAlgebra {
// A 2D (x, y) ordered pair. /// A 2D (x, y) ordered pair.
class Vector2 { class Vector2 {
public: public:
// Default Constructor - Initializes values to zero /// Default Constructor - Initializes values to zero
Vector2(); 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(float X, float Y);
Vector2(const Vector2& rhs); // Copy Constructor Vector2(const Vector2& rhs); // Copy Constructor
//Vector2(Vector2&&) = default; // Move Constructor //Vector2(Vector2&&) = default; // Move Constructor
@@ -44,73 +44,88 @@ namespace LinearAlgebra {
Vector2 Clamp(const Vector2& min, const Vector2& max) const; Vector2 Clamp(const Vector2& min, const Vector2& max) const;
static Vector2 Clamp(const Vector2& min, const Vector2& middle, const Vector2& max); 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; float Distance(const Vector2& to) const;
static float Distance(const Vector2& from, const Vector2& to); 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; float Length() const;
static float Length(const Vector2& of); static float Length(const Vector2& of);
float LengthSquared() const; float LengthSquared() const;
static float LengthSquared(const Vector2& of); 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; float Magnitude() const;
static float Magnitude(const Vector2& of); 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. bool IsFinite() const;
// For normalized vectors, dot returns 1 if they point in exactly the same direction, static bool IsFinite(const Vector2& v);
// -1 if they point in completely opposite directions, and 0 if the vectors are perpendicular.
/// 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; float Dot(const Vector2& rhs) const;
static float Dot(const Vector2& lhs, const Vector2& rhs); 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; Vector2 Project(const Vector2& rhs) const;
// @see Project /// @see Project
static Vector2 Project(const Vector2& lhs, const Vector2& rhs); 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; Vector2 Normalize() const;
static Vector2 Normalize(const Vector2& of); static Vector2 Normalize(const Vector2& of);
// Linearly interpolates between two points. /// Linearly interpolates between two points.
// Interpolates between the points and b by the interpolant t. /// Interpolates between the points and b by the interpolant t.
// The parameter is (TODO: SHOULD BE!) clamped to the range[0, 1]. /// 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). /// 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; Vector2 Lerp(const Vector2& rhs, float alpha) const;
// @see Lerp /// @see Lerp
static Vector2 Lerp(const Vector2& lhs, const Vector2& rhs, float alpha); 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; float AngleBetween(const Vector2& rhs) const;
static float AngleBetween(const Vector2& lhs, const Vector2& rhs); static float AngleBetween(const Vector2& lhs, const Vector2& rhs);
// Adds two vectors. /// Adds two vectors.
Vector2 operator +(const Vector2& rhs) const; Vector2 operator +(const Vector2& rhs) const;
Vector2 Add(const Vector2& rhs) const; Vector2 Add(const Vector2& rhs) const;
static Vector2 Add(const Vector2& lhs, const Vector2& rhs); static Vector2 Add(const Vector2& lhs, const Vector2& rhs);
// Subtracts two vectors. /// Subtracts two vectors.
Vector2 operator -(const Vector2& rhs) const; Vector2 operator -(const Vector2& rhs) const;
Vector2 Sub(const Vector2& rhs) const; Vector2 Sub(const Vector2& rhs) const;
static Vector2 Sub(const Vector2& lhs, const Vector2& rhs); 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 operator *(float rhs) const;
Vector2 Mul(float scalar) const; Vector2 Mul(float scalar) const;
static Vector2 Mul(const Vector2& lhs, float rhs); 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 operator /(float rhs) const;
Vector2 Div(float scalar) const; Vector2 Div(float scalar) const;
static Vector2 Div(const Vector2& lhs, float rhs); static Vector2 Div(const Vector2& lhs, float rhs);
// Unary operator + /// Unary operator +
Vector2 operator +() const; // TODO: Implement Vector2 operator +() const; // TODO: Implement
Vector2 operator -() const; 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); // Adds a vector to this vector, in-place.
Vector2& operator-=(const Vector2& rhs); // Subtracts a vector from this vector, in-place Vector2& operator-=(const Vector2& rhs); // Subtracts a vector from this vector, in-place
Vector2& operator*=(float scalar); Vector2& operator*=(float scalar);

View File

@@ -231,5 +231,17 @@ namespace LinearAlgebra {
return *this / scalar; 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);
}
} }