MathDefs.cpp
上传用户:owen_mei
上传日期:2022-08-09
资源大小:2263k
文件大小:4k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // MathDefs.cpp: implementation of the CMathDefs class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Billiard.h"
  6. #include "MathDefs.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CMathDefs::CMathDefs()
  16. {
  17. }
  18. CMathDefs::~CMathDefs()
  19. {
  20. }
  21. //  下面的函数的功能是定义一个单位矩阵
  22. void CMathDefs::IdentityMatrix(tMatrix *mat) 
  23. {
  24. int loop;
  25. for (loop = 0; loop < 16; loop++)
  26. mat->m[loop] = 0.0f;
  27. mat->m[0] = mat->m[5] = mat->m[10] = mat->m[15] = 1.0f;
  28. }
  29. ///////////////////////////////////////////////////////////////////////////////
  30. // Function: MultVectorByMatrix
  31. // Purpose: Multiplies a vector by a 4x4 Matrix in OpenGL Format
  32. // Arguments: Matrix, Vector in, and result Vector
  33. // Notes: This routing is tweaked to handle OpenGLs column-major format
  34. // This is one obvious place for optimization perhaps asm code
  35. ///////////////////////////////////////////////////////////////////////////////
  36. void CMathDefs::MultVectorByMatrix(tMatrix *mat, tVector *v,tVector *result)
  37. {
  38. result->x = (mat->m[0] * v->x) + (mat->m[4] * v->y) + (mat->m[8] * v->z) +
  39.      mat->m[12];
  40. result->y = (mat->m[1] * v->x) + (mat->m[5] * v->y) + (mat->m[9] * v->z) +
  41.      mat->m[13];
  42. result->z = (mat->m[2] * v->x) + (mat->m[6] * v->y) + (mat->m[10] * v->z) +
  43.      mat->m[14];
  44. }
  45. //// MultVectorByMatrix //////////////////////////////////////////////////////
  46. ///////////////////////////////////////////////////////////////////////////////
  47. // Function: MultVectorByRotMatrix
  48. // Purpose: Multiplies a vector by a 4x4 Rotation Matrix in OpenGL Format
  49. // Arguments: Matrix, Vector in, and result Vector
  50. // Notes: This routing is tweaked to handle OpenGLs column-major format
  51. // This is one obvious place for optimization perhaps asm code
  52. ///////////////////////////////////////////////////////////////////////////////
  53. void CMathDefs::MultVectorByRotMatrix(tMatrix *mat, tVector *v,tVector *result)
  54. {
  55. result->x = (mat->m[0] * v->x) + (mat->m[4] * v->y) + (mat->m[8] * v->z);
  56. result->y = (mat->m[1] * v->x) + (mat->m[5] * v->y) + (mat->m[9] * v->z);
  57. result->z = (mat->m[2] * v->x) + (mat->m[6] * v->y) + (mat->m[10] * v->z);
  58. }
  59. //// MultVectorByRotMatrix ///////////////////////////////////////////////////
  60. //  下面的函数的功能是求矢量模的平方,即矢量长度的平方  
  61. double CMathDefs::VectorSquaredLength(tVector *v) 
  62. {
  63. return((v->x * v->x) + (v->y * v->y) + (v->z * v->z));
  64. }
  65. //  下面的函数的功能是求矢量的模,即矢量的长度
  66. double CMathDefs::VectorLength(tVector *v) 
  67. {
  68. return(sqrt(VectorSquaredLength(v)));
  69. }
  70. //  下面的函数的功能是求一个矢量的单位化矢量
  71. void CMathDefs::NormalizeVector(tVector *v) 
  72. {
  73. float len = (float)VectorLength(v);
  74.     if (len != 0.0) 
  75. v->x /= len;  
  76. v->y /= len; 
  77. v->z /= len; 
  78. }
  79. }
  80. //  下面的函数的功能是求两个矢量的点积
  81. double CMathDefs::DotProduct(tVector *v1, tVector *v2)
  82. {
  83. return ((v1->x * v2->x) + (v1->y * v2->y) + (v1->z * v2->z));
  84. }
  85. //  下面的函数的功能是求两个矢量的叉积
  86. void CMathDefs::CrossProduct(tVector *v1, tVector *v2, tVector *result)
  87. {
  88. result->x = (v1->y * v2->z) - (v1->z * v2->y);
  89. result->y = (v1->z * v2->x) - (v1->x * v2->z);
  90. result->z = (v1->x * v2->y) - (v1->y * v2->x);
  91. }
  92. double CMathDefs::VectorSquaredDistance(tVector *v1, tVector *v2) 
  93. {
  94. return( ((v1->x - v2->x) * (v1->x - v2->x)) + 
  95. ((v1->y - v2->y) * (v1->y - v2->y)) + 
  96. ((v1->z - v2->z) * (v1->z - v2->z)) ); 
  97. }
  98. //  下面的函数的功能是将矢量缩放一个因子
  99. void CMathDefs::ScaleVector(tVector *v, float scale, tVector *result) 
  100. {
  101. result->x = v->x * scale;
  102. result->y = v->y * scale;
  103. result->z = v->z * scale;
  104. }
  105. //  下面的函数的功能是求两个矢量的和
  106. void CMathDefs::VectorSum(tVector *v1, tVector *v2, tVector *result) 
  107. {
  108. result->x = v1->x + v2->x;
  109. result->y = v1->y + v2->y;
  110. result->z = v1->z + v2->z;
  111. }
  112. //  下面的函数的功能是求两个矢量的差
  113. void CMathDefs::VectorDifference(tVector *v1, tVector *v2, tVector *result) 
  114. {
  115. result->x = v1->x - v2->x;
  116. result->y = v1->y - v2->y;
  117. result->z = v1->z - v2->z;
  118. }