Implement Vector2 functions
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user