fork download
  1. #ifndef GAME_Vertex3D_H
  2. #define GAME_Vertex3D_H
  3.  
  4. #include "stdafx.h"
  5. #include "math.h"
  6.  
  7. // Vertex3D: Шаблон класса "точка" (или "вектор", что одно и то же) в трехмерной
  8. // декартовой системе координат.
  9. // Поддерживает примитивные операции над векторами в пространстве.
  10. // Основан на коде Алексея В. Борескова (http://s...content-available-to-author-only...d.ru)
  11. template < class T >
  12. class Vertex3D
  13. {
  14. private:
  15. // max3: возвращает максимальное значение из трех переданных
  16. static T max3( T a, T b, T c )
  17. {
  18. return a > b ? (a > c ? a : (b > c ? b : c)) :
  19. (b > c ? b : (a > c ? a : c));
  20. };
  21.  
  22. // sqr: возвращает квадрат аргумента
  23. static T sqr( T x )
  24. {
  25. return x * x;
  26. };
  27.  
  28. public:
  29. T x, y, z; // Координаты точки (вектора) в трехмерном пространстве
  30.  
  31. // Конструктор по умолчанию создаёт "нулевой" вектор
  32. Vertex3D(): x( 0 ), y( 0 ), z( 0 ) {};
  33.  
  34. // Конструкто из трех координат
  35. Vertex3D( T px, T py, T pz )
  36. {
  37. x = px;
  38. y = py;
  39. z = pz;
  40. };
  41.  
  42. // Конструкто из массива трех координат
  43. Vertex3D( const T *pt )
  44. {
  45. x = pt[ 0 ];
  46. y = pt[ 1 ];
  47. z = pt[ 2 ];
  48. };
  49.  
  50. // Конструктор копирования из другой точки
  51. Vertex3D( const Vertex3D< T > &v )
  52. {
  53. x = v.x;
  54. y = v.y;
  55. z = v.z;
  56. };
  57.  
  58. // operator=: оператор копирования из массива трех координат точки
  59. const Vertex3D< T > &operator=( const T *pt )
  60. {
  61. x = pt[ 0 ];
  62. y = pt[ 1 ];
  63. z = pt[ 2 ];
  64. return *this;
  65. };
  66.  
  67. // operator=: оператор копирования из другой точки
  68. const Vertex3D< T > &operator=( const Vertex3D< T > &v )
  69. {
  70. x = v.x;
  71. y = v.y;
  72. z = v.z;
  73. return *this;
  74. };
  75.  
  76. // operator+: унарный плюс возвращает копию объекта
  77. Vertex3D< T > operator+() const
  78. {
  79. return *this;
  80. };
  81.  
  82. // operator-: Унарный минус возвращает инвертированную копию объекта
  83. Vertex3D< T > operator-() const
  84. {
  85. return Vertex3D< T >( -x, -y, -z );
  86. };
  87.  
  88. // operator+=: прибавляет к координатам текущей точки координаты аргумента
  89. Vertex3D< T > &operator+=( const Vertex3D< T > &v )
  90. {
  91. x += v.x;
  92. y += v.y;
  93. z += v.z;
  94. return *this;
  95. };
  96.  
  97. // operator-=: вычитает из координат текущей точки координаты аргумента
  98. Vertex3D< T > &operator-=( const Vertex3D< T > &v )
  99. {
  100. x -= v.x;
  101. y -= v.y;
  102. z -= v.z;
  103. return *this;
  104. };
  105.  
  106. // operator*=: умножает координаты текущей точки на координаты аргумента
  107. Vertex3D< T > &operator*=( const Vertex3D< T > &v )
  108. {
  109. x *= v.x;
  110. y *= v.y;
  111. z *= v.z;
  112. return *this;
  113. };
  114.  
  115. // operator*=: умножает координаты текущей точки на параметр
  116. Vertex3D< T > &operator*=( T f )
  117. {
  118. x *= f;
  119. y *= f;
  120. z *= f;
  121. return *this;
  122. };
  123.  
  124. // operator/=: делит координаты текущей точки на координаты аргумента
  125. Vertex3D< T > &operator/=( const Vertex3D< T > &v )
  126. {
  127. x /= v.x;
  128. y /= v.y;
  129. z /= v.z;
  130. return *this;
  131. };
  132.  
  133. // operator/=: делит координаты текущей точки на параметр
  134. Vertex3D< T > &operator/=( T f )
  135. {
  136. x /= f;
  137. y /= f;
  138. z /= f;
  139. return *this;
  140. };
  141.  
  142. // operator[]: доступ к i-ому элементу координат в стиле массива (индекс x = 0)
  143. T &operator[]( int index )
  144. {
  145. return *( index + &x );
  146. };
  147.  
  148. // operator[] const: доступ к i-ому элементу координат в стиле массива (индекс x = 0)
  149. T &operator[]( int index ) const
  150. {
  151. return *( index + &x );
  152. };
  153.  
  154. // operator==: сравнение на равенство с аргументом
  155. bool operator==( const Vertex3D< T > &v ) const
  156. {
  157. return (x == v.x) && (y == v.y) && (z == v.z);
  158. };
  159.  
  160. // operator!=: сравнение на неравенство с аргументом
  161. bool operator!=( const Vertex3D< T > &v ) const
  162. {
  163. return (x != v.x) || (y != v.y) || (z != v.z);
  164. };
  165.  
  166. // Length: возвращает длину вектора (длину линии, соединяющей точку с началом координат)
  167. T Length() const
  168. {
  169. return (T) sqrt( x * x + y * y + z * z );
  170. };
  171.  
  172. // LengthSqr: возвращает квадрат длины вектора (длины линии, соединяющей точку
  173. // с началом координат). В отличие от length() не использует вычисление квадратного
  174. // корня, поэтому предпочтительнее использовать этот метод там, где возможно, например:
  175. // Vertex3D a, b;
  176. // ...
  177. // if ( a.length() < b.length() ) ...
  178. // будет выполнятся существенно медленнее чем
  179. // if ( a.lengthSqr() < b.lengthSqr() ) ...
  180. // но результат будет такой же, поэтому последняя форма предпочтительнее.
  181. T LengthSqr() const
  182. {
  183. return x * x + y * y + z * z;
  184. };
  185.  
  186. // Normalize: нормализует вектор, т.е. приводит его длину к единице (1).
  187. Vertex3D< T > &Normalize()
  188. {
  189. return (*this) /= Length();
  190. };
  191.  
  192. // MaxLength: возвращает величину максимальной координаты точки (вектора)
  193. T MaxLength() const
  194. {
  195. return max3( (T)fabs(x), (T)fabs(y), (T)fabs(z) );
  196. };
  197.  
  198. // DistanceTo: возвращает расстояние от текущей точки до аргумента
  199. T DistanceTo( const Vertex3D< T > &p ) const
  200. {
  201. return (T) sqrt( sqr( x - p.x ) + sqr( y - p.y ) + sqr( z - p.z ) );
  202. };
  203.  
  204. // DistanceToSqr: возвращает квадрат расстояния от текущей точки до аргумента
  205. T DistanceToSqr( const Vertex3D< T > &p ) const
  206. {
  207. return sqr( x - p.x ) + sqr( y - p.y ) + sqr( z - p.z );
  208. };
  209.  
  210. // DistanceToAlongAxis: возвращает расстояние (всегда > 0) между соответствующими
  211. // координатами текущей точки с аргументом вдоль оси axis
  212. // (0 - ось X, 1 - ось Y, 2 - ось Z).
  213. T DistanceToAlongAxis( const Vertex3D< T > &p, int axis ) const
  214. {
  215. return (T) fabs( (*this)[ axis ] - p[ axis ] );
  216. };
  217.  
  218. // GetMainAxis: возвращает индекс оси, координата по которой имеет максимальное
  219. // абсолютное значение (0 - ось X, 1 - ось Y, 2 - ось Z).
  220. int GetMainAxis() const
  221. {
  222. int axis = 0;
  223. T val = (T) fabs ( x );
  224. for ( register int i = 1; i < 3; i++ )
  225. {
  226. T vNew = (T) fabs( (*this)[ i ] );
  227. if ( vNew > val )
  228. {
  229. val = vNew;
  230. axis = i;
  231. };
  232. };
  233. return axis;
  234. };
  235.  
  236. // Lerp: возвращает точку, лежащую на прямой проходящей через текущую точку
  237. // и точку b, отстоящую от текущей на t единиц вдоль прямой, начиная с неё и в
  238. // направлении к точке b (если t > 0, или в обратном направлении, если t < 0).
  239. // Единицей считается расстояние между этими точками
  240. // (т.е. при t = 1 результат будет равен точке b).
  241. Vertex3D< T > Lerp( const Vertex3D< T > &b, T t )
  242. {
  243. return *this + t * (b - *this);
  244. };
  245.  
  246. // MixedProduct: выполняет векторное перемножение агрументов b и с, результат
  247. // которого скалярно помножается на текущую точку (вектор).
  248. // Результатом будет скаляр, величина которого равна объему
  249. // параллелепипеда построенного на данных трёх векторах.
  250. // Результат может быть отрицателен, в зависимости от того в каком
  251. // (левостороннем или правостороннем) стоят вектора.
  252. T MixedProduct( const Vertex3D< T > &b, const Vertex3D< T > &c ) const
  253. {
  254. return ( *this & ( b ^ c ) );
  255. };
  256.  
  257. // operator+: бинарное сложение двух точек (векторов).
  258. // Возвращает точку координаты которой являются суммой
  259. // соответствующих координат аргументов.
  260. Vertex3D< T > operator+( const Vertex3D< T > &v ) const
  261. {
  262. return Vertex3D< T >( x + v.x, y + v.y, z + v.z );
  263. };
  264.  
  265. // operator-: бинарное вычитание двух точек (векторов).
  266. // Возвращает точку координаты которой являются разницей
  267. // соответствующих координат аргументов.
  268. Vertex3D< T > operator-( const Vertex3D< T > &v ) const
  269. {
  270. return Vertex3D< T >( x - v.x, y - v.y, z - v.z );
  271. };
  272.  
  273. // operator*: бинарное умножение двух точек (векторов).
  274. // Возвращает точку координаты которой являются произведением
  275. // соответствующих координат аргументов.
  276.  
  277. Vertex3D< T > operator*( const Vertex3D< T > &v ) const
  278. {
  279. return Vertex3D< T >( x * v.x, y * v.y, z * v.z );
  280. };
  281.  
  282. // operator*: бинарное умножение точеки (вектора) на скаляр.
  283. // Возвращает точку координаты которой являются произведением
  284. // соответствующей координаты на аргумент.
  285.  
  286. Vertex3D< T > operator*( T a ) const
  287. {
  288. return Vertex3D< T >( x * a, y * a, z * a );
  289. };
  290.  
  291. // operator/: бинарное деление точки (вектора) на скаляр.
  292. // Возвращает точку координаты которой являются результатом деления
  293. // соответствующей координаты на аргумент.
  294.  
  295. Vertex3D< T > operator/( T a ) const
  296. {
  297. return Vertex3D< T >( x / a, y / a, z / a );
  298. };
  299.  
  300. // operator&: скалярное умножение векторов (dot product).
  301. // Возвращает результат скалярного умножения аргументов
  302. // (скаляр, величина которого равна произведению длин векторов на косинус угла между ними).
  303. T operator&( const Vertex3D< T > &v ) const
  304. {
  305. return x * v.x + y * v.y + z * v.z;
  306. };
  307.  
  308. // operator^: векторное умножение векторов (cross product).
  309. // Возвращает результат векторного умножения аргументов
  310. // (вектор, перпендикулярный плоскости, образованной u и v, длина которого
  311. // равна произведению длин векторов на синус угла между ними).
  312. Vertex3D< T > operator^( const Vertex3D< T > &v ) const
  313. {
  314. return Vertex3D< T >( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x );
  315. };
  316. };
  317.  
  318. template< class T >
  319. Vertex3D<T> operator*( T a, const Vertex3D< T > & v )
  320. {
  321. return Vertex3D< T >( a * v.x, a * v.y, a * v.z );
  322. }
  323.  
  324. template< class T >
  325. Vertex3D<T> operator*( const Vertex3D< T > & v, T a )
  326. {
  327. return Vertex3D< T >( a * v.x, a * v.y, a * v.z );
  328. }
  329.  
  330.  
  331. typedef Vertex3D< float > Vertex3Df;
  332. typedef Vertex3D< double > Vertex3Dd;
  333.  
  334. #endif
  335.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:4:10: fatal error: stdafx.h: No such file or directory
 #include "stdafx.h"
          ^~~~~~~~~~
compilation terminated.
stdout
Standard output is empty