#include "Vector2.h"
#include
float min(float f1, float f2)
{
return (f1 < f2) ? f1 : f2;
}
float max(float f1, float f2)
{
return (f1 > f2) ? f1 : f2;
}
float clamp(float value, float minimum, float maximum)
{
return max(minimum, min(maximum, value));
}
float lerp(float value1, float value2, float amount)
{
return value1 + ((value2 - value1) * amount );
}
Vector2 Vector2::Zero(0.0f, 0.0f);
Vector2 Vector2::One(1.0f, 1.0f);
Vector2 Vector2::UnitX(1.0f, 0.0f);
Vector2 Vector2::UnitY(0.0f, 1.0f);
Vector2::Vector2(float x, float y)
: X(x)
, Y(y)
{}
Vector2::Vector2(float value)
: X(value)
, Y(value)
{}
Vector2::Vector2()
: X(0)
, Y(0)
{}
float Vector2::Length()
{
return sqrt(LengthSquared());
}
float Vector2::LengthSquared()
{
return (X * X) + (Y * Y);
}
/*static*/ float Vector2::Distance(const Vector2& value1, const Vector2& value2)
{
return Vector2(value1 - value2).Length();
}
/*static*/ float Vector2::DistanceSquared(const Vector2& value1, const Vector2& value2)
{
return Vector2(value1 - value2).LengthSquared();
}
/*static*/ float Vector2::Dot(const Vector2& value1, const Vector2& value2)
{
return ((value1.X * value2.X) + (value1.Y * value2.Y));
}
void Vector2::Normalize()
{
float len = Length();
if( len < 1e-7f )
{
if( Y > X )
*this = UnitY;
else
*this = UnitX;
}
else
{
*this = *this / len;
}
}
/*static*/ Vector2 Vector2::Normalize(const Vector2& value)
{
Vector2 retVal(value);
retVal.Normalize();
return retVal;
}
/*static*/ Vector2 Vector2::Reflect(const Vector2& vector, const Vector2& normal)
{
return vector - (normal * 2.0f * Dot(vector, normal));
}
/*static*/ Vector2 Vector2::Min(const Vector2& value1, const Vector2& value2)
{
return Vector2(min(value1.X, value2.X), min(value1.Y, value2.Y));
}
/*static*/ Vector2 Vector2::Max(const Vector2& value1, const Vector2& value2)
{
return Vector2(max(value1.X, value2.X), max(value1.Y, value2.Y));
}
/*static*/ Vector2 Vector2::Clamp(const Vector2& value, const Vector2& min, const Vector2& max)
{
return Vector2(clamp(value.X, min.X, max.X), clamp(value.Y, min.Y, max.Y));
}
/*static*/ Vector2 Vector2::Lerp(const Vector2& value1, const Vector2& value2, float amount)
{
return Vector2(lerp( value1.X, value2.X, amount ), lerp( value1.Y, value2.Y, amount ) );
}
/*static*/ Vector2 Vector2::Negate(const Vector2& value)
{
return -value;
}
/*static*/ Vector2 Vector2::Rotate(const Vector2& value, const float radians)
{
float c = cos(radians);
float s = sin(radians);
return Vector2(value.X*c-value.Y*s,value.Y*c+value.X*s);
}
bool Vector2::operator==(const Vector2 &v) const
{
return X == v.X && Y == v.Y;
}
bool Vector2::operator!=(const Vector2 &v) const
{
return !(*this == v);
}
Vector2 Vector2::operator-() const
{
return Vector2::Zero - *this;
}
Vector2 Vector2::operator-(const Vector2 &v) const
{
return Vector2(X - v.X, Y - v.Y);
}
Vector2 Vector2::operator+(const Vector2 &v) const
{
return Vector2(X + v.X, Y + v.Y);
}
Vector2 Vector2::operator/(float divider) const
{
return Vector2(X / divider, Y / divider);
}
Vector2 Vector2::operator*(float scaleFactor) const
{
return Vector2(X * scaleFactor, Y * scaleFactor);
}
Vector2& Vector2::operator+=(const Vector2 &v)
{
X += v.X;
Y += v.Y;
return *this;
}
Vector2& Vector2::operator-=(const Vector2 &v)
{
X -= v.X;
Y -= v.Y;
return *this;
}
Vector2& Vector2::operator*=(float scaleFactor)
{
X *= scaleFactor;
Y *= scaleFactor;
return *this;
}
Vector2& Vector2::operator/=(float scaleFactor)
{
X /= scaleFactor;
Y /= scaleFactor;
return *this;
}