Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound 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 
00158   void transformBox(const Wtransf transform){
00159     _minPt=transform*_minPt;
00160     _maxPt=transform*_maxPt;
00161   }
00162 
00163   // drawing routines..
00164 
00166   void drawBox (const GLfloat x1,const GLfloat y1,const GLfloat z1, 
00167         const GLfloat x2,const GLfloat y2,const GLfloat z2) {
00168     glDisable(GL_BLEND);
00169     glColor3f (1.0, 1.0, 1.0);
00170     glBegin (GL_LINE_LOOP);
00171     glVertex3f (x1, y1, z1);
00172     glVertex3f (x2, y1, z1);
00173     glVertex3f (x2, y2, z1);
00174     glVertex3f (x1, y2, z1);
00175     glEnd ();
00176     
00177     glBegin (GL_LINE_LOOP);
00178     glVertex3f (x1, y1, z2);
00179     glVertex3f (x2, y1, z2);
00180     glVertex3f (x2, y2, z2);
00181     glVertex3f (x1, y2, z2);
00182     glEnd ();
00183     
00184     glBegin (GL_LINES);  /*  4 lines     */
00185     glVertex3f (x1, y1, z1);
00186     glVertex3f (x1, y1, z2);
00187     glVertex3f (x1, y2, z1);
00188     glVertex3f (x1, y2, z2);
00189     glVertex3f (x2, y1, z1);
00190     glVertex3f (x2, y1, z2);
00191     glVertex3f (x2, y2, z1);
00192     glVertex3f (x2, y2, z2);
00193     glEnd ();
00194   }
00195   
00196 
00197   void draw() {
00198     glDisable(GL_LIGHTING);
00199     glDisable(GL_COLOR_MATERIAL);
00200     
00201     drawBox(_minPt[0],_minPt[1],_minPt[2],
00202         _maxPt[0],_maxPt[1],_maxPt[2]);
00203 
00204     glEnable(GL_LIGHTING);
00205     glEnable(GL_COLOR_MATERIAL);
00206   }
00207 
00208   void print(){
00209     cout << "BBOX:MinPt is " << _minPt << endl 
00210      << "BBOX:MaxPt is " << _maxPt << endl; 
00211   }
00212   
00213  protected:
00214 
00215   Wpt _minPt;
00216   Wpt _maxPt;
00217   int _empty;
00218 
00219 };
00220 
00221 
00222 #endif

Generated on Mon Sep 15 16:27:55 2003 for inspace by doxygen1.2.18