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

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_AABBOX
  2. #define AF_AABBOX
  3. #include "afVec3.h"
  4. #include "afMathTool.h"
  5. #include "afPlane.h"
  6. #include <math.h>
  7. /// Axis aligned bounding box
  8. /**
  9.  *  An axis aligned bounding box can be calculated
  10.  *  very effectivly. A AABBox is defined by only two
  11.  *  vertices (corners).
  12.  */
  13. class afAABBox // axis aligned bounding box
  14. {
  15. public:
  16. // constructors
  17. afAABBox()  {  reset();  }
  18. afAABBox(const afVec3& nMin, const afVec3& nMax) : minVertex(nMin), maxVertex(nMax)  {}
  19. afAABBox(const afVec3& nMid, float dx, float dy, float dz) : minVertex(nMid[0]-dx/2.0f, nMid[1]-dy/2.0f, nMid[2]-dz/2.0f),
  20.  maxVertex(nMid[0]+dx/2.0f, nMid[1]+dy/2.0f, nMid[2]+dz/2.0f)
  21. {}
  22. /// Sets one corner of the bounding box
  23. void setMin(const afVec3& nVertex)  {  minVertex = nVertex;  }
  24. /// Sets another corner of the bounding box
  25. void setMax(const afVec3& nVertex)  {  maxVertex = nVertex;  }
  26. /// Extends the box to contain the given vertex
  27. inline void addVertex(const afVec3& nVertex);
  28. /// Extends the box to contain an other box
  29. inline void addBox(const afAABBox& nOther);
  30. // Uncreases the box, so that it would fit, if it was rotated by nAngle
  31. inline void exentedByRotationY(float nAngle);
  32. /// Calculates and returns the center of the box
  33. afVec3 getCenter() const  {  return (maxVertex+minVertex)*0.5f;  }
  34. /// Moves the box by nMove
  35. void move(const afVec3& nMove)  {  minVertex += nMove;  maxVertex += nMove;  }
  36. /// Resets the box to contain everything
  37. void 
  38. reset()
  39. {
  40. maxVertex = afVec3(afFLOAT_MIN,afFLOAT_MIN,afFLOAT_MIN);
  41. minVertex = afVec3(afFLOAT_MAX,afFLOAT_MAX,afFLOAT_MAX);
  42. };
  43. /// Resets the box to be centered at nMid and to have each side of length d
  44. void
  45. setMid(const afVec3& nMid, float d)
  46. {
  47. setMid(nMid, d,d,d);
  48. }
  49. /// Resets the box to be centered at nMid and to have size dx,dy,dz
  50. void
  51. setMid(const afVec3& nMid, float dx, float dy, float dz)
  52. {
  53. minVertex = afVec3(nMid[0]-dx/2.0f, nMid[1]-dy/2.0f, nMid[2]-dz/2.0f);
  54. maxVertex = afVec3(nMid[0]+dx/2.0f, nMid[1]+dy/2.0f, nMid[2]+dz/2.0f);
  55. }
  56. /// returns one point of the box
  57. const afVec3&
  58. getMin() const  {  return minVertex;  }
  59. /// returns the other point of the box
  60. const afVec3&
  61. getMax() const  {  return maxVertex;  }
  62. /// returns the center of the box
  63. afVec3
  64. getMid() const  {  return afVec3(minVertex[0] + (maxVertex[0] - minVertex[0]) / 2.0f,
  65.  minVertex[1] + (maxVertex[1] - minVertex[1]) / 2.0f,
  66.  minVertex[2] + (maxVertex[2] - minVertex[2]) / 2.0f);  }
  67. // testing functions
  68. //
  69. inline bool
  70. doesOverlap(const afAABBox& nOther) const;
  71. protected:
  72. afVec3 minVertex,
  73. maxVertex;
  74. };
  75. inline void afAABBox::addVertex(const afVec3& nVertex)
  76. {
  77. // is there a new max
  78. if (maxVertex[0] == afFLOAT_MIN)
  79. maxVertex = nVertex;
  80. else
  81. {
  82. if (nVertex[0] > maxVertex[0])
  83. maxVertex[0] = nVertex[0];
  84. if (nVertex[1] > maxVertex[1])
  85. maxVertex[1] = nVertex[1];
  86. if (nVertex[2] > maxVertex[2])
  87. maxVertex[2] = nVertex[2];
  88. }
  89. // is there a new min
  90. if (minVertex[0] == afFLOAT_MAX)
  91. minVertex = nVertex;
  92. else
  93. {
  94. if (nVertex[0] < minVertex[0])
  95. minVertex[0] = nVertex[0];
  96. if (nVertex[1] < minVertex[1])
  97. minVertex[1] = nVertex[1];
  98. if (nVertex[2] < minVertex[2])
  99. minVertex[2] = nVertex[2];
  100. }
  101. }
  102. inline void afAABBox::addBox(const afAABBox& nOther)
  103. {
  104. addVertex(nOther.maxVertex);
  105. addVertex(nOther.minVertex);
  106. }
  107. inline bool afAABBox::doesOverlap(const afAABBox& nOther) const
  108. {
  109. return !(minVertex.x>nOther.maxVertex.x || nOther.minVertex.x>maxVertex.x ||
  110.  minVertex.y>nOther.maxVertex.y || nOther.minVertex.y>maxVertex.y ||
  111.  minVertex.z>nOther.maxVertex.z || nOther.minVertex.z>maxVertex.z);
  112. }
  113. inline void afAABBox::exentedByRotationY(float nAngle)
  114. {
  115. float cosA = (float)cos(nAngle),
  116. sinA = (float)sin(nAngle);
  117. int i;
  118. afVec3 corners[8], dest;
  119. corners[0].set(minVertex.x, minVertex.y, minVertex.z);
  120. corners[1].set(maxVertex.x, minVertex.y, minVertex.z);
  121. corners[2].set(minVertex.x, maxVertex.y, minVertex.z);
  122. corners[3].set(maxVertex.x, maxVertex.y, minVertex.z);
  123. corners[4].set(minVertex.x, minVertex.y, maxVertex.z);
  124. corners[5].set(maxVertex.x, minVertex.y, maxVertex.z);
  125. corners[6].set(minVertex.x, maxVertex.y, maxVertex.z);
  126. corners[7].set(maxVertex.x, maxVertex.y, maxVertex.z);
  127. for(i=0; i<8; i++)
  128. {
  129. dest.x =  corners[i].x * cosA + corners[i].z * sinA;
  130. dest.y =  corners[i].y;
  131. dest.z = -corners[i].x * sinA + corners[i].z * cosA;
  132. addVertex(dest);
  133. }
  134. }
  135. #endif