home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / include / k3d / k3dsdk / vectors.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-01-11  |  7.9 KB  |  294 lines

  1. #ifndef K3DSDK_VECTORS_H
  2. #define K3DSDK_VECTORS_H
  3.  
  4. // K-3D
  5. // Copyright (c) 1995-2006, Timothy M. Shead
  6. //
  7. // Contact: tshead@k-3d.com
  8. //
  9. // This library is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. //
  14. // This library is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17. // General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public
  20. // License along with this library; if not, write to the Free Software
  21. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  
  23. /** \file
  24.     \brief Vector (points, vectors and normals) routines
  25.     \author Timothy M. Shead (tshead@k-3d.com)
  26. */
  27.  
  28. /****************************************************************
  29. *
  30. * C++ Vector and Matrix Algebra routines
  31. * Author: Jean-Francois DOUE
  32. * Version 3.1 --- October 1993
  33. *
  34. ****************************************************************/
  35.  
  36. //
  37. //    From "Graphics Gems IV / Edited by Paul S. Heckbert
  38. //    Academic Press, 1994, ISBN 0-12-336156-9
  39. //    "You are free to use and modify this code in any way
  40. //    you like." (p. xv)
  41. //
  42. //    Modified by J. Nagle, March 1997
  43. //    -    All functions are inline.
  44. //    -    All functions are const-correct.
  45. //    -    All checking is via the standard "assert" macro.
  46. //
  47.  
  48. // Modified by Tim Shead for use with K-3D, January 1998
  49.  
  50. #include "almost_equal.h"
  51. #include "normal3.h"
  52. #include "point2.h"
  53. #include "point3.h"
  54. #include "point4.h"
  55. #include "vector2.h"
  56. #include "vector3.h"
  57. #include "vector4.h"
  58.  
  59. #include <algorithm>
  60. #include <cmath>
  61. #include <iostream>
  62.  
  63. namespace k3d
  64. {
  65.  
  66. /////////////////////////////////////////////////////////////////////////////
  67. // vector2 / point2 operations
  68.  
  69. /// Add a point and a vector, returning the moved point
  70. inline const point2 operator+(const point2& a, const vector2& b)
  71. {
  72.     return point2(a.n[0] + b.n[0], a.n[1] + b.n[1]);
  73. }
  74.  
  75. /// Add a vector and a point, returning the moved point
  76. inline const point2 operator+(const vector2& a, const point2& b)
  77. {
  78.     return point2(a.n[0] + b.n[0], a.n[1] + b.n[1]);
  79. }
  80.  
  81. /// Subtracts a vector from a point, returning the modified point
  82. inline const point2 operator-(const point2& a, const vector2& b)
  83. {
  84.     return point2(a.n[0] - b.n[0], a.n[1] - b.n[1]);
  85. }
  86.  
  87. /// Returns the vector difference between two points
  88. inline const vector2 operator-(const point2& a, const point2& b)
  89. {
  90.     return vector2(a.n[0] - b.n[0], a.n[1] - b.n[1]);
  91. }
  92.  
  93. inline point2& point2::operator+=(const vector2& v)
  94. {
  95.     n[0] += v.n[0];
  96.     n[1] += v.n[1];
  97.     return *this;
  98. }
  99.  
  100. inline point2& point2::operator-=(const vector2& v)
  101. {
  102.     n[0] -= v.n[0];
  103.     n[1] -= v.n[1];
  104.     return *this;
  105. }
  106.  
  107. /////////////////////////////////////////////////////////////////////////////
  108. // vector3 / point3 operations
  109.  
  110. /// Add a point and a vector, returning the modified point
  111. inline const point3 operator+(const point3& a, const vector3& b)
  112. {
  113.     return point3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);
  114. }
  115.  
  116. /// Adds a vector and a point, returning the modified point
  117. inline const point3 operator+(const vector3& a, const point3& b)
  118. {
  119.     return point3(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2]);
  120. }
  121.  
  122. /// Subtracts a vector from a point, returning the modified point
  123. inline const point3 operator-(const point3& a, const vector3& b)
  124. {
  125.     return point3(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2]);
  126. }
  127.  
  128. /// Returns the vector difference between two points
  129. inline const vector3 operator-(const point3& a, const point3& b)
  130. {
  131.     return vector3(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2]);
  132. }
  133.  
  134. inline point3& point3::operator+=(const vector3& v)
  135. {
  136.     n[0] += v.n[0]; n[1] += v.n[1]; n[2] += v.n[2]; return *this;
  137. }
  138.  
  139. inline point3& point3::operator-=(const vector3& v)
  140. {
  141.     n[0] -= v.n[0]; n[1] -= v.n[1]; n[2] -= v.n[2]; return *this;
  142. }
  143.  
  144. //////////////////////////////////////////////////////////////////////////////
  145. // vector3 / normal3 operations
  146.  
  147. /// Returns the dot product of a vector and a normal
  148. inline const double operator*(const vector3& a, const normal3& b)
  149. {
  150.     return a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2];
  151. }
  152.  
  153. /// Returns the dot product of a normal and a vector
  154. inline const double operator*(const normal3& a, const vector3& b)
  155. {
  156.     return a.n[0] * b.n[0] + a.n[1] * b.n[1] + a.n[2] * b.n[2];
  157. }
  158.  
  159. /// Returns the cross product of a vector and a normal
  160. inline const vector3 operator^(const vector3& a, const normal3& b)
  161. {
  162.     return vector3(a.n[1] * b.n[2] - a.n[2] * b.n[1], a.n[2] * b.n[0] - a.n[0] * b.n[2], a.n[0] * b.n[1] - a.n[1] * b.n[0]);
  163. }
  164.  
  165. /// Returns the cross product of a normal and a vector
  166. inline const vector3 operator^(const normal3& a, const vector3& b)
  167. {
  168.     return vector3(a.n[1] * b.n[2] - a.n[2] * b.n[1], a.n[2] * b.n[0] - a.n[0] * b.n[2], a.n[0] * b.n[1] - a.n[1] * b.n[0]);
  169. }
  170.  
  171. /////////////////////////////////////////////////////////////////////////////
  172. // vector4 / point4 operations
  173.  
  174. /// Add a point and a vector, returning the modified point
  175. inline const point4 operator+(const point4& a, const vector4& b)
  176. {
  177.     return point4(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2], a.n[3] + b.n[3]);
  178. }
  179.  
  180. /// Adds a vector and a point, returning the modified point
  181. inline const point4 operator+(const vector4& a, const point4& b)
  182. {
  183.     return point4(a.n[0] + b.n[0], a.n[1] + b.n[1], a.n[2] + b.n[2], a.n[3] + b.n[3]);
  184. }
  185.  
  186. /// Subtracts a vector from a point, returning the modified point
  187. inline const point4 operator-(const point4& a, const vector4& b)
  188. {
  189.     return point4(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2], a.n[3] - b.n[3]);
  190. }
  191.  
  192. /// Returns the vector difference between two points
  193. inline const vector4 operator-(const point4& a, const point4& b)
  194. {
  195.     return vector4(a.n[0] - b.n[0], a.n[1] - b.n[1], a.n[2] - b.n[2], a.n[3] - b.n[3]);
  196. }
  197.  
  198. inline point4& point4::operator+=(const vector4& v)
  199. {
  200.     n[0] += v.n[0]; n[1] += v.n[1]; n[2] += v.n[2]; n[3] += v.n[3]; return *this;
  201. }
  202.  
  203. inline point4& point4::operator-=(const vector4& v)
  204. {
  205.     n[0] -= v.n[0]; n[1] -= v.n[1]; n[2] -= v.n[2]; n[3] -= v.n[3]; return *this;
  206. }
  207.  
  208. //////////////////////////////////////////////////////////////////////////
  209. // Odds-and-ends
  210.  
  211. /// Converts homogeneous coordinates to Cartesian.
  212. inline const point3 cartesian(const point4& p)
  213. {
  214.     double_t denom_inv = (p.n[3] == 0) ? double_t(1.0) : double_t(1.0) / p.n[3];
  215.     return point3(p.n[0] * denom_inv, p.n[1] * denom_inv, p.n[2] * denom_inv);
  216. }
  217.  
  218. /// Returns the distance between two points
  219. inline const double distance(const point2& P1, const point2& P2)
  220. {
  221.     return length(P2 - P1);
  222. }
  223.  
  224. /// Returns the distance between two points
  225. inline const double distance(const point3& P1, const point3& P2)
  226. {
  227.     return length(P2 - P1);
  228. }
  229.  
  230. /// Returns the distance between two points
  231. inline const double distance(const point4& P1, const point4& P2)
  232. {
  233.     return length(P2 - P1);
  234. }
  235.  
  236. /// Explicit conversion
  237. inline const vector2 to_vector(const point2& v)
  238. {
  239.     return vector2(v.n[0], v.n[1]);
  240. }
  241.  
  242. /// Explicit conversion
  243. inline const point3 to_point(const vector3& v)
  244. {
  245.     return point3(v.n[0], v.n[1], v.n[2]);
  246. }
  247.  
  248. /// Explicit conversion
  249. inline const point3 to_point(const normal3& v)
  250. {
  251.     return point3(v.n[0], v.n[1], v.n[2]);
  252. }
  253.  
  254. /// Explicit conversion
  255. inline const vector3 to_vector(const point3& v)
  256. {
  257.     return vector3(v.n[0], v.n[1], v.n[2]);
  258. }
  259.  
  260. /// Explicit conversion
  261. inline const vector3 to_vector(const normal3& v)
  262. {
  263.     return vector3(v.n[0], v.n[1], v.n[2]);
  264. }
  265.  
  266. /// Explicit conversion
  267. inline const normal3 to_normal(const point3& v)
  268. {
  269.     return normal3(v.n[0], v.n[1], v.n[2]);
  270. }
  271.  
  272. /// Explicit conversion
  273. inline const normal3 to_normal(const vector3& v)
  274. {
  275.     return normal3(v.n[0], v.n[1], v.n[2]);
  276. }
  277.  
  278. /// Explicit conversion
  279. inline const vector4 to_vector(const point4& v)
  280. {
  281.     return vector4(v.n[0], v.n[1], v.n[2], v.n[3]);
  282. }
  283.  
  284. /// Explicit conversion
  285. inline const point4 to_point(const vector4& v)
  286. {
  287.     return point4(v.n[0], v.n[1], v.n[2], v.n[3]);
  288. }
  289.  
  290. } // namespace k3d
  291.  
  292. #endif // !K3DSDK_VECTORS_H
  293.  
  294.