00001
00010 #ifndef BBOX_H
00011 #define BBOX_H
00012
00013
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
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
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
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
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
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
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
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
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
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);
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