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

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_MATHTOOL
  2. #define AF_MATHTOOL
  3. #define afFLOAT_MIN 1.175494351e-38f
  4. #define afFLOAT_MAX 3.402823466e+38f
  5. #define afINT_MIN -(2147483647+1)
  6. #define afINT_MAX 2147483647
  7. #define afEPS 0.00001f
  8. #define afEPSL 0.05f
  9. #define afFPI 3.14159265f
  10. #define afFTWOPI 6.28318531f
  11. #define afFTWOPIRAND afFTWOPI/RAND_MAX
  12. #define afDECTORAD afFPI/180.0f
  13. #define af360RAND 360.0f/RAND_MAX
  14. class afPlane;
  15. class afVec3;
  16. class afVec3n;
  17. /// afIMathTool provides mathematical routines for 3d calculations
  18. class afMathTool
  19. {
  20. public:
  21. /// Initializes the tables used by sin() and cos()
  22. /**
  23.  *  This method must be called before sin() or cos() can be called.
  24.  */
  25. static void initSinCos();
  26. /// Initializes the tables used by sqrt()
  27. /**
  28.  *  This method must be called before sqrt() can be called.
  29.  */
  30. static void initSqrt();
  31. /// Uses a sine table for fast sinus calculation
  32. /**
  33.  *  Returns the sine of nVal
  34.  *  CAUTION: nVal has to be passed in degrees
  35.  */
  36. static float sin(float nVal);
  37. /// Uses a cosine table for fast calculation
  38. /**
  39.  *  Returns the cosine of nVal
  40.  *  CAUTION: nVal has to be passed in degrees
  41.  */
  42. static float cos(float nVal);
  43. /// Uses a sqrt table for fast sqrt calculation
  44. static float sqrt(float n);
  45. /// Calculates a random number that lies between nMin and nMax
  46. static float random(float nMin, float nMax);
  47. /// Returns true if nPoint lies in the sphere
  48. static bool
  49. isPointInSphere(const afVec3& nPoint, const afVec3& nSpherePos, float nRadius);
  50. /// Returns true if the point lies inside the triangle
  51. /**
  52.  *  It's assumed that the point always lies in the triangles plane
  53.  */
  54. static bool
  55. isPointInTriangle(const afVec3& nPoint, const afVec3& nA, const afVec3& nB, const afVec3& nC);
  56. /// Returns the closest point from nPoint on the given line
  57. static afVec3
  58. getClosestPointOnLine(const afVec3& nPoint, const afVec3& nA, const afVec3& nB);
  59. /// Returns the closest point from nPoint which lies on the triangles edges.
  60. /**
  61.  *  It's assumed that nPoint lies NOT inside the triangle
  62.  */
  63. static afVec3
  64. getClosestPointOnTriangle(const afVec3& nPoint, const afVec3& nA, const afVec3& nB, const afVec3& nC);
  65. /// Returns the signed distance of the given position to the plane
  66. static float
  67. getDistanceToPlane(const afVec3& nPos, const afPlane& nPlane);
  68. /// Returns true if a point lies behind a plane (planes are always directed)
  69. static bool
  70. isPointBehindPlane(const afVec3& nPos, const afPlane& nPlane);
  71. /// Returns true if a point lies behind all planes
  72. static bool
  73. isPointBehindPlanes(const afVec3& nPos, int nNumPlanes, const afPlane* nPlanes);
  74. /// Returns true if a point lies on the plane
  75. static bool
  76. isPointOnPlane(const afVec3& nPos, const afPlane& nPlane);
  77. /// Returns true if at least one of the points lies behind the plane
  78. static bool
  79. arePointsBehindPlane(int numPos, const afVec3* nPos, const afPlane& nPlane);
  80. /// Finds the intersection of a ray and a sphere
  81. /**
  82.  *  Returns the length of the ray in nT
  83.  *  Returns true if the ray really hit the sphere
  84.  */
  85. static bool
  86. findIntersectionRaySphere(const afVec3& nPos0, const afVec3n& nDir0, const afVec3& nSpherePos, float nRadius, float& nT);
  87. /// Finds the intersection of a ray and a plane.
  88. /**
  89.  *  Returns the position in parameter pos and signed distance of nPos0 and pos in nT
  90.  *  Returns true as return value if there was an intersection
  91.  */
  92. static bool
  93. findIntersectionRayPlane(const afPlane& nPlane, const afVec3& nPos0, const afVec3n& nDir, afVec3& nPos, float& nT);
  94. /// Finds the intersection of three planes
  95. /** Returns the point in nPoint
  96.  *  Returns true if nPoint is valid
  97.  */
  98. static bool
  99. findIntersectionPlanes(const afPlane& nPlane1, const afPlane& nPlane2, const afPlane& nPlane3, afVec3& nPoint);
  100. /// Finds the intersection of the given sphere moving into direction nDir with the given triangle.
  101. /**
  102.  *  If the sphere did already collide with the triangle nStuck is set to true
  103.  *  If nPlane is not NULL it must lie inside the triangle
  104.  *  Returns: the distance the sphere moves until it collides
  105.  *           the position on the sphere, that will collide with the triangle
  106.  *           the position on the triangle that will collide with the sphere
  107.  *          sets nStuck to true if there was already a collision on the inital position
  108.  */
  109. static bool
  110. findIntersectionSphereTriangle(const afVec3& nSpherePos, float nRadius, const afVec3& nDir,
  111.    const afVec3& nCorner1, const afVec3& nCorner2, const afVec3& nCorner3, const afPlane* nPlane, 
  112.    float& nDist, afVec3& nColSpherePos, afVec3& nColTrianglePos, bool& nStuck);
  113. protected:
  114. static float *sinTable;
  115. static float *cosTable;
  116. static unsigned int *sqrtTable;  // declare table of square roots 
  117. };
  118. #endif