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
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
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);
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