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

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_VEC2
  2. #define AF_VEC2
  3. /// 2D vector class
  4. class afVec2
  5. {
  6. public:
  7. enum Axis { X_AXIS, Y_AXIS };
  8.     float x, y;
  9. /// Creates a default vec2 (0,0)
  10. afVec2();
  11. /// Creates a vec2 from to floats
  12.     afVec2(float x,float y);
  13. /// Creates a vec2 from a pointer to two floats
  14.     afVec2(float *nValues)  {  set(nValues);  }
  15. /// Creates a vec2 as a copy from an other one
  16. afVec2(const afVec2& other);
  17. /// access to members (x,y) by indices
  18.     float& operator[]( unsigned index ) { return (&x)[index]; }
  19. /// access to members (x,y) by indices
  20.     const float& operator[]( unsigned index ) const { return (&x)[index]; }
  21. /// copy a vec2 from an other
  22.     inline afVec2& operator=(const afVec2&);
  23. /// addition same as for normal value type
  24.     inline afVec2 operator+() const;
  25. /// add an other vec2 to this one
  26.     inline afVec2& operator+=(const afVec2&);
  27. /// substraction same as for normal value type
  28.     inline afVec2 operator-() const;
  29. /// substract an other vec2 to this one
  30.     inline afVec2& operator-=(const afVec2&);
  31. /// multiply this vec2 with a float
  32.     inline afVec2& operator*=(float mult);
  33. /// divide this vec2 by a float
  34.     inline afVec2& operator/=(float div);
  35.     friend inline afVec2
  36. operator+(const afVec2& left, const afVec2& right);
  37.     friend inline afVec2 
  38. operator-(const afVec2& left, const afVec2& right);
  39.     friend inline afVec2 
  40. operator/(const afVec2& left, const afVec2& right);
  41. friend inline bool 
  42. operator==(const afVec2& left, const afVec2& right);
  43.     friend inline float
  44. operator*(const afVec2& left, const afVec2& right);
  45. /// Adds two vec2 and saves the result in this vec2
  46.     inline afVec2& 
  47. add(const afVec2& v1, const afVec2& v2);
  48. /// Adds two vec2 scaling the second one and saves the result in this vec2
  49.     inline afVec2& 
  50. addScaled(const afVec2& v1, float s, const afVec2& v2);
  51. /// Returns true if this vec2 and nV are at maximum nTol different
  52.     inline bool 
  53. almostEqual(const afVec2& nV, float nTol) const;
  54. /// Adds two vec2 scaling both and saves the result in this vec2
  55.     inline afVec2& 
  56. combine(float s1, const afVec2& v1, float s2, const afVec2& v2);
  57. /// Same a operator=()
  58.     inline afVec2& 
  59. copy(const afVec2& v);
  60. /// Returns the arithmetic distance between this vec2 and nV
  61.     float 
  62. distance(const afVec2& nV) const;
  63. /// Returns the squared arithmetic distance between this vec2 and nV
  64.     inline float 
  65. sqrDistance(const afVec2& nV) const;
  66. /// Returns the dot product between this vec2 and nV
  67.     inline float 
  68. dot(const afVec2& nV) const;
  69. /// Same as operator==()
  70.     inline bool 
  71. equal(const afVec2& v) const;
  72. /// Returns the length of this vec2
  73.     float 
  74. length() const;
  75. /// Negates this vec2
  76.     inline void
  77. negate();
  78. /// Normalizes this vec2
  79.     float      
  80. normalize();
  81. /// Multiplies this vec2 by nS
  82.     inline afVec2& 
  83. scale(float nS);
  84. /// Multiplies nV by nS and stores the result in this vec2
  85.     inline afVec2& 
  86. scale(float nS, const afVec2& nV);
  87. /// Multiplies this vector component-wise by tensor
  88.     inline afVec2& 
  89. scaleBy( const afVec2& tensor );
  90. /// Sets new x and y values
  91.     inline void 
  92. set(float x, float y);
  93. /// Sets new x and y values
  94.     inline void 
  95. set(const float xy[2]);
  96. /// Subtracts two vec2 and stores the result in this vec2
  97.     inline afVec2& 
  98. sub(const afVec2& v1, const afVec2& v2);
  99. /// Returns the angle between the vector and one axis
  100. static float
  101. cosine(const afVec2& left, Axis nAxis = X_AXIS);
  102. /// Return the angle between the two vectors
  103. static float
  104. cosine(const afVec2& left,const afVec2& right);
  105. };
  106. typedef afVec2 *afVec2Ptr;
  107. inline
  108. afVec2::afVec2()
  109. {
  110.     x = 0.0f;
  111.     y = 0.0f;
  112. }
  113. inline
  114. afVec2::afVec2(float ix, float iy)
  115. {
  116.     x = ix;
  117.     y = iy;
  118. }
  119. inline
  120. afVec2::afVec2(const afVec2& other)
  121. {
  122.     x = other.x;
  123.     y = other.y;
  124. }
  125. inline
  126. afVec2& afVec2::operator=(const afVec2& vec)
  127. {
  128.     x = vec.x;
  129.     y = vec.y;
  130.     return *this;
  131. }
  132. inline
  133. afVec2 afVec2::operator+() const
  134. {
  135.     return *this;
  136. }
  137. inline
  138. afVec2& afVec2::operator+=(const afVec2& vec)
  139. {
  140.     x += vec.x;
  141.     y += vec.y;
  142.     return *this;
  143. }
  144. inline
  145. afVec2 afVec2::operator-() const
  146. {
  147.     return afVec2(-x, -y);
  148. }
  149. inline
  150. afVec2& afVec2::operator-=(const afVec2& sub)
  151. {
  152.     x -= sub.x;
  153.     y -= sub.y;
  154.     return *this;
  155. }
  156. inline
  157. afVec2 operator*(const afVec2& vec, float s)
  158. {
  159.     return afVec2(vec.x*s, vec.y*s);
  160. }
  161. inline
  162. afVec2 operator*(float s, const afVec2& vec)
  163. {
  164.     return afVec2(s*vec.x, s*vec.y);
  165. }
  166. inline
  167. afVec2 operator/(const afVec2& vec, float div)
  168. {
  169.     return afVec2(vec.x/div, vec.y/div);
  170. }
  171. inline
  172. afVec2& afVec2::operator*=(float mult)
  173. {
  174.     x *= mult;
  175.     y *= mult;
  176.     return *this;
  177. }
  178. inline
  179. afVec2& afVec2::operator/=(float div)
  180. {
  181.     x /= div;
  182.     y /= div;
  183.     return *this;
  184. }
  185. inline afVec2
  186. operator+(const afVec2& left, const afVec2& right)
  187. {
  188. return afVec2(left.x+right.x,left.y+right.y);
  189. }
  190. inline afVec2 
  191. operator-(const afVec2& left, const afVec2& right)
  192. {
  193. return afVec2(left.x-right.x,left.y-right.y);
  194. }
  195. inline afVec2 
  196. operator/(const afVec2& left, const afVec2& right)
  197. {
  198. return afVec2(left.x/right.x,left.y/right.y);
  199. }
  200. inline bool 
  201. operator==(const afVec2& left, const afVec2& right)
  202. {
  203.     return ( left.x == right.x && left.y == right.y);
  204. }
  205. inline bool 
  206. operator!=(const afVec2& left, const afVec2& right)
  207. {
  208.     return ( left.x!=right.x
  209.           || left.y!=right.y );
  210. }
  211. inline float
  212. operator*(const afVec2& left, const afVec2& right)
  213. {
  214. return (left[0]*right[0]+left[1]*right[1]);
  215. }
  216. inline
  217. afVec2& afVec2::add(const afVec2& vec1, const afVec2& vec2)
  218. {
  219.     x = vec1.x+vec2.x;
  220.     y = vec1.y+vec2.y;
  221.     return *this;
  222. }
  223. inline
  224. afVec2& afVec2::addScaled(const afVec2& vec1, float s, const afVec2& vec2)
  225. {
  226.     x = vec1.x+s*vec2.x;
  227.     y = vec1.y+s*vec2.y;
  228.     return *this;
  229. }
  230. inline
  231. bool afVec2::almostEqual(const afVec2& vec, float tol) const
  232. {
  233.     float dx = x-vec.x;
  234.     float dy = y-vec.y;
  235.     return (dx>-tol && dx<tol && dy>-tol && dy<tol);
  236. }
  237. inline
  238. bool almostEqual(const afVec2 vec1, const afVec2 vec2, float epsilon)
  239. {
  240.     return vec1.almostEqual(vec2, epsilon);
  241. }
  242. inline
  243. afVec2& afVec2::combine(float s1, const afVec2& vec1, float s2, const afVec2& vec2)
  244. {
  245.     x = s1*vec1.x+s2*vec2.x;
  246.     y = s1*vec1.y+s2*vec2.y;
  247.     return *this;
  248. }
  249. inline
  250. afVec2& afVec2::copy(const afVec2& vec)
  251. {
  252.     x = vec.x;
  253.     y = vec.y;
  254.     return *this;
  255. }
  256. inline
  257. float afVec2::sqrDistance(const afVec2& vec) const
  258. {
  259.     return (x-vec.x)*(x-vec.x)
  260.           +(y-vec.y)*(y-vec.y);
  261. }
  262. inline
  263. float afVec2::dot(const afVec2& vec) const
  264. {
  265.     return (x*vec.x+y*vec.y);
  266. }
  267. inline
  268. float Dot(const afVec2& vec1, const afVec2& vec2)
  269. {
  270.     return (vec1.x*vec2.x+vec1.y*vec2.y);
  271. }
  272. inline
  273. bool afVec2::equal(const afVec2& vec) const
  274. {
  275.     return ( x==vec.x && y==vec.y );
  276. }
  277. inline
  278. void afVec2::negate()
  279. {
  280.     x = -x;
  281. y = -y;
  282. }
  283. inline
  284. afVec2& afVec2::scale(float s)
  285. {
  286.     x *= s;
  287.     y *= s;
  288.     return *this;
  289. }
  290. inline
  291. afVec2& afVec2::scale(float s, const afVec2& vec)
  292. {
  293.     x = s*vec.x;
  294.     y = s*vec.y;
  295.     return *this;
  296. }
  297. inline
  298. afVec2& afVec2::scaleBy( const afVec2& tensor )
  299. {
  300.     x *= tensor.x;
  301.     y *= tensor.y;
  302.     return *this;
  303. }
  304. inline
  305. void afVec2::set(float ix, float iy)
  306. {
  307.     x = ix;
  308.     y = iy;
  309. }
  310. inline
  311. void afVec2::set(const float xy[])
  312. {
  313.     x = xy[0];
  314.     y = xy[1];
  315. }
  316. inline
  317. afVec2& afVec2::sub(const afVec2& vec1, const afVec2& vec2)
  318. {
  319.     x = vec1.x-vec2.x;
  320.     y = vec1.y-vec2.y;
  321.     return *this;
  322. }
  323. #endif