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
00029
00030 class bbox3_qs : public bbox3 {
00031 public:
00032 float xm, ym, zm;
00033 float dxhalf, dyhalf, dzhalf;
00034
00035
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
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
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
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