home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 4799 / source.7z / slVector2D.h < prev    next >
Encoding:
C/C++ Source or Header  |  2011-10-21  |  7.5 KB  |  314 lines

  1. #ifndef __SL_VECTOR_2D_H
  2. #define __SL_VECTOR_2D_H
  3.  
  4. #include "slMathTraits.h"
  5.  
  6. template<class T>
  7. class vector2D {
  8.  private :
  9.   T data[2];
  10.  public :
  11.   static vector2D<T> ZERO;
  12.   static vector2D<T> X, NEG_X;
  13.   static vector2D<T> Y, NEG_Y;
  14.  public :
  15.   T& operator [](int index);
  16.   const T& operator [](int index)const;
  17.  public :
  18.   vector2D<T>& operator  =(const vector2D<T>& v);
  19.   vector2D<T>& operator +=(const vector2D<T>& v);
  20.   vector2D<T>& operator -=(const vector2D<T>& v);
  21.   vector2D<T>& operator *=(T scalar);
  22.   vector2D<T>& operator /=(T scalar);
  23.  public :
  24.   vector2D<T> operator +(const vector2D<T>& v)const;
  25.   vector2D<T> operator -(const vector2D<T>& v)const;
  26.   vector2D<T> operator *(const vector2D<T>& v)const;
  27.   vector2D<T> operator /(const vector2D<T>& v)const;
  28.   vector2D<T> operator *(T scalar)const;
  29.   vector2D<T> operator /(T scalar)const;
  30.  public :
  31.   vector2D<T> operator +(void)const;
  32.   vector2D<T> operator -(void)const;
  33.  public :
  34.   bool operator ==(const vector2D<T>& v)const;
  35.   bool operator !=(const vector2D<T>& v)const;
  36.   bool operator !(void)const;
  37.  public :
  38.   const T* c_ptr(void)const;
  39.   T length(void)const;
  40.   T length_squared(void)const;
  41.   void normalize(void);
  42.  public :
  43.   T dot(const vector2D<T>& v)const;
  44.   T cross(const vector2D<T>& v)const;
  45.  public :
  46.   friend T abs(const vector2D<T>& v);
  47.   friend T dot_product(const vector2D<T>& v1, const vector2D<T>& v2);
  48.   friend T cross_product(const vector2D<T>& v1, const vector2D<T>& v2);
  49.   friend vector2D<T> min(const vector2D<T>& v1, const vector2D<T>& v2);
  50.   friend vector2D<T> max(const vector2D<T>& v1, const vector2D<T>& v2);
  51.  public :
  52.   friend vector2D<T> operator *(T scalar, const vector2D<T>& v);
  53.   friend std::ostream& operator <<(std::ostream& os, const vector2D<T>& v);
  54.  public :
  55.   vector2D();
  56.   vector2D(T x, T y);
  57.   explicit vector2D(T fill);
  58.   explicit vector2D(const T* v);
  59.   vector2D(const vector2D& v);
  60.  ~vector2D();
  61. };
  62.  
  63. template<class T> vector2D<T> vector2D<T>::ZERO = vector2D<T>(math_traits<T>::zero(), math_traits<T>::zero());
  64. template<class T> vector2D<T> vector2D<T>::X = vector2D<T>(math_traits<T>::one(), math_traits<T>::zero());
  65. template<class T> vector2D<T> vector2D<T>::Y = vector2D<T>(math_traits<T>::zero(), math_traits<T>::one());
  66. template<class T> vector2D<T> vector2D<T>::NEG_X = vector2D<T>(math_traits<T>::neg_one(), math_traits<T>::zero());
  67. template<class T> vector2D<T> vector2D<T>::NEG_Y = vector2D<T>(math_traits<T>::zero(), math_traits<T>::neg_one());
  68.  
  69. template<class T>
  70. inline vector2D<T>::vector2D()
  71. {
  72. }
  73.  
  74. template<class T>
  75. inline vector2D<T>::vector2D(T x, T y)
  76. {
  77.  data[0] = x;
  78.  data[1] = y;
  79. }
  80.  
  81. template<class T>
  82. inline vector2D<T>::vector2D(T fill)
  83. {
  84.  data[0] = fill;
  85.  data[1] = fill;
  86. }
  87.  
  88. template<class T>
  89. inline vector2D<T>::vector2D(const T* v)
  90. {
  91.  data[0] = v[0];
  92.  data[1] = v[1];
  93. }
  94.  
  95. template<class T>
  96. inline vector2D<T>::vector2D(const vector2D<T>& v)
  97. {
  98.  data[0] = v.data[0];
  99.  data[1] = v.data[1];
  100. }
  101.  
  102. template<class T>
  103. inline vector2D<T>::~vector2D()
  104. {
  105. }
  106.  
  107. template<class T>
  108. inline vector2D<T>& vector2D<T>::operator =(const vector2D<T>& v)
  109. {
  110.  if(this == &v) return *this;
  111.  data[0] = v.data[0];
  112.  data[1] = v.data[1];
  113.  return *this;
  114. }
  115.  
  116. template<class T>
  117. inline vector2D<T>& vector2D<T>::operator +=(const vector2D<T>& v)
  118. {
  119.  data[0] += v.data[0];
  120.  data[1] += v.data[1];
  121.  return *this;
  122. }
  123.  
  124. template<class T>
  125. inline vector2D<T>& vector2D<T>::operator -=(const vector2D<T>& v)
  126. {
  127.  data[0] -= v.data[0];
  128.  data[1] -= v.data[1];
  129.  return *this;
  130. }
  131.  
  132. template<class T>
  133. inline vector2D<T>& vector2D<T>::operator *=(T scalar)
  134. {
  135.  data[0] *= scalar;
  136.  data[1] *= scalar;
  137.  return *this;
  138. }
  139.  
  140. template<class T>
  141. inline vector2D<T>& vector2D<T>::operator /=(T scalar)
  142. {
  143.  scalar = math_traits<T>::one()/scalar;
  144.  data[0] *= scalar;
  145.  data[1] *= scalar;
  146.  return *this;
  147. }
  148.  
  149. template<class T>
  150. inline vector2D<T> vector2D<T>::operator +(const vector2D<T>& v)const
  151. {
  152.  return vector2D<T>(data[0] + v.data[0], data[1] + v.data[1]);
  153. }
  154.  
  155. template<class T>
  156. inline vector2D<T> vector2D<T>::operator -(const vector2D<T>& v)const
  157. {
  158.  return vector2D<T>(data[0] - v.data[0], data[1] - v.data[1]);
  159. }
  160.  
  161. template<class T>
  162. inline vector2D<T> vector2D<T>::operator *(const vector2D<T>& v)const
  163. {
  164.  return vector2D<T>(data[0] * v.data[0], data[1] * v.data[1]);
  165. }
  166.  
  167. template<class T>
  168. inline vector2D<T> vector2D<T>::operator /(const vector2D<T>& v)const
  169. {
  170.  T scalar[2] = {
  171.    math_traits<T>::one()/v.data[0],
  172.    math_traits<T>::one()/v.data[1],
  173.  }; 
  174.  return vector2D<T>(data[0] * scalar[0], data[1] * scalar[1]);
  175. }
  176.  
  177. template<class T>
  178. inline vector2D<T> vector2D<T>::operator *(T scalar)const
  179. {
  180.  return vector2D<T>(data[0]*scalar, data[1]*scalar);
  181. }
  182.  
  183. template<class T>
  184. inline vector2D<T> vector2D<T>::operator /(T scalar)const
  185. {
  186.  scalar = math_traits<T>::one()/scalar;
  187.  return vector2D<T>(data[0]*scalar, data[1]*scalar);
  188. }
  189.  
  190. template<class T>
  191. inline vector2D<T> vector2D<T>::operator +(void)const
  192. {
  193.  return *this;
  194. }
  195.  
  196. template<class T>
  197. inline vector2D<T> vector2D<T>::operator -(void)const
  198. {
  199.  return vector2D<T>(-data[0], -data[1]);
  200. }
  201.  
  202. template<class T>
  203. inline bool vector2D<T>::operator ==(const vector2D<T>& v)const
  204. {
  205.  return ((data[0] == v.data[0]) && (data[1] == v.data[1]));
  206. }
  207.  
  208. template<class T>
  209. inline bool vector2D<T>::operator !=(const vector2D<T>& v)const
  210. {
  211.  return !(*this == v);
  212. }
  213.  
  214. template<class T>
  215. inline bool vector2D<T>::operator !(void)const
  216. {
  217.  return ((data[0] == math_traits<T>::zero()) && (data[1] == math_traits<T>::zero()));
  218. }
  219.  
  220. template<class T>
  221. inline T& vector2D<T>::operator [](int index)
  222. {
  223.  return data[index];
  224. }
  225.  
  226. template<class T>
  227. inline const T& vector2D<T>::operator [](int index)const
  228. {
  229.  return data[index];
  230. }
  231.  
  232. template<class T>
  233. inline const T* vector2D<T>::c_ptr(void)const
  234. {
  235.  return &data[0];
  236. }
  237.  
  238. template<class T>
  239. inline T vector2D<T>::length(void)const
  240. {
  241.  return std::sqrt(data[0]*data[0] + data[1]*data[1]);
  242. }
  243.  
  244. template<class T>
  245. inline T vector2D<T>::length_squared(void)const
  246. {
  247.  return data[0]*data[0] + data[1]*data[1];
  248. }
  249.  
  250. template<class T>
  251. inline void vector2D<T>::normalize(void)
  252. {
  253.  T denom = math_traits<T>::one()/length();
  254.  data[0] *= denom;
  255.  data[1] *= denom;
  256. }
  257.  
  258. template<class T>
  259. inline T vector2D<T>::dot(const vector2D<T>& v)const
  260. {
  261.  return data[0]*v.data[0] + data[1]*v.data[1];
  262. }
  263.  
  264. template<class T>
  265. inline T vector2D<T>::cross(const vector2D<T>& v)const
  266. {
  267.  return data[0]*v.data[1] - data[1]*v.data[0];
  268. }
  269.  
  270. template<class T>
  271. inline T abs(const vector2D<T>& v)
  272. {
  273.  return v.length();
  274. }
  275.  
  276. template<class T>
  277. inline T dot_product(const vector2D<T>& v1, const vector2D<T>& v2)
  278. {
  279.  return v1.dot(v2);
  280. }
  281.  
  282. template<class T>
  283. inline T cross_product(const vector2D<T>& v1, const vector2D<T>& v2)
  284. {
  285.  return v1.data[0]*v2.data[1] - v1.data[1]*v2.data[0];
  286. }
  287.  
  288. template<class T>
  289. inline vector2D<T> min(const vector2D<T>& v1, const vector2D<T>& v2)
  290. {
  291.  return vector2D<T>(std::min(v1.data[0], v2.data[0]), std::min(v1.data[1], v2.data[1]));
  292. }
  293.  
  294. template<class T>
  295. inline vector2D<T> max(const vector2D<T>& v1, const vector2D<T>& v2)
  296. {
  297.  return vector2D<T>(std::max(v1.data[0], v2.data[0]), std::max(v1.data[1], v2.data[1]));
  298. }
  299.  
  300. template<class T>
  301. inline vector2D<T> operator *(T scalar, const vector2D<T>& v)
  302. {
  303.  return vector2D<T>(v.data[0]*scalar, v.data[1]*scalar);
  304. }
  305.  
  306. template<class T>
  307. inline std::ostream& operator <<(std::ostream& os, const vector2D<T>& v)
  308. {
  309.  os << "<" << v.data[0] << "," << v.data[1] << "," << v.data[2] << ">";
  310.  return os;
  311. }
  312.  
  313. #endif
  314.