170 lines
4 KiB
C
170 lines
4 KiB
C
|
/*
|
||
|
* Aurora: https://github.com/pixelmatix/aurora
|
||
|
* Copyright (c) 2014 Jason Coon
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||
|
* this software and associated documentation files (the "Software"), to deal in
|
||
|
* the Software without restriction, including without limitation the rights to
|
||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||
|
* subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be included in all
|
||
|
* copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
#ifndef Vector_H
|
||
|
#define Vector_H
|
||
|
|
||
|
template <class T>
|
||
|
class Vector2 {
|
||
|
public:
|
||
|
T x, y;
|
||
|
|
||
|
Vector2() :x(0), y(0) {}
|
||
|
Vector2(T x, T y) : x(x), y(y) {}
|
||
|
Vector2(const Vector2& v) : x(v.x), y(v.y) {}
|
||
|
|
||
|
Vector2& operator=(const Vector2& v) {
|
||
|
x = v.x;
|
||
|
y = v.y;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
bool isEmpty() {
|
||
|
return x == 0 && y == 0;
|
||
|
}
|
||
|
|
||
|
bool operator==(Vector2& v) {
|
||
|
return x == v.x && y == v.y;
|
||
|
}
|
||
|
|
||
|
bool operator!=(Vector2& v) {
|
||
|
return !(x == y);
|
||
|
}
|
||
|
|
||
|
Vector2 operator+(Vector2& v) {
|
||
|
return Vector2(x + v.x, y + v.y);
|
||
|
}
|
||
|
Vector2 operator-(Vector2& v) {
|
||
|
return Vector2(x - v.x, y - v.y);
|
||
|
}
|
||
|
|
||
|
Vector2& operator+=(Vector2& v) {
|
||
|
x += v.x;
|
||
|
y += v.y;
|
||
|
return *this;
|
||
|
}
|
||
|
Vector2& operator-=(Vector2& v) {
|
||
|
x -= v.x;
|
||
|
y -= v.y;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
Vector2 operator+(double s) {
|
||
|
return Vector2(x + s, y + s);
|
||
|
}
|
||
|
Vector2 operator-(double s) {
|
||
|
return Vector2(x - s, y - s);
|
||
|
}
|
||
|
Vector2 operator*(double s) {
|
||
|
return Vector2(x * s, y * s);
|
||
|
}
|
||
|
Vector2 operator/(double s) {
|
||
|
return Vector2(x / s, y / s);
|
||
|
}
|
||
|
|
||
|
Vector2& operator+=(double s) {
|
||
|
x += s;
|
||
|
y += s;
|
||
|
return *this;
|
||
|
}
|
||
|
Vector2& operator-=(double s) {
|
||
|
x -= s;
|
||
|
y -= s;
|
||
|
return *this;
|
||
|
}
|
||
|
Vector2& operator*=(double s) {
|
||
|
x *= s;
|
||
|
y *= s;
|
||
|
return *this;
|
||
|
}
|
||
|
Vector2& operator/=(double s) {
|
||
|
x /= s;
|
||
|
y /= s;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
void set(T x, T y) {
|
||
|
this->x = x;
|
||
|
this->y = y;
|
||
|
}
|
||
|
|
||
|
void rotate(double deg) {
|
||
|
double theta = deg / 180.0 * M_PI;
|
||
|
double c = cos(theta);
|
||
|
double s = sin(theta);
|
||
|
double tx = x * c - y * s;
|
||
|
double ty = x * s + y * c;
|
||
|
x = tx;
|
||
|
y = ty;
|
||
|
}
|
||
|
|
||
|
Vector2& normalize() {
|
||
|
if (length() == 0) return *this;
|
||
|
*this *= (1.0 / length());
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
float dist(Vector2 v) const {
|
||
|
Vector2 d(v.x - x, v.y - y);
|
||
|
return d.length();
|
||
|
}
|
||
|
float length() const {
|
||
|
return sqrt(x * x + y * y);
|
||
|
}
|
||
|
|
||
|
float mag() const {
|
||
|
return length();
|
||
|
}
|
||
|
|
||
|
float magSq() {
|
||
|
return (x * x + y * y);
|
||
|
}
|
||
|
|
||
|
void truncate(double length) {
|
||
|
double angle = atan2f(y, x);
|
||
|
x = length * cos(angle);
|
||
|
y = length * sin(angle);
|
||
|
}
|
||
|
|
||
|
Vector2 ortho() const {
|
||
|
return Vector2(y, -x);
|
||
|
}
|
||
|
|
||
|
static float dot(Vector2 v1, Vector2 v2) {
|
||
|
return v1.x * v2.x + v1.y * v2.y;
|
||
|
}
|
||
|
static float cross(Vector2 v1, Vector2 v2) {
|
||
|
return (v1.x * v2.y) - (v1.y * v2.x);
|
||
|
}
|
||
|
|
||
|
void limit(float max) {
|
||
|
if (magSq() > max*max) {
|
||
|
normalize();
|
||
|
*this *= max;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
typedef Vector2<float> PVector;
|
||
|
|
||
|
#endif
|