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

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