DUMB3D.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:10k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /**************************************************************************
  2.   dumb3d.h - A simple linear algebra library for 3D.
  3.  **************************************************************************/
  4. /**************************************************************************
  5.     (C) Copyright 1995-1997 Microsoft Corp.  All rights reserved.
  6.     You have a royalty-free right to use, modify, reproduce and 
  7.     distribute the Sample Files (and/or any modified version) in 
  8.     any way you find useful, provided that you agree that 
  9.     Microsoft has no warranty obligations or liability for any 
  10.     Sample Application Files which are modified. 
  11.  **************************************************************************/
  12. #if !defined(DUMB3D_HPP)
  13. #define DUMB3D_HPP
  14. /*----------------------------------------------------------------------------
  15. This header contains the declarations for the dumb3d functions.
  16. */
  17. // real type
  18. typedef double real;
  19. #define M_PI            3.14159265358979323846
  20. // forward declarations
  21. class point_4;
  22. class vector_4;
  23. class matrix_4x4;
  24. /*----------------------------------------------------------------------------
  25. globally useful functions.
  26. */
  27. inline vector_4 operator-( point_4 const &Operand1, point_4 const &Operand2 );
  28. inline vector_4 operator+( vector_4 const &Operand1,
  29.     vector_4 const &Operand2 );
  30. inline vector_4 operator-( vector_4 const &Operand1,
  31.     vector_4 const &Operand2 );
  32. inline vector_4 operator*( vector_4 const &Multiplicand,
  33.     real const &Multiplier );
  34. inline vector_4 operator*( real const &Multiplier,
  35.     vector_4 const &Multiplicand );
  36.     
  37. inline point_4 operator+( point_4 const &Operand1, vector_4 const &Operand2 );
  38. inline point_4 operator-( point_4 const &Operand1, vector_4 const &Operand2 );
  39. inline point_4 operator+( vector_4 const &Operand2, point_4 const &Operand1 );
  40. inline vector_4 operator-( vector_4 const &Operand1 );
  41. inline vector_4 CrossProduct( vector_4 const &Operand1,
  42.     vector_4 const &Operand2 );
  43. inline real DotProduct( vector_4 const &Operand1, vector_4 const &Operand2 );
  44. matrix_4x4 operator*( matrix_4x4 const &Multiplicand,
  45.     matrix_4x4 const &Multiplier );
  46. vector_4 operator*( matrix_4x4 const &Multiplicand,
  47.     vector_4 const &Multiplier );
  48. point_4 operator*( matrix_4x4 const &Multiplicand,
  49.     point_4 const &Multiplier );
  50. /*----------------------------------------------------------------------------
  51. quadruple.  Base class for homogeneous vectors and points.
  52. */
  53. class quadruple
  54. {
  55. public:
  56.   inline real GetElement( int Row ) const;
  57.   inline real GetX( void ) const;
  58.   inline real GetY( void ) const;
  59.   inline real GetZ( void ) const;
  60.   inline real GetW( void ) const;
  61.   inline void SetElement( int Row, real Value );
  62.   inline void SetX( real Value );
  63.   inline void SetY( real Value );
  64.   inline void SetZ( real Value );
  65.   inline void SetW( real Value );
  66. protected:
  67.   inline quadruple( void );
  68.   inline quadruple( real X, real Y, real Z, real W );
  69.   inline quadruple( quadruple const & );
  70.   inline quadruple &operator=( quadruple const & );
  71.   
  72.   real aElements[4];
  73. };
  74. /*----------------------------------------------------------------------------
  75. point_4.  This class represents a homogeneous 3D point.
  76. */
  77. class point_4 :
  78.   public quadruple
  79. {
  80. public:
  81.   inline point_4( void );
  82.   inline point_4( real X, real Y, real Z );
  83.   inline void Homogenize( void );
  84. };
  85. /*----------------------------------------------------------------------------
  86. vector_4.  This class represents a homogeneous 3D vector.
  87. */
  88. class vector_4 :
  89.   public quadruple
  90. {
  91. public:
  92.   inline vector_4( void );
  93.   inline vector_4( real X, real Y, real Z );
  94.   vector_4 &Normalize( void );
  95. };
  96. /*----------------------------------------------------------------------------
  97. matrix_4x4.  This class represents row major 4x4 homogeneous matrices.
  98. */
  99. class matrix_4x4
  100. {
  101. public:
  102.   matrix_4x4( void );
  103.   matrix_4x4 &ConcatenateXRotation( real Degrees );
  104.   matrix_4x4 &ConcatenateYRotation( real Degrees );
  105.   matrix_4x4 &ConcatenateZRotation( real Degrees );
  106.   matrix_4x4 &ConcatenateXTranslation( real Distance );
  107.   matrix_4x4 &ConcatenateYTranslation( real Distance );
  108.   matrix_4x4 &ConcatenateZTranslation( real Distance );
  109.   inline real GetElement( int Row, int Column ) const;
  110.   inline matrix_4x4 &SetElement( int Row, int Column, real Value );
  111.   inline matrix_4x4 & operator=(matrix_4x4 const & m);
  112.   
  113. protected:
  114.   enum do_not_initialize { DoNotInitialize };
  115.   inline matrix_4x4( do_not_initialize );
  116.   real aElements[4][4];
  117. };
  118. /*----------------------------------------------------------------------------
  119. view transform.
  120. */
  121. class view_transform :
  122.   public matrix_4x4
  123. {
  124. public:
  125.   view_transform( point_4 const &Viewpoint, vector_4 const &ViewDirection,
  126.     vector_4 const &Up );
  127. };
  128. /*----------------------------------------------------------------------------
  129. inline function definitions.
  130. */
  131. inline vector_4 operator-( point_4 const &Operand1, point_4 const &Operand2 )
  132. {
  133.   return vector_4(Operand1.GetX() - Operand2.GetX(),
  134.           Operand1.GetY() - Operand2.GetY(),
  135.           Operand1.GetZ() - Operand2.GetZ());
  136. }
  137. inline vector_4 operator+( vector_4 const &Operand1,
  138.     vector_4 const &Operand2 )
  139. {
  140.   return vector_4(Operand1.GetX() + Operand2.GetX(),
  141.           Operand1.GetY() + Operand2.GetY(),
  142.           Operand1.GetZ() + Operand2.GetZ());
  143. }
  144. inline vector_4 operator-( vector_4 const &Operand1,
  145.     vector_4 const &Operand2 )
  146. {
  147.   return vector_4(Operand1.GetX() - Operand2.GetX(),
  148.           Operand1.GetY() - Operand2.GetY(),
  149.           Operand1.GetZ() - Operand2.GetZ());
  150. }
  151. inline vector_4 operator-( vector_4 const &Operand1 )
  152. {
  153.   return vector_4(-Operand1.GetX(),-Operand1.GetY(),-Operand1.GetZ());
  154. }
  155. inline vector_4 operator*( vector_4 const &Multiplicand,
  156.     real const &Multiplier )
  157. {
  158.   return vector_4(Multiplicand.GetX() * Multiplier,
  159.           Multiplicand.GetY() * Multiplier,
  160.           Multiplicand.GetZ() * Multiplier);
  161. }
  162. inline vector_4 operator*( real const &Multiplier,
  163.     vector_4 const &Multiplicand ) 
  164. {
  165.   return vector_4(Multiplicand.GetX() * Multiplier,
  166.           Multiplicand.GetY() * Multiplier,
  167.           Multiplicand.GetZ() * Multiplier);
  168. }
  169.     
  170. inline point_4 operator+( point_4 const &Operand1, vector_4 const &Operand2 )
  171. {
  172.   return point_4(Operand1.GetX() + Operand2.GetX(),
  173.           Operand1.GetY() + Operand2.GetY(),
  174.           Operand1.GetZ() + Operand2.GetZ());
  175. }
  176. inline point_4 operator-( point_4 const &Operand1, vector_4 const &Operand2 )
  177. {
  178.   return point_4(Operand1.GetX() - Operand2.GetX(),
  179.           Operand1.GetY() - Operand2.GetY(),
  180.           Operand1.GetZ() - Operand2.GetZ());
  181. }
  182. inline point_4 operator+( vector_4 const &Operand1, point_4 const &Operand2 )
  183. {
  184.   return Operand2 + Operand1;
  185. }
  186. inline vector_4 CrossProduct( vector_4 const &Operand1,
  187.     vector_4 const &Operand2 )
  188. {
  189.   real X = Operand1.GetY() * Operand2.GetZ() -
  190.         Operand1.GetZ() * Operand2.GetY();
  191.   real Y = Operand1.GetZ() * Operand2.GetX() -
  192.         Operand1.GetX() * Operand2.GetZ();
  193.   real Z = Operand1.GetX() * Operand2.GetY() -
  194.         Operand1.GetY() * Operand2.GetX();
  195.   return vector_4(X,Y,Z);
  196. }
  197. inline real DotProduct( vector_4 const &Operand1, vector_4 const &Operand2 )
  198. {
  199.   return Operand1.GetX() * Operand2.GetX() +
  200.       Operand1.GetY() * Operand2.GetY() +
  201.       Operand1.GetZ() * Operand2.GetZ();
  202. }
  203. inline real quadruple::GetElement( int Row ) const
  204. {
  205.   return aElements[Row];
  206. }
  207. inline real quadruple::GetX( void ) const
  208. {
  209.   return aElements[0];
  210. }
  211. inline real quadruple::GetY( void ) const
  212. {
  213.   return aElements[1];
  214. }
  215. inline real quadruple::GetZ( void ) const
  216. {
  217.   return aElements[2];
  218. }
  219. inline real quadruple::GetW( void ) const
  220. {
  221.   return aElements[3];
  222. }
  223. inline void quadruple::SetElement( int Row, real Value )
  224. {
  225.   aElements[Row] = Value;
  226. }
  227. inline void quadruple::SetX( real Value )
  228. {
  229.   aElements[0] = Value;
  230. }
  231. inline void quadruple::SetY( real Value )
  232. {
  233.   aElements[1] = Value;
  234. }
  235. inline void quadruple::SetZ( real Value )
  236. {
  237.   aElements[2] = Value;
  238. }
  239. inline void quadruple::SetW( real Value )
  240. {
  241.   aElements[3] = Value;
  242. }
  243. inline void point_4::Homogenize( void )
  244. {
  245.   aElements[0] = aElements[0] / aElements[3];
  246.   aElements[1] = aElements[1] / aElements[3];
  247.   aElements[2] = aElements[2] / aElements[3];
  248. }
  249. inline quadruple::quadruple( void )
  250. {
  251.   aElements[0] = aElements[1] = aElements[2] = aElements[3] = 0;
  252. }
  253. inline quadruple::quadruple( real X, real Y, real Z, real W )
  254. {
  255.   aElements[0] = X;
  256.   aElements[1] = Y;
  257.   aElements[2] = Z;
  258.   aElements[3] = W;
  259. }
  260. inline quadruple::quadruple( quadruple const &Source )
  261. {
  262.   aElements[0] = Source.aElements[0];
  263.   aElements[1] = Source.aElements[1];
  264.   aElements[2] = Source.aElements[2];
  265.   aElements[3] = Source.aElements[3];
  266. }
  267. inline quadruple &quadruple::operator=( quadruple const &Source )
  268. {
  269.   aElements[0] = Source.aElements[0];
  270.   aElements[1] = Source.aElements[1];
  271.   aElements[2] = Source.aElements[2];
  272.   aElements[3] = Source.aElements[3];
  273.   return *this;
  274. }
  275. inline point_4::point_4( void ) :
  276.   quadruple(0,0,0,1)
  277. {
  278. }
  279. inline point_4::point_4( real X, real Y, real Z ) :
  280.   quadruple(X,Y,Z,1)
  281. {
  282. #if 0
  283.   char aBuffer[100];
  284.   sprintf(aBuffer,"X: %f Y: %f Z: %f",X,Y,Z);
  285.   MessageBox(0,aBuffer,"foobar",MB_OK);
  286.   sprintf(aBuffer,"X: %f Y: %f Z: %f W:%f",aElements[0],aElements[1],
  287.     aElements[2],aElements[3]);
  288.   MessageBox(0,aBuffer,"foobar",MB_OK);
  289. #endif
  290. }
  291. inline vector_4::vector_4( void ) :
  292.   quadruple(0,0,0,0)
  293. {
  294. }
  295. inline vector_4::vector_4( real X, real Y, real Z ) :
  296.   quadruple(X,Y,Z,0)
  297. {
  298. }
  299. inline real matrix_4x4::GetElement( int Row, int Column ) const
  300. {
  301.   return aElements[Row][Column];
  302. }
  303. inline matrix_4x4 &matrix_4x4::SetElement( int Row, int Column, real Value )
  304. {
  305.   aElements[Row][Column] = Value;
  306.   return *this;
  307. }
  308. inline matrix_4x4::matrix_4x4( do_not_initialize )
  309. {
  310. }
  311. inline matrix_4x4 & matrix_4x4::operator=(matrix_4x4 const & m)
  312. {
  313.     memcpy((void *) aElements, (void *) m.aElements,sizeof(aElements));
  314.     return *this;
  315. }
  316. #endif