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);
46 Vector2D<Scalar> &operator +=(const Vector2D<Scalar> &o) {
51 Vector2D<Scalar> &operator -=(const Vector2D<Scalar> &o) {
57 Vector2D<Scalar> &operator +=(T s) { x += s; y += s; return *this; };
59 Vector2D<Scalar> &operator -=(T s) { x -= s; y -= s; return *this; };
61 Vector2D<Scalar> &operator *=(T s) { x *= s; y *= s; return *this; };
63 Vector2D<Scalar> &operator /=(T s) { x /= s; y /= s; return *this; };
70 template<typename Scalar>
71 inline Vector2D<Scalar> &Vector2D<Scalar>::Reflect(const Vector2D<Scalar> &normal) {
72 Scalar doubleDot(2 * Dot(normal));
73 x -= doubleDot * normal.X();
74 y -= doubleDot * normal.Y();
79 template<typename Scalar>
80 inline Vector2D<Scalar> operator +(const Vector2D<Scalar> &v) {
83 template<typename Scalar>
84 inline Vector2D<Scalar> operator -(const Vector2D<Scalar> &v) {
85 return Vector2D<Scalar>(-v.X(), -v.Y());
88 template<typename Scalar>
89 inline Vector2D<Scalar> operator +(const Vector2D<Scalar> &lhs, const Vector2D<Scalar> &rhs) {
90 Vector2D<Scalar> temp(lhs);
94 template<typename Scalar>
95 inline Vector2D<Scalar> operator -(const Vector2D<Scalar> &lhs, const Vector2D<Scalar> &rhs) {
96 Vector2D<Scalar> temp(lhs);
101 template<typename VScalar, typename SScalar>
102 inline Vector2D<VScalar> operator +(const Vector2D<VScalar> &v, SScalar s) {
103 Vector2D<VScalar> temp(v);
107 template<typename VScalar, typename SScalar>
108 inline Vector2D<VScalar> operator -(const Vector2D<VScalar> &v, SScalar s) {
109 Vector2D<VScalar> temp(v);
114 template<typename VScalar, typename SScalar>
115 inline Vector2D<VScalar> operator +(SScalar s, const Vector2D<VScalar> &v) {
116 Vector2D<VScalar> temp(v);
120 template<typename VScalar, typename SScalar>
121 inline Vector2D<VScalar> operator -(SScalar s, const Vector2D<VScalar> &v) {
122 Vector2D<VScalar> temp(v);
127 template<typename VScalar, typename SScalar>
128 inline Vector2D<VScalar> operator *(const Vector2D<VScalar> &v, SScalar s) {
129 Vector2D<VScalar> temp(v);
133 template<typename VScalar, typename SScalar>
134 inline Vector2D<VScalar> operator *(SScalar s, const Vector2D<VScalar> &v) {
135 Vector2D<VScalar> temp(v);
139 template<typename VScalar, typename SScalar>
140 inline Vector2D<VScalar> operator /(const Vector2D<VScalar> &v, SScalar s) {
141 Vector2D<VScalar> temp(v);
145 template<typename VScalar, typename SScalar>
146 inline Vector2D<VScalar> operator /(SScalar s, const Vector2D<VScalar> &v) {
147 Vector2D<VScalar> temp(v);
153 template<typename Scalar>
154 std::ostream &operator <<(std::ostream &out, const Vector2D<Scalar> &v) {
155 return out << '<' << v.X() << '|' << v.Y() << '>';
160 #endif /* GEOMETRY_VECTOR2D_H_ */