newspeoplefor developersdocumentationdownloads

bbox_qs.h

Go to the documentation of this file.
00001 #ifndef N_BBOX_QS_H
00002 #define N_BBOX_QS_H
00003 //-------------------------------------------------------------------
00010 //-------------------------------------------------------------------
00011 #ifndef N_VECTOR_H
00012 #include "mathlib/vector.h"
00013 #endif
00014 
00015 #ifndef N_MATRIX_H
00016 #include "mathlib/matrix.h"
00017 #endif
00018 
00019 #ifndef N_LINE_H
00020 #include "mathlib/line.h"
00021 #endif
00022 
00023 #ifndef N_BBOX_H
00024 #include "mathlib/bbox.h"
00025 #endif
00026 
00027 //-------------------------------------------------------------------
00028 //  bbox3_qs
00029 //-------------------------------------------------------------------
00030 class bbox3_qs : public bbox3 {
00031 public:
00032     float xm, ym, zm;
00033     float dxhalf, dyhalf, dzhalf;
00034 
00035     //--- constructors ----------------------------------------------
00036     bbox3_qs() {};
00037     bbox3_qs(const vector3& _vmin, const vector3& _vmax){
00038         bbox3::bbox3( _vmin, _vmax); 
00039         reset_qs();
00040     };
00041     bbox3_qs(const bbox3& bb){ 
00042         bbox3::bbox3( bb.vmin, bb.vmax );
00043         reset_qs();
00044     };
00045     
00046     //--- initialize from vector3 cloud -----------------------------
00047     bbox3_qs(vector3 *varray, int num) {
00048         vmin = varray[0];
00049         vmax = varray[0];
00050         int i;
00051         for (i=0; i<num; i++) {
00052             if      (varray[i].x<vmin.x) vmin.x=varray[i].x;
00053             else if (varray[i].x>vmax.x) vmax.x=varray[i].x;
00054             if      (varray[i].y<vmin.y) vmin.y=varray[i].y;
00055             else if (varray[i].y>vmax.y) vmax.y=varray[i].y;
00056             if      (varray[i].z<vmin.z) vmin.z=varray[i].z;
00057             else if (varray[i].z>vmax.z) vmax.z=varray[i].z;
00058         }
00059         reset_qs();
00060     };
00061 
00062     void reset_qs()
00063     {
00064         xm = ((vmin.x+vmax.x)*0.5f);
00065         ym = ((vmin.y+vmax.y)*0.5f);
00066         zm = ((vmin.z+vmax.z)*0.5f);
00067         dxhalf = (float) fabs(vmax.x-vmin.x)*0.5f;
00068         dyhalf = (float) fabs(vmax.y-vmin.y)*0.5f;
00069         dzhalf = (float) fabs(vmax.z-vmin.z)*0.5f;
00070     }
00071 
00072     //--- setting elements ------------------------------------------
00073     void set(const vector3& _vmin, const vector3& _vmax) {
00074         vmin = _vmin;
00075         vmax = _vmax;
00076         
00077         reset_qs();
00078     };
00079 
00080     void set(vector3 *varray, int num) {
00081         vmin = varray[0];
00082         vmax = varray[0];
00083         int i;
00084         for (i=0; i<num; i++) {
00085             if      (varray[i].x<vmin.x) vmin.x=varray[i].x;
00086             else if (varray[i].x>vmax.x) vmax.x=varray[i].x;
00087             if      (varray[i].y<vmin.y) vmin.y=varray[i].y;
00088             else if (varray[i].y>vmax.y) vmax.y=varray[i].y;
00089             if      (varray[i].z<vmin.z) vmin.z=varray[i].z;
00090             else if (varray[i].z>vmax.z) vmax.z=varray[i].z;
00091         }
00092         reset_qs();
00093     };
00094 
00095     //--- invalidate bounding box to prepare for growing ------------
00096     void begin_grow(void) {
00097         vmin.set(+1000000.0f,+1000000.0f,+1000000.0f);
00098         vmax.set(-1000000.0f,-1000000.0f,-1000000.0f);
00099     };
00100     void grow(const vector3& v) {
00101         if (v.x<vmin.x) vmin.x=v.x;
00102         if (v.x>vmax.x) vmax.x=v.x;
00103         if (v.y<vmin.y) vmin.y=v.y;
00104         if (v.y>vmax.y) vmax.y=v.y;
00105         if (v.z<vmin.z) vmin.z=v.z;
00106         if (v.z>vmax.z) vmax.z=v.z;
00107         reset_qs();
00108     };
00109     void grow(vector3 *varray, int num) {
00110         int i;
00111         for (i=0; i<num; i++) {
00112             grow(varray[i]);
00113         }
00114     };
00115 
00116     void grow(bbox3_qs *bb) {
00117         if (bb->vmin.x<vmin.x) vmin.x=bb->vmin.x;
00118         if (bb->vmin.y<vmin.y) vmin.y=bb->vmin.y;
00119         if (bb->vmin.z<vmin.z) vmin.z=bb->vmin.z;
00120         if (bb->vmax.x>vmax.x) vmax.x=bb->vmax.x;
00121         if (bb->vmax.y>vmax.y) vmax.y=bb->vmax.y;
00122         if (bb->vmax.z>vmax.z) vmax.z=bb->vmax.z;
00123         reset_qs();
00124     };
00125 };
00126 #endif
00127 

Copyright © 1999-2005 by the contributing authors. Ideas, requests, problems: Send feedback.