Go to the documentation of this file.00001
00012 #pragma once
00013
00014 #include <stdlib.h>
00015 #include <float.h>
00016 #include <math.h>
00017 #include <OpenGL/GL.h>
00018
00019
00020
00022 typedef float real ;
00023 typedef const real creal ;
00024 #define R_PI ((creal)3.1415926535897932384626433832795)
00025 #define R_EPSILON ((real)FLT_EPSILON)
00026 inline bool is_inv( real x ) { return isnan(x) ; }
00027 extern real R_INV ;
00028
00030 typedef signed char schar ;
00031 typedef unsigned char uchar ;
00032 typedef unsigned int uint ;
00033 typedef const int cint ;
00034 typedef const uint cuint ;
00035
00037 enum Axis { X = 0, Y = 1, Z = 2 } ;
00038
00039
00040
00042 class Point
00043 {
00044 protected :
00045 real _x, _y, _z ;
00046
00047 public :
00048 Point() : _x(R_INV), _y(R_INV), _z(R_INV) {}
00049 Point( creal x_, creal y_, creal z_ ) : _x(x_), _y(y_), _z(z_) {}
00050 Point( const Point &p_ ) : _x(p_._x), _y(p_._y), _z(p_._z) {}
00051 Point &operator = ( const Point &p_ )
00052 { _x=p_._x ; _y=p_._y ; _z=p_._z ; return *this; }
00053
00054
00055 public :
00056 inline real &x() { return _x ; }
00057 inline real &y() { return _y ; }
00058 inline real &z() { return _z ; }
00059 inline creal x() const { return _x ; }
00060 inline creal y() const { return _y ; }
00061 inline creal z() const { return _z ; }
00062
00063 inline creal &operator[] ( Axis a ) const
00064 { switch( a ) {
00065 case X : return _x ;
00066 case Y : return _y ;
00067 case Z : return _z ;
00068 default: return R_INV ;
00069 } }
00070 inline real &operator[] ( Axis a )
00071 { switch( a ) {
00072 case X : return _x ;
00073 case Y : return _y ;
00074 case Z : return _z ;
00075 default: return R_INV ;
00076 } }
00077
00079 inline bool valid()
00080 {
00081 return
00082 ( !is_inv( x() ) ) &&
00083 ( !is_inv( y() ) ) &&
00084 ( !is_inv( z() ) ) ;
00085 }
00086 inline bool invalid()
00087 {
00088 return
00089 ( is_inv( x() ) ) ||
00090 ( is_inv( y() ) ) ||
00091 ( is_inv( z() ) ) ;
00092 }
00093
00094
00096
00097
00099 inline Point &operator+= ( const Point &p_ )
00100 {
00101 x() += p_.x() ; y() += p_.y() ; z() += p_.z() ;
00102 return *this ;
00103 }
00105 inline const Point operator- ()
00106 {
00107 x() = -x() ; y() = -y() ; z() = -z() ;
00108 return *this ;
00109 }
00111 inline Point &operator-= ( const Point &p_ )
00112 {
00113 x() -= p_.x() ; y() -= p_.y() ; z() -= p_.z() ;
00114 return *this ;
00115 }
00117 inline Point &operator*= ( const real l )
00118 {
00119 x() *= l ; y() *= l ; z() *= l ;
00120 return *this ;
00121 }
00123 inline Point &operator/= ( const real l )
00124 {
00125 if( fabs(l) < R_EPSILON ) return *this ;
00126 real s = 1.0/l ;
00127 return *this *= s ;
00128 }
00129
00130
00132
00133 inline real length () const
00134 {
00135 return hypot( hypot( x(), y() ), z() ) ;
00136 }
00137 inline real norm () const { return length() ; }
00138 inline real dist ( const Point &p_ ) const { Point r = *this ; r -= p_ ; return r.length() ; }
00139
00140 inline bool operator== ( const Point &p_ ) const { return dist( p_ ) < R_EPSILON ; }
00141 inline bool operator!= ( const Point &p_ ) const { return !( *this == p_ ) ; }
00142
00143 inline bool normalize()
00144 {
00145 real l = length() ;
00146 if( l < R_EPSILON ) return false ;
00147 *this /= l ;
00148 return true ;
00149 }
00150
00152 inline void pmin( const Point &p_ )
00153 {
00154 if( x() > p_.x() ) x() = p_.x() ;
00155 if( y() > p_.y() ) y() = p_.y() ;
00156 if( z() > p_.z() ) z() = p_.z() ;
00157 }
00158
00160 inline void pmax( const Point &p_ )
00161 {
00162 if( x() < p_.x() ) x() = p_.x() ;
00163 if( y() < p_.y() ) y() = p_.y() ;
00164 if( z() < p_.z() ) z() = p_.z() ;
00165 }
00166
00167
00168
00169 public:
00171 void draw () const { ::glVertex3f( (float)x(), (float)y(), (float)z() ) ; }
00172 } ;
00173
00174
00175 extern Point P_INV ;
00176
00177
00179
00180
00182 inline const Point operator+ ( const Point &p, const Point &p_ )
00183 {
00184 Point r = p ;
00185 return (r += p_) ;
00186 }
00188 inline const Point operator- ( const Point &p, const Point &p_ )
00189 {
00190 Point r = p ;
00191 return r -= p_ ;
00192 }
00194 inline const Point operator* ( const Point &p, const real l )
00195 {
00196 Point r = p ;
00197 return r *= l ;
00198 }
00200 inline const Point operator* ( const real l, const Point &p )
00201 {
00202 return p * l ;
00203 }
00205 inline const Point operator/ ( const Point &p, const real l )
00206 {
00207 Point r = p ;
00208 return r /= l ;
00209 }
00210
00212 inline real operator* ( const Point &p, const Point &p_ )
00213 {
00214 return p.x()*p_.x() + p.y()*p_.y() + p.z()*p_.z() ;
00215 }
00217 static inline const Point operator^ ( const Point &p, const Point &p_ )
00218 {
00219 Point r ;
00220 r.x() = p.y() * p_.z() - p.z() * p_.y() ;
00221 r.y() = p.z() * p_.x() - p.x() * p_.z() ;
00222 r.z() = p.x() * p_.y() - p.y() * p_.x() ;
00223 return r ;
00224 }
00225 static inline real det( const Point &p, const Point &q, const Point &r )
00226 {
00227 return
00228 p.x()*q.y()*r.z() + p.y()*q.z()*r.x() + p.z()*q.x()*r.y() -
00229 p.z()*q.y()*r.x() - p.x()*q.z()*r.y() - p.y()*q.x()*r.z() ;
00230 }
00231
00232
00234
00235
00236 inline real length ( const Point &p ) { return p.length() ; }
00237 inline real norm ( const Point &p ) { return p.norm() ; }
00238 inline real dist ( const Point &p, const Point &p_ ) { return p.dist(p_) ; }
00239 inline real sqdist ( const Point &p, const Point &p_ ) { Point r = p-p_ ; return r*r ; }
00240
00245 inline const Point normal (const Point & v0, const Point & v1, const Point & v2)
00246 {
00247 Point n = ( v1-v0 ) ^ ( v2 - v0 ) ;
00248 n.normalize() ;
00249 return n ;
00250 }
00251
00256 inline real area (const Point & v0, const Point & v1, const Point & v2)
00257 {
00258 return 0.5 * norm( ( v1-v0 ) ^ ( v2 - v0 ) );
00259 }
00260
00265 inline const real cotan (const Point & v, const Point & v1, const Point & v2)
00266 {
00267 Point u = v1-v ;
00268 Point w = v2-v ;
00269 return (u*w) / norm( u ^ w ) ;
00270 }
00271
00275 inline const Point middle (const Point & v0, const Point & v1)
00276 {
00277 return 0.5 * (v0+v1) ;
00278 }
00279
00280
00281 inline void pmin( Point &p, const Point &p_ ) { p.pmin( p_ ) ; }
00282 inline void pmax( Point &p, const Point &p_ ) { p.pmax( p_ ) ; }
00283
00284