afVec3.h
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:6k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_VEC3
  2. #define AF_VEC3
  3. #include <assert.h>
  4. class afPlane;
  5. /// 3D vector class
  6. class afVec3
  7. {
  8. public:
  9.     float x, y, z;
  10. //constructors
  11.     afVec3()  {  x=y=z=0.0f;  }
  12.     afVec3(float nX, float nY, float nZ )  {  x=nX; y=nY; z=nZ;  }
  13. afVec3(const afVec3& tocopy)  {  *this =  tocopy;  }
  14. afVec3(const float *nVec)  {  set(nVec);  }
  15. void
  16. set(const float *nVec) { x = nVec[0];y = nVec[1];z = nVec[2]; }
  17. void
  18. set(float nX, float nY, float nZ)  { x = nX;  y = nY;  z = nZ; }
  19. void
  20. setLength(float nLength)  {  (*this)*=(nLength/length());  }
  21.     const float& 
  22. getX() const { return x; }
  23.     const float& 
  24. getY() const { return y; }
  25.     const float& 
  26. getZ() const { return z; }
  27.     float 
  28. length() const;
  29.     float 
  30. sqrLength() const  { return x*x + y*y + z*z; }
  31. float
  32. normalize();
  33.     afVec3& 
  34. cross( const afVec3& v1, const afVec3& v2 );
  35. static float
  36. cosine(const afVec3& left,const afVec3& right);
  37. /// Returns the dot product between this vec3 and nV
  38.     inline float 
  39. dot(const afVec3& nV) const;
  40. inline bool
  41. isInfrontOf(const afPlane& nPlane) const;
  42. //returns one normal vector 
  43.     inline afVec3
  44. normal();
  45. inline void
  46. negate()  {  x = -x;  y = -y;  z = -z;  }
  47.     inline afVec3& 
  48. add(const afVec3& v1, const afVec3& v2);
  49.     inline afVec3& 
  50. addScaled(const afVec3& v1, float s, const afVec3& v2);
  51. inline afVec3& 
  52. operator=( const afVec3& );
  53.     inline afVec3& 
  54. operator+=( const afVec3& );
  55.     inline afVec3& 
  56. operator-=( const afVec3& );
  57.     inline afVec3& 
  58. operator*=( const afVec3&  );
  59.     inline afVec3& 
  60. operator*=( float mult );
  61.     inline afVec3& 
  62. operator/=( float div );
  63.     inline afVec3 
  64. operator+( float value );
  65.     inline afVec3 
  66. operator-( float value );
  67.     inline afVec3 
  68. operator*( float value );
  69. friend inline bool 
  70. operator==(const afVec3& left, const afVec3& right);
  71. friend inline bool 
  72. operator<(const afVec3& left, const afVec3& right);
  73. friend inline bool 
  74. operator>(const afVec3& left, const afVec3& right);
  75. friend inline bool 
  76. operator<=(const afVec3& left, const afVec3& right);
  77. friend inline bool 
  78. operator>=(const afVec3& left, const afVec3& right);
  79. static float
  80. distance(const afVec3& left, const afVec3& right);
  81.     friend inline const afVec3
  82. operator+(const afVec3& left, const afVec3& right);
  83.     friend inline const afVec3 
  84. operator-(const afVec3& left, const afVec3& right);
  85.     friend inline const afVec3 
  86. operator+(const afVec3& right);
  87.     friend inline const afVec3 
  88. operator-(const afVec3& right);
  89.     friend inline float
  90. operator*(const afVec3& left, const afVec3& right);
  91.     friend inline float
  92. operator/(const afVec3& left, const afVec3& right);
  93.     friend inline afVec3 
  94. operator*(const afVec3& left, float right);
  95.     friend inline afVec3 
  96. operator/(const afVec3& left, float right );
  97.     const float& 
  98. operator[](unsigned index) const { return (&x)[index]; }
  99.     float& 
  100. operator[](unsigned index) { return (&x)[index]; }
  101. };
  102. /// Direction in euler values
  103. typedef afVec3 afEuler;
  104. typedef afVec3 *afVec3Ptr;
  105. inline
  106. afVec3& afVec3::add(const afVec3& vec1, const afVec3& vec2)
  107. {
  108.     x = vec1.x+vec2.x;
  109.     y = vec1.y+vec2.y;
  110. z = vec1.z+vec2.z;
  111.     return *this;
  112. }
  113. inline
  114. afVec3& afVec3::addScaled(const afVec3& vec1, float s, const afVec3& vec2)
  115. {
  116.     x = vec1.x+s*vec2.x;
  117.     y = vec1.y+s*vec2.y;
  118. z = vec1.z+s*vec2.z;
  119.     return *this;
  120. }
  121. inline afVec3&
  122. afVec3::operator=( const afVec3& other)
  123. {
  124. x = other.x;
  125. y = other.y;
  126. z = other.z;
  127. return *this;
  128. }
  129. inline afVec3&
  130. afVec3::operator+=(const afVec3& vec)
  131. {
  132.     x += vec.x;
  133.     y += vec.y;
  134.     z += vec.z;
  135.     return *this;
  136. }
  137. inline
  138. afVec3& afVec3::operator-=(const afVec3& vec)
  139. {
  140.     x -= vec.x;
  141.     y -= vec.y;
  142.     z -= vec.z;
  143.     return *this;
  144. }
  145. inline
  146. afVec3& afVec3::operator*=(float scale)
  147. {
  148.     x *= scale;
  149.     y *= scale;
  150.     z *= scale;
  151.     return *this;
  152. }
  153. inline afVec3& 
  154. afVec3::operator*=( const afVec3& other)
  155. {
  156.     x *= other.x;
  157.     y *= other.y;
  158.     z *= other.z;
  159. return *this;
  160. }
  161. inline afVec3& 
  162. afVec3::operator/=(float div)
  163. {
  164.     x /= div;
  165.     y /= div;
  166.     z /= div;
  167.     return *this;
  168. }
  169. inline bool 
  170. operator==(const afVec3& left, const afVec3& right)
  171. {
  172.     return ( left.x == right.x
  173.           && left.y == right.y
  174.           && left.z == right.z );
  175. }
  176. inline bool 
  177. operator<(const afVec3& left, const afVec3& right)
  178. {
  179.     return ( left.x < right.x
  180.           && left.y < right.y
  181.           && left.z < right.z );
  182. }
  183. inline bool 
  184. operator>(const afVec3& left, const afVec3& right)
  185. {
  186.     return ( left.x > right.x
  187.           && left.y > right.y
  188.           && left.z > right.z );
  189. }
  190. inline bool 
  191. operator<=(const afVec3& left, const afVec3& right)
  192. {
  193.     return ( left.x <= right.x
  194.           && left.y <= right.y
  195.           && left.z <= right.z );
  196. }
  197. inline bool 
  198. operator>=(const afVec3& left, const afVec3& right)
  199. {
  200.     return ( left.x >= right.x
  201.           && left.y >= right.y
  202.           && left.z >= right.z );
  203. }
  204. inline const afVec3
  205. operator+(const afVec3& left, const afVec3& right)
  206. {
  207. return afVec3(left.x+right.x,left.y+right.y,left.z+right.z);
  208. }
  209. inline const afVec3
  210. operator-(const afVec3& left, const afVec3& right)
  211. {
  212. return afVec3(left.x-right.x,left.y-right.y,left.z-right.z);
  213. }
  214. inline const afVec3
  215. operator+(const afVec3& right)
  216. {
  217. return afVec3(right.x,right.y,right.z);
  218. }
  219. inline const afVec3
  220. operator-(const afVec3& right)
  221. {
  222. return afVec3(-right.x,-right.y,-right.z);
  223. }
  224. inline float
  225. operator*(const afVec3& left, const afVec3& right)
  226. {
  227.     return left.x*right.x + left.y*right.y + left.z*right.z;
  228. }
  229. inline float
  230. operator/(const afVec3& left, const afVec3& right)
  231. {
  232.     return left.x/right.x + left.y/right.y + left.z/right.z;
  233. }
  234. inline afVec3 
  235. afVec3::operator+( float value )
  236. {
  237. return afVec3(x+value,y+value,z+value);
  238. }
  239. inline afVec3 
  240. afVec3::operator-( float value )
  241. {
  242. return afVec3(x-value,y-value,z-value);
  243. }
  244. inline afVec3 
  245. afVec3::operator*( float value )
  246. {
  247. return afVec3(x*value,y*value,z*value);
  248. }
  249. inline afVec3 
  250. operator*( const afVec3& left, float value )
  251. {
  252. return afVec3(left.x*value,left.y*value,left.z*value);
  253. }
  254. inline afVec3 
  255. operator/( const afVec3& left, float value )
  256. {
  257. assert(value!=0.0f);
  258. return afVec3(left.x/value,left.y/value,left.z/value);
  259. }
  260. #endif