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

其他游戏

开发平台:

Visual C++

  1. #pragma warning(disable: 4514)
  2. #include "afMathTool.h"
  3. #include "afPlane.h"
  4. #include "afVec3.h"
  5. #include "afVec3n.h"
  6. #include <string.h>
  7. #include <math.h>
  8. float *afMathTool::sinTable = NULL;
  9. float *afMathTool::cosTable = NULL;
  10. unsigned int *afMathTool::sqrtTable = NULL;
  11. void afMathTool::initSinCos()
  12. {
  13. int i;
  14. if(!sinTable)
  15. {
  16. sinTable = new float[3600];
  17. for(i=0; i<3600; i++)
  18. sinTable[i] = (float)::sin(i*afFTWOPI/360.0f/10.0f);
  19. }
  20. if(!cosTable)
  21. {
  22. cosTable = new float[3600];
  23. for(i=0; i<3600; i++)
  24. cosTable[i] = (float)::cos(i*afFTWOPI/360.0f/10.0f);
  25. }
  26. }
  27. void afMathTool::initSqrt()
  28. {
  29. union //FastSqrtUnion
  30. {
  31. float f;
  32. unsigned int i;
  33. }s;
  34. unsigned int i;
  35. if(!sqrtTable)
  36. {
  37. sqrtTable = new unsigned int[0x10000];
  38. for (i = 0; i <= 0x7FFF; i++)
  39. {
  40. s.i = (i << 8) | (0x7F << 23);
  41. s.f = (float)sqrt(s.f);
  42. sqrtTable[i + 0x8000] = (s.i & 0x7FFFFF);
  43. s.i = (i << 8) | (0x80 << 23);
  44. s.f = (float)sqrt(s.f);
  45. sqrtTable[i] = (s.i & 0x7FFFFF);
  46. }
  47. }
  48. }
  49. float afMathTool::sin(float nVal)
  50. {
  51. int idx = (int)(10.0f*nVal) % 3600;
  52. if(idx<0)
  53. idx += 3600;
  54. return sinTable[idx];
  55. }
  56. float afMathTool::cos(float nVal)
  57. {
  58. int idx = (int)(10.0f*nVal) % 3600;
  59. if(idx<0)
  60. idx += 3600;
  61. return cosTable[idx];
  62. }
  63. float afMathTool::sqrt(float nVal)
  64. {
  65. #define FP_BITS(fp) (*(DWORD *)&(fp))
  66. if (FP_BITS(nVal) == 0) return 0.0f;                 
  67. FP_BITS(nVal) = sqrtTable[(FP_BITS(nVal) >> 8) & 0xFFFF] | ((((FP_BITS(nVal) - 0x3F800000) >> 1) + 0x3F800000) & 0x7F800000);
  68. return nVal;
  69. }
  70. float afMathTool::random(float nMin, float nMax)
  71. {
  72. float d = nMax-nMin;
  73. float r = (rand() * d) / RAND_MAX;
  74. return nMin + r;
  75. }
  76. bool afMathTool::isPointInSphere(const afVec3& nPoint, const afVec3& nSpherePos, float nRadius) {
  77. float d = (nPoint-nSpherePos).sqrLength();
  78. return d<=nRadius*nRadius;
  79. }
  80. bool afMathTool::isPointInTriangle(const afVec3& nPoint, const afVec3& nA, const afVec3& nB, const afVec3& nC)
  81. {
  82. double total_angles = 0.0f;
  83.    
  84. afVec3 v1 = nPoint-nA,
  85. v2 = nPoint-nB,
  86. v3 = nPoint-nC;
  87. v1.normalize();
  88. v2.normalize();
  89. v3.normalize();
  90. total_angles += acos(v1*v2);
  91. total_angles += acos(v2*v3);
  92. total_angles += acos(v3*v1);
  93.  
  94. if(fabs(total_angles-afFTWOPI) <= 0.005)
  95. return true;
  96.      
  97.   return false;
  98. }
  99. afVec3 afMathTool::getClosestPointOnLine(const afVec3& nPoint, const afVec3& nA, const afVec3& nB)
  100. {
  101. // determine t (the length of the vector from 慳