4 * Created on: Apr 23, 2012
8 #ifndef GEOMETRY_VECTOR2D_H_
9 #define GEOMETRY_VECTOR2D_H_
17 template<typename Scalar>
21 Vector2D(void) : x(), y() { };
22 Vector2D(Scalar x, Scalar y) : x(x), y(y) { };
25 Scalar X(void) const { return x; };
26 Scalar Y(void) const { return y; };
29 Scalar Dot(const Vector2D<Scalar> &o) const { return (X() * o.X()) + (Y() * o.Y()); };
30 Scalar LengthSquared(void) const { return Dot(*this); };
31 Scalar Length(void) const { return std::sqrt(LengthSquared()); };
34 Vector2D<Scalar> &Unify(void) {
35 if (LengthSquared() == Scalar()) return *this;
39 Vector2D<Scalar> Unit(void) const {
40 if (LengthSquared() == Scalar()) return *this;
41 return *this / Length();
43 Vector2D<Scalar> &Reflect(const Vector2D<Scalar> &normal);
44 Vector2D<Scalar> &Rotate90(void) {
45 return *this = Vector2D<Scalar>(-Y(), X());
47 Vector2D<Scalar> &Rotate(Scalar by) {
48 Scalar sine(std::sin(by)), cosine(std::cos(by));
49 return *this = Vector2D<Scalar>(X() * cosine - Y() * sine, X() * sine + y * cosine);
53 Vector2D<Scalar> &operator +=(const Vector2D<Scalar> &o) {
58 Vector2D<Scalar> &operator -=(const Vector2D<Scalar> &o) {
64 Vector2D<Scalar> &operator +=(T s) { x += s; y += s; return *this; };
66 Vector2D<Scalar> &operator -=(T s) { x -= s; y -= s; return *this; };
68 Vector2D<Scalar> &operator *=(T s) { x *= s; y *= s; return *this; };
70 Vector2D<Scalar> &operator /=(T s) { x /= s; y /= s; return *this; };
77 template<typename Scalar>
78 inline Vector2D<Scalar> &Vector2D<Scalar>::Reflect(const Vector2D<Scalar> &normal) {
79 Scalar doubleDot(2 * Dot(normal));
80 x -= doubleDot * normal.X();
81 y -= doubleDot * normal.Y();
86 template<typename Scalar>
87 inline bool operator ==(const Vector2D<Scalar> &lhs, const Vector2D<Scalar> &rhs) {
88 return lhs.X() == rhs.X() && lhs.Y() == rhs.Y();
91 template<typename Scalar>
92 inline bool operator !=(const Vector2D<Scalar> &lhs, const Vector2D<Scalar> &rhs) {
96 template<typename Scalar>
97 inline Vector2D<Scalar> operator +(const Vector2D<Scalar> &v) {
100 template<typename Scalar>
101 inline Vector2D<Scalar> operator -(const Vector2D<Scalar> &v) {
102 return Vector2D<Scalar>(-v.X(), -v.Y());
105 template<typename Scalar>
106 inline Vector2D<Scalar> operator +(const Vector2D<Scalar> &lhs, const Vector2D<Scalar> &rhs) {
107 Vector2D<Scalar> temp(lhs);
111 template<typename Scalar>
112 inline Vector2D<Scalar> operator -(const Vector2D<Scalar> &lhs, const Vector2D<Scalar> &rhs) {
113 Vector2D<Scalar> temp(lhs);
118 template<typename VScalar, typename SScalar>
119 inline Vector2D<VScalar> operator +(const Vector2D<VScalar> &v, SScalar s) {
120 Vector2D<VScalar> temp(v);
124 template<typename VScalar, typename SScalar>
125 inline Vector2D<VScalar> operator -(const Vector2D<VScalar> &v, SScalar s) {
126 Vector2D<VScalar> temp(v);
131 template<typename VScalar, typename SScalar>
132 inline Vector2D<VScalar> operator +(SScalar s, const Vector2D<VScalar> &v) {
133 Vector2D<VScalar> temp(v);
137 template<typename VScalar, typename SScalar>
138 inline Vector2D<VScalar> operator -(SScalar s, const Vector2D<VScalar> &v) {
139 Vector2D<VScalar> temp(v);
144 template<typename VScalar, typename SScalar>
145 inline Vector2D<VScalar> operator *(const Vector2D<VScalar> &v, SScalar s) {
146 Vector2D<VScalar> temp(v);
150 template<typename VScalar, typename SScalar>
151 inline Vector2D<VScalar> operator *(SScalar s, const Vector2D<VScalar> &v) {
152 Vector2D<VScalar> temp(v);
156 template<typename VScalar, typename SScalar>
157 inline Vector2D<VScalar> operator /(const Vector2D<VScalar> &v, SScalar s) {
158 Vector2D<VScalar> temp(v);
162 template<typename VScalar, typename SScalar>
163 inline Vector2D<VScalar> operator /(SScalar s, const Vector2D<VScalar> &v) {
164 Vector2D<VScalar> temp(v);
170 template<typename Scalar>
171 std::ostream &operator <<(std::ostream &out, const Vector2D<Scalar> &v) {
172 return out << '<' << v.X() << '|' << v.Y() << '>';
177 #endif /* GEOMETRY_VECTOR2D_H_ */