00001
00011
00012
00013
00014
00015 #pragma once
00016
00017
00018 #include "point.h"
00019
00020 typedef uchar Level ;
00021 extern Level L_INV ;
00022
00023
00025 class Cube : public Point
00026 {
00027
00028 protected :
00029 Level _lv ;
00030
00031
00032
00033 public:
00035 Cube( const real &cx_ = R_INV, const real &cy_ = R_INV, const real &cz_ = R_INV, Level lv_ = L_INV )
00036 : Point(cx_,cy_,cz_), _lv(lv_) {}
00037
00039 Cube( const Point& c_, Level lv_ = L_INV )
00040 : Point(c_), _lv(lv_) {}
00041
00043 Cube( const Cube& c_ )
00044 : Point((const Point&)c_), _lv(c_._lv) {}
00045
00047 ~Cube() {}
00048
00050 Cube &operator= ( const Cube &c )
00051 { Point::operator=(c) ; _lv = c._lv ; return *this; }
00052
00053
00054
00055 public:
00057 real cx() const { return Point::x() ; }
00059 real &cx() { return Point::x() ; }
00060
00062 real cy() const { return Point::y() ; }
00064 real &cy() { return Point::y() ; }
00065
00067 real cz() const { return Point::z() ; }
00069 real &cz() { return Point::z() ; }
00070
00072 real coord( Axis a ) const { return Point::operator[](a) ; }
00074 real &coord( Axis a ) { return Point::operator[](a) ; }
00075
00076
00078 real sz() const { return (real)1.0 / (2<<_lv) ; }
00080 Level lv() const { return _lv ; }
00082 Level &lv() { return _lv ; }
00083
00085 real xmin() const { return cx() - sz() ; }
00087 real xmax() const { return cx() + sz() ; }
00088
00090 real ymin() const { return cy() - sz() ; }
00092 real ymax() const { return cy() + sz() ; }
00093
00095 real zmin() const { return cz() - sz() ; }
00097 real zmax() const { return cz() + sz() ; }
00098
00100 real coordmin( Axis a ) const { return coord(a) - this->sz() ; }
00102 real coordmax( Axis a ) const { return coord(a) + this->sz() ; }
00103
00104
00105
00106 public :
00108 bool contains( const real &x_, const real &y_, const real &z_ ) const
00109 {
00110 real sz_ = sz() ;
00111 return
00112 ( fabs(x_-cx()) <= sz_ ) &&
00113 ( fabs(y_-cy()) <= sz_ ) &&
00114 ( fabs(z_-cz()) <= sz_ ) ;
00115 }
00116
00118 bool contains( const Point &p ) const { return contains( p.x(), p.y(), p.z() ) ; }
00119
00121 bool contains( const real &x_, const real &y_, const real &z_, const real &epsilon ) const
00122 {
00123 real sz_ = sz() + epsilon ;
00124 return
00125 ( fabs(x_-cx()) <= sz_ ) &&
00126 ( fabs(y_-cy()) <= sz_ ) &&
00127 ( fabs(z_-cz()) <= sz_ ) ;
00128 }
00129
00131 bool contains( const Point &p, const real &epsilon ) const { return contains( p.x(), p.y(), p.z(), epsilon ) ; }
00132
00133
00134
00135 public:
00137 void draw_center () const { ::glVertex3f( (float)x(), (float)y(), (float)z() ) ; }
00138
00140 void draw_corners( real fact = 0.9 ) const
00141 {
00142 const float ix = (const float) x() ;
00143 const float iy = (const float) y() ;
00144 const float iz = (const float) z() ;
00145 const float is = (const float) (fact*sz()) ;
00146
00147 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00148 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00149 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00150 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00151 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00152 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00153 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00154 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00155 }
00156
00158 void draw_wire ( real fact = 0.9 ) const
00159 {
00160 const float ix = (const float) x() ;
00161 const float iy = (const float) y() ;
00162 const float iz = (const float) z() ;
00163 const float is = (const float) (fact*sz()) ;
00164
00165 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00166 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00167
00168 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00169 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00170
00171 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00172 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00173
00174 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00175 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00176
00177
00178 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00179 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00180
00181 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00182 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00183
00184 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00185 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00186
00187 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00188 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00189
00190
00191 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00192 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00193
00194 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00195 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00196
00197 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00198 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00199
00200 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00201 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00202 }
00203
00204
00205
00207 void draw_fill ( real fact = 0.9 ) const
00208 {
00209 const float ix = (const float) x() ;
00210 const float iy = (const float) y() ;
00211 const float iz = (const float) z() ;
00212 const float is = (const float) (fact*sz()) ;
00213
00214 ::glNormal3f(0,0,-1);
00215 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00216 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00217 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00218 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00219
00220 ::glNormal3f(0,0,1);
00221 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00222 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00223 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00224 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00225
00226 ::glNormal3f(-1,0,0);
00227 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00228 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00229 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00230 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00231
00232 ::glNormal3f(1,0,0);
00233 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00234 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00235 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00236 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00237
00238 ::glNormal3f(0,-1,0);
00239 ::glVertex3f( ix-is, iy-is, iz-is ) ;
00240 ::glVertex3f( ix-is, iy-is, iz+is ) ;
00241 ::glVertex3f( ix+is, iy-is, iz+is ) ;
00242 ::glVertex3f( ix+is, iy-is, iz-is ) ;
00243
00244 ::glNormal3f(0,1,0);
00245 ::glVertex3f( ix-is, iy+is, iz-is ) ;
00246 ::glVertex3f( ix-is, iy+is, iz+is ) ;
00247 ::glVertex3f( ix+is, iy+is, iz+is ) ;
00248 ::glVertex3f( ix+is, iy+is, iz-is ) ;
00249 }
00250 };
00251
00252
00253
00254 extern Cube C_INV ;
00255
00256