Oxygine  1
2g game engine
Vector2.h
1 #pragma once
2 #include "oxygine-include.h"
3 #include "ScalarMath.h"
4 //#include "math/vector3.h"
5 
6 namespace oxygine
7 {
8  template <class T>
9  class VectorT2
10  {
11  typedef VectorT2<T> vector2;
12  public:
13  typedef T type;
15  VectorT2();
16  VectorT2(T, T);
17 
18  VectorT2& operator+=(const VectorT2&);
19  VectorT2& operator-=(const VectorT2&);
20 
21  VectorT2 operator + (const VectorT2&) const;
22  VectorT2 operator - (const VectorT2&) const;
23  VectorT2 operator - () const;
24 
25  void set(T x_, T y_) {x = x_; y = y_;}
26  void setZero() {x = 0; y = 0;}
27 
28  template <class R>
29  VectorT2 operator * (R s) const {VectorT2 r(*this); r.x = type(r.x * s); r.y = type(r.y * s); return r;}
30  template <class R>
31  VectorT2 operator / (R s) const {VectorT2 r(*this); r.x /= s; r.y /= s; return r;}
32 
33  template <class R>
34  VectorT2 operator *= (R s) {x *= s; y *= s; return (*this);}
35  template <class R>
36  VectorT2 operator /= (R s) {x /= s; y /= s; return (*this);}
37 
38  VectorT2 mult(const VectorT2& r) const {return VectorT2(x * r.x, y * r.y);}
39  VectorT2 div(const VectorT2& r) const {return VectorT2(x / r.x, y / r.y);}
40 
41  operator VectorT2<float> () const {return this->cast< VectorT2<float> >();}
42 
43  template<typename R>
44  R cast() const
45  {
46  typedef R vec2;
47  typedef typename R::type vec2type;
48  return vec2(vec2type(x), vec2type(y));
49  }
50 
51 
52  bool operator == (const VectorT2& r) const;
53  bool operator != (const VectorT2& r) const;
54 
55  //inline T &operator[](int i){return m[i];}
56  //inline const T &operator[](int i)const{return m[i];}
57 
58  T length() const {return (T)scalar::sqrt(x * x + y * y);}
59  T sqlength() const {return dot(*this);}
60 
61  void normalize() { normalize(*this, *this); }
62  void normalizeTo(T len) { normalize(); *this *= len; }
63  VectorT2 normalized() const {VectorT2 t = *this; t.normalize(); return t;}
64 
65  float distance(const VectorT2& v) const { return VectorT2(x - v.x, y - v.y).length();}
66  T dot(const VectorT2& vr) const {return dot(*this, vr);}
67 
68  static T dot(const VectorT2& v1, const VectorT2& v2);
69  static VectorT2& normalize(VectorT2& out, const VectorT2& v);
70 
71  struct
72  {
73  T x, y;
74  };
75  };
76 
77  /*
78  template<class T>
79  VectorT2<T>::operator VectorT2<float> ()const
80  {
81  return VectorT2<float>(float(x), float(y));
82  }
83  */
84 
85  template<class T>
86  bool VectorT2<T>::operator == (const VectorT2<T>& r) const
87  {
88  if (x == r.x && y == r.y)
89  return true;
90  return false;
91  }
92 
93  template<class T>
94  bool VectorT2<T>::operator != (const VectorT2<T>& r) const
95  {
96  if (x != r.x || y != r.y)
97  return true;
98  return false;
99  }
100 
101  template <class T>
102  VectorT2<T>::VectorT2(): x(0), y(0)
103  {}
104 
105  template <class T>
106  VectorT2<T>::VectorT2(T X, T Y):
107  x(X), y(Y)
108  {
109  }
110 
111  template <class T>
112  VectorT2<T>& VectorT2<T>::operator+=(const VectorT2& v)
113  {
114  x += v.x; y += v.y; return (*this);
115  }
116 
117  template <class T>
118  VectorT2<T>& VectorT2<T>::operator-=(const VectorT2& v)
119  {
120  x -= v.x; y -= v.y; return (*this);
121  }
122 
123  template <class T>
124  VectorT2<T> VectorT2<T>::operator + (const VectorT2& v) const
125  {
126  return VectorT2(x + v.x, y + v.y);
127  }
128 
129  template <class T>
130  VectorT2<T> VectorT2<T>::operator - (const VectorT2& v) const
131  {
132  return VectorT2(x - v.x, y - v.y);
133  }
134 
135  template <class T>
136  VectorT2<T> VectorT2<T>::operator - () const
137  {
138  return VectorT2<T>(-x, -y);
139  }
140 
141  template <class T>
142  inline T VectorT2<T>::dot(const VectorT2& v1, const VectorT2& v2)
143  {
144  return v1.x * v2.x + v1.y * v2.y;
145  }
146 
147  template <class T>
148  inline VectorT2<T>& VectorT2<T>::normalize(VectorT2<T>& out, const VectorT2<T>& v)
149  {
150  T norm = T(1.0) / scalar::sqrt(v.x * v.x + v.y * v.y);
151  out = v;
152  /*
153  if (norm < 0.0001)
154  {
155  return out;
156  }
157  */
158 
159  out.x *= norm;
160  out.y *= norm;
161  return out;
162  }
163 
164 
165  typedef VectorT2<float> Vector2;
166  typedef VectorT2<double> VectorD2;
167  typedef VectorT2<int> Point;
168  typedef VectorT2<short> PointS;
169 }
–oxgl-end–!
Definition: Actor.h:14
Definition: Vector2.h:9