00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef _AABOX_H_
00013 #define _AABOX_H_
00014
00015 #include <celmath/vecmath.h>
00016
00017 class AxisAlignedBox
00018 {
00019 public:
00020 inline AxisAlignedBox();
00021 AxisAlignedBox(Point3f _min, Point3f _max) :
00022 minimum(_min), maximum(_max) {};
00023 AxisAlignedBox(Point3f center) :
00024 minimum(center), maximum(center) {};
00025
00026 inline Point3f getMinimum() const;
00027 inline Point3f getMaximum() const;
00028 inline Point3f getCenter() const;
00029 inline Vec3f getExtents() const;
00030
00031 inline bool empty() const;
00032 inline bool contains(const Point3f&) const;
00033
00034 inline void include(const Point3f&);
00035 inline void include(const AxisAlignedBox&);
00036
00037 private:
00038 Point3f minimum;
00039 Point3f maximum;
00040 };
00041
00042
00043 AxisAlignedBox::AxisAlignedBox() :
00044 minimum(1.0e20f, 1.0e20f, 1.0e20f),
00045 maximum(-1.0e20f, -1.0e20f, -1.0e20f)
00046 {
00047 }
00048
00049 Point3f AxisAlignedBox::getMinimum() const
00050 {
00051 return minimum;
00052 }
00053
00054 Point3f AxisAlignedBox::getMaximum() const
00055 {
00056 return maximum;
00057 }
00058
00059 Point3f AxisAlignedBox::getCenter() const
00060 {
00061 return Point3f((minimum.x + maximum.x) * 0.5f,
00062 (minimum.y + maximum.y) * 0.5f,
00063 (minimum.z + maximum.z) * 0.5f);
00064 }
00065
00066 Vec3f AxisAlignedBox::getExtents() const
00067 {
00068 return maximum - minimum;
00069 }
00070
00071 bool AxisAlignedBox::empty() const
00072 {
00073 return maximum.x < minimum.x || maximum.y < minimum.y || maximum.z < minimum.z;
00074 }
00075
00076 bool AxisAlignedBox::contains(const Point3f& p) const
00077 {
00078 return (p.x >= minimum.x && p.x <= maximum.x &&
00079 p.y >= minimum.y && p.y <= maximum.y &&
00080 p.z >= minimum.z && p.z <= maximum.z);
00081 }
00082
00083
00084 void AxisAlignedBox::include(const Point3f& p)
00085 {
00086 if (p.x < minimum.x) minimum.x = p.x;
00087 if (p.x > maximum.x) maximum.x = p.x;
00088 if (p.y < minimum.y) minimum.y = p.y;
00089 if (p.y > maximum.y) maximum.y = p.y;
00090 if (p.z < minimum.z) minimum.z = p.z;
00091 if (p.z > maximum.z) maximum.z = p.z;
00092 }
00093
00094 void AxisAlignedBox::include(const AxisAlignedBox& b)
00095 {
00096 if (b.minimum.x < minimum.x) minimum.x = b.minimum.x;
00097 if (b.maximum.x > maximum.x) maximum.x = b.maximum.x;
00098 if (b.minimum.y < minimum.y) minimum.y = b.minimum.y;
00099 if (b.maximum.y > maximum.y) maximum.y = b.maximum.y;
00100 if (b.minimum.z < minimum.z) minimum.z = b.minimum.z;
00101 if (b.maximum.z > maximum.z) maximum.z = b.maximum.z;
00102 }
00103
00104 #if 0
00105 AxisAlignedBox union(const AxisAlignedBox& a, const AxisAlignedBox& b)
00106 {
00107 AxisAlignedBox box(a);
00108 box.union(b);
00109 return box;
00110 }
00111 #endif
00112
00113 #endif // _AABOX_H_