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

BBox.H

Go to the documentation of this file.
00001 
00010 #ifndef BBOX_H
00011 #define BBOX_H
00012 
00013 // Gluebase includes
00014 #define OUTSIDE_GLUE_CORE
00015 #include <mlib/points.H>
00016 
00017 #include "glwrap.H"
00018 
00019 #include <math.h>
00020 
00021 
00028 class BBox
00029 {
00030  public:
00031 
00032   BBox() {
00033     _empty = 1;
00034     _minPt = Wpt(0,0,0);
00035     _maxPt = Wpt(0,0,0);
00036   };
00037 
00038   BBox(const BBox& bb){
00039     _empty=bb._empty;
00040     _minPt=bb._minPt;
00041     _maxPt=bb._maxPt;
00042   } 
00043 
00044   BBox(BBox* bb){
00045     _empty=bb->_empty;
00046     _minPt=bb->_minPt;
00047     _maxPt=bb->_maxPt;
00048   }
00049 
00050   virtual ~BBox() {};
00051 
00053   inline void addPt(const Wpt p) {
00054     if (_empty) {
00055       _minPt = p;
00056       _maxPt = p;
00057     }
00058     else {
00059       // min
00060       if (p[0] < _minPt[0]) _minPt[0] = p[0];
00061       if (p[1] < _minPt[1]) _minPt[1] = p[1];
00062       if (p[2] < _minPt[2]) _minPt[2] = p[2];
00063       // max
00064       if (p[0] > _maxPt[0]) _maxPt[0] = p[0];
00065       if (p[1] > _maxPt[1]) _maxPt[1] = p[1];
00066       if (p[2] > _maxPt[2]) _maxPt[2] = p[2];
00067     }
00068     _empty = 0;
00069   }
00070 
00072   inline void addBBox(const BBox b2) {
00073     if (_empty) {
00074       _minPt = b2.minPt();
00075       _maxPt = b2.maxPt();
00076     }
00077     else {
00078       // min
00079       if (b2.minPt()[0] < _minPt[0]) _minPt[0] = b2.minPt()[0];
00080       if (b2.minPt()[1] < _minPt[1]) _minPt[1] = b2.minPt()[1];
00081       if (b2.minPt()[2] < _minPt[2]) _minPt[2] = b2.minPt()[2];
00082       // max
00083       if (b2.maxPt()[0] > _maxPt[0]) _maxPt[0] = b2.maxPt()[0];
00084       if (b2.maxPt()[1] > _maxPt[1]) _maxPt[1] = b2.maxPt()[1];
00085       if (b2.maxPt()[2] > _maxPt[2]) _maxPt[2] = b2.maxPt()[2];
00086     }
00087     _empty = 0;
00088   }
00089   
00091   inline void addBBox(BBox* const b2) {
00092     if (_empty) {
00093       _minPt = b2->minPt();
00094       _maxPt = b2->maxPt();
00095     }
00096     else {
00097       // min
00098       if (b2->minPt()[0] < _minPt[0]) _minPt[0] = b2->minPt()[0];
00099       if (b2->minPt()[1] < _minPt[1]) _minPt[1] = b2->minPt()[1];
00100       if (b2->minPt()[2] < _minPt[2]) _minPt[2] = b2->minPt()[2];
00101       // max
00102       if (b2->maxPt()[0] > _maxPt[0]) _maxPt[0] = b2->maxPt()[0];
00103       if (b2->maxPt()[1] > _maxPt[1]) _maxPt[1] = b2->maxPt()[1];
00104       if (b2->maxPt()[2] > _maxPt[2]) _maxPt[2] = b2->maxPt()[2];
00105     }
00106     _empty = 0;
00107   }
00109   void reset() {
00110     _minPt = Wpt(0,0,0);
00111     _maxPt = Wpt(0,0,0);
00112     _empty = 1;
00113   }
00114 
00115 
00116   Wpt minPt()  const  { return _minPt; }
00117   Wpt maxPt()  const  { return _maxPt; }
00118   Wpt center() const  { return Wpt((_minPt[0] + _maxPt[0]) / 2.0,
00119                    (_minPt[1] + _maxPt[1]) / 2.0,
00120                    (_minPt[2] + _maxPt[2]) / 2.0); }
00121   double volume() {
00122     double x = fabs(_maxPt[0] - _minPt[0]);
00123     double y = fabs(_maxPt[1] - _minPt[1]);
00124     double z = fabs(_maxPt[2] - _minPt[2]);
00125     // if the box lies in a plane, return the area rather than the volume
00126     if (x==0.0) x=1.0;
00127     if (y==0.0) y=1.0;
00128     if (z==0.0) z=1.0;
00129     return x*y*z;
00130   }
00131 
00133   double volume(const Wtransf m) {
00134     Wpt max = m * _maxPt;
00135     Wpt min = m * _minPt;
00136 
00137     double x = fabs(max[0] - min[0]);
00138     double y = fabs(max[1] - min[1]);
00139     double z = fabs(max[2] - min[2]);
00140     // if the box lies in a plane, return the area rather than the volume
00141     if (x==0.0) x=1.0;
00142     if (y==0.0) y=1.0;
00143     if (z==0.0) z=1.0;
00144     return x*y*z;
00145   }
00146 
00147 
00149   int contains(const Wpt pt) {
00150     if (_empty) 
00151       return 0;
00152     return !(pt[0] < _minPt[0] || pt[1] < _minPt[1] || pt[2] < _minPt[2] ||
00153          pt[0] > _maxPt[0] || pt[1] > _maxPt[1] || pt[2] > _maxPt[2]); 
00154   }
00155 
00156 
00159   int contains(const Wpt pt, const Wtransf xform) {
00160     if (_empty) 
00161       return 0;
00162     Wpt min = xform*_minPt;
00163     Wpt max = xform*_maxPt;
00164 
00165     double tmp;
00166     if (max[0] < min[0]) { tmp = min[0]; min[0] = max[0]; max[0] = tmp; }
00167     if (max[1] < min[1]) { tmp = min[1]; min[1] = max[1]; max[1] = tmp; }
00168     if (max[2] < min[2]) { tmp = min[2]; min[2] = max[2]; max[2] = tmp; }
00169 
00170     return !(pt[0] < min[0] || pt[1] < min[1] || pt[2] < min[2] ||
00171          pt[0] > max[0] || pt[1] > max[1] || pt[2] > max[2]); 
00172   }
00173 
00174 
00176   void transformBox(const Wtransf transform){
00177     Wpt tmpmin=transform*_minPt;
00178     Wpt tmpmax=transform*_maxPt;
00179     
00180     reset();
00181     addPt(tmpmin);
00182     addPt(tmpmax);
00183   }
00184 
00185   // drawing routines..
00186 
00188   void drawBox (const GLfloat x1,const GLfloat y1,const GLfloat z1, 
00189         const GLfloat x2,const GLfloat y2,const GLfloat z2) {
00190     glColor3f (1.0, 1.0, 1.0);
00191     glBegin (GL_LINE_LOOP);
00192     glVertex3f (x1, y1, z1);
00193     glVertex3f (x2, y1, z1);
00194     glVertex3f (x2, y2, z1);
00195     glVertex3f (x1, y2, z1);
00196     glEnd ();
00197     
00198     glBegin (GL_LINE_LOOP);
00199     glVertex3f (x1, y1, z2);
00200     glVertex3f (x2, y1, z2);
00201     glVertex3f (x2, y2, z2);
00202     glVertex3f (x1, y2, z2);
00203     glEnd ();
00204     
00205     glBegin (GL_LINES);  /*  4 lines     */
00206     glVertex3f (x1, y1, z1);
00207     glVertex3f (x1, y1, z2);
00208     glVertex3f (x1, y2, z1);
00209     glVertex3f (x1, y2, z2);
00210     glVertex3f (x2, y1, z1);
00211     glVertex3f (x2, y1, z2);
00212     glVertex3f (x2, y2, z1);
00213     glVertex3f (x2, y2, z2);
00214     glEnd ();
00215   }
00216   
00217 
00220   void draw() {
00221     glPushAttrib(GL_ALL_ATTRIB_BITS);
00222 
00223     glDisable(GL_LIGHTING);
00224     glDisable(GL_COLOR_MATERIAL);
00225     glDisable(GL_BLEND);
00226     
00227     drawBox(_minPt[0],_minPt[1],_minPt[2],
00228         _maxPt[0],_maxPt[1],_maxPt[2]);
00229 
00230     glPopAttrib();
00231   }
00232 
00233   void print(){
00234     cout << "BBOX:MinPt is " << _minPt << endl 
00235      << "BBOX:MaxPt is " << _maxPt << endl; 
00236   }
00237   
00238  protected:
00239 
00240   Wpt _minPt;
00241   Wpt _maxPt;
00242   int _empty;
00243 
00244 };
00245 
00246 
00247 #endif

Generated on Thu Jul 8 15:19:28 2004 for inspace by doxygen 1.3.4