Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

aabox.h

Go to the documentation of this file.
00001 // aabox.h
00002 //
00003 // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
00004 //
00005 // Axis-aligned bounding box class
00006 //
00007 // This program is free software; you can redistribute it and/or
00008 // modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 2
00010 // of the License, or (at your option) any later version.
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_

Generated on Sat Jan 14 22:30:32 2006 for Celestia by  doxygen 1.4.1