aabox.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // aabox.h
  2. //
  3. // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
  4. //
  5. // Axis-aligned bounding box class
  6. //
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU General Public License
  9. // as published by the Free Software Foundation; either version 2
  10. // of the License, or (at your option) any later version.
  11. #ifndef _AABOX_H_
  12. #define _AABOX_H_
  13. #include <celmath/vecmath.h>
  14. class AxisAlignedBox
  15. {
  16.  public:
  17.     inline AxisAlignedBox();
  18.     AxisAlignedBox(Point3f _min, Point3f _max) :
  19.         minimum(_min), maximum(_max) {};
  20.     AxisAlignedBox(Point3f center) :
  21.         minimum(center), maximum(center) {};
  22.     inline Point3f getMinimum() const;
  23.     inline Point3f getMaximum() const;
  24.     inline Point3f getCenter() const;
  25.     inline Vec3f getExtents() const;
  26.     inline bool empty() const;
  27.     inline bool contains(const Point3f&) const;
  28.     inline void include(const Point3f&);
  29.     inline void include(const AxisAlignedBox&);
  30.  private:    
  31.     Point3f minimum;
  32.     Point3f maximum;
  33. };
  34. AxisAlignedBox::AxisAlignedBox() :
  35.     minimum(1.0e20f, 1.0e20f, 1.0e20f),
  36.     maximum(-1.0e20f, -1.0e20f, -1.0e20f)
  37. {
  38. }
  39. Point3f AxisAlignedBox::getMinimum() const
  40. {
  41.     return minimum;
  42. }
  43. Point3f AxisAlignedBox::getMaximum() const
  44. {
  45.     return maximum;
  46. }
  47. Point3f AxisAlignedBox::getCenter() const
  48. {
  49.     return Point3f((minimum.x + maximum.x) * 0.5f,
  50.                    (minimum.y + maximum.y) * 0.5f,
  51.                    (minimum.z + maximum.z) * 0.5f);
  52. }
  53. Vec3f AxisAlignedBox::getExtents() const
  54. {
  55.     return maximum - minimum;
  56. }
  57. bool AxisAlignedBox::empty() const
  58. {
  59.     return maximum.x < minimum.x || maximum.y < minimum.y || maximum.z < minimum.z;
  60. }
  61. bool AxisAlignedBox::contains(const Point3f& p) const
  62. {
  63.     return (p.x >= minimum.x && p.x <= maximum.x &&
  64.             p.y >= minimum.y && p.y <= maximum.y &&
  65.             p.z >= minimum.z && p.z <= maximum.z);
  66. }
  67. void AxisAlignedBox::include(const Point3f& p)
  68. {
  69.     if (p.x < minimum.x) minimum.x = p.x;
  70.     if (p.x > maximum.x) maximum.x = p.x;
  71.     if (p.y < minimum.y) minimum.y = p.y;
  72.     if (p.y > maximum.y) maximum.y = p.y;
  73.     if (p.z < minimum.z) minimum.z = p.z;
  74.     if (p.z > maximum.z) maximum.z = p.z;
  75. }
  76. void AxisAlignedBox::include(const AxisAlignedBox& b)
  77. {
  78.     if (b.minimum.x < minimum.x) minimum.x = b.minimum.x;
  79.     if (b.maximum.x > maximum.x) maximum.x = b.maximum.x;
  80.     if (b.minimum.y < minimum.y) minimum.y = b.minimum.y;
  81.     if (b.maximum.y > maximum.y) maximum.y = b.maximum.y;
  82.     if (b.minimum.z < minimum.z) minimum.z = b.minimum.z;
  83.     if (b.maximum.z > maximum.z) maximum.z = b.maximum.z;
  84. }
  85. #if 0
  86. AxisAlignedBox union(const AxisAlignedBox& a, const AxisAlignedBox& b)
  87. {
  88.     AxisAlignedBox box(a);
  89.     box.union(b);
  90.     return box;
  91. }
  92. #endif
  93. #endif // _AABOX_H_