![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 SP_Point3_Vector3.h 00003 00004 Vector and Point in 3D inheritance from SPtSpace class. 00005 00006 Modified from "RADIOSITY A Programmer's Perspective" by Ian Ashdown (1994) 00007 00008 Sukitti Punak (10/24/2003) 00009 Latest Update (11/20/2003) 00010 ******************************************************************************/ 00011 #ifndef SPT_POINT3_VECTOR3_H 00012 #define SPT_POINT3_VECTOR3_H 00013 00014 #include <cmath> 00015 00016 // Parent Class 00017 #include "SPT_Space3.h" 00018 00019 // Associated Class 00020 #include "SPT_Matrix3x3.h" 00021 00022 00023 // Forward Declarations 00024 template< typename T > class SPtVector3; 00025 template< typename T > class SPtVector3T; 00026 00027 //=============================================================================================== 00028 // 00029 // C L A S S D E C L A R A T I O N S 00030 // 00031 //=============================================================================================== 00032 // CLASS: SPtPoint3 *********************************************************** 00033 // Desc: 3-D Point 00034 template< typename T > 00035 class SPtPoint3 : public SPtSpace3< T > 00036 { 00037 // Friend Class 00038 friend class SPtVector3<T>; 00039 00040 // Friend Functions for Operator Overloading 00041 friend SPtPoint3< T > operator+( const SPtPoint3< T > &, const SPtVector3< T > & ); 00042 friend SPtPoint3< T > operator+( const SPtVector3< T > &, const SPtPoint3< T > & ); 00043 00044 // Data Members -------------------------------------------------------------- 00045 public: 00046 // Constructors 00047 //SPtPoint3() : SPtSpace3() { }; 00048 SPtPoint3( T xval = 0, T yval = 0, T zval = 0 ) : SPtSpace3< T >( xval, yval, zval ) { } 00049 SPtPoint3( const SPtPoint3 &p ) : SPtSpace3< T >( p.x, p.y, p.z ) { } 00050 00051 // Operators ------------------------------------ 00052 // assign scalar 00053 SPtPoint3< T > &operator=( T ); 00054 // assign point 00055 SPtPoint3< T > &operator=( const SPtPoint3< T > & ); 00056 // assign vector 00057 SPtPoint3< T > &operator=( const SPtVector3< T > & ); 00058 00059 }; // END: SPtPoint3 00060 //=============================================================================================== 00061 00062 00063 //=============================================================================================== 00064 // CLASS: SPtVector3 ********************************************************** 00065 // Desc: 3-D Vector 00066 template< typename T > 00067 class SPtVector3 : public SPtSpace3< T > 00068 { 00069 // Friend Functions for Operator Overloading 00070 // Add vector v2 to vector v1 00071 friend SPtVector3< T > operator+( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00072 { return SPtVector3< T >( v1.x + v2.x, v1.y + v2.y, v1.z + v2.z ); } 00073 // subtract vector v2 from vector v1 00074 friend SPtVector3< T > operator-( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00075 { return SPtVector3< T >( v1.x - v2.x, v1.y - v2.y, v1.z - v2.z ); } 00076 // multiply vector v by scalar s 00077 friend SPtVector3< T > operator*( const SPtVector3< T > &v, T s ) 00078 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00079 friend SPtVector3< T > operator*( const SPtVector3< T > &v, double s ); 00080 //{ return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00081 friend SPtVector3< T > operator*( const SPtVector3< T > &v, float s ) 00082 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00083 friend SPtVector3< T > operator*( const SPtVector3< T > &v, long s ) 00084 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00085 friend SPtVector3< T > operator*( const SPtVector3< T > &v, int s ) 00086 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00087 // multiply scalar s by vector v 00088 friend SPtVector3< T > operator*( T s, const SPtVector3< T > &v ) 00089 { return v * s; } 00090 friend SPtVector3< T > operator*( double s, const SPtVector3< T > &v ); 00091 //{ return v * s; } 00092 friend SPtVector3< T > operator*( float s, const SPtVector3< T > &v ) 00093 { return v * s; } 00094 friend SPtVector3< T > operator*( long s, const SPtVector3< T > &v ) 00095 { return v * s; } 00096 friend SPtVector3< T > operator*( int s, const SPtVector3< T > &v ) 00097 { return v * s; } 00098 // divide vector v by scalar s 00099 friend SPtVector3< T > operator/( const SPtVector3< T > &v, double s ) 00100 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00101 friend SPtVector3< T > operator/( const SPtVector3< T > &v, float s ) 00102 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00103 friend SPtVector3< T > operator/( const SPtVector3< T > &v, long s ) 00104 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00105 friend SPtVector3< T > operator/( const SPtVector3< T > &v, int s ) 00106 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00107 // Return dot product of vector v1 and v2 00108 friend T InnerProduct( const SPtVector3< T > &, const SPtVector3< T > & ); 00109 friend T DotProduct( const SPtVector3< T > &, const SPtVector3< T > & ); 00110 friend T operator*( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00111 { return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ); }; 00112 00113 // Return cross product of vecter v1 and v2 00114 friend SPtVector3< T > CrossProduct( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00115 { return SPtVector3< T >( v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x ); } 00116 friend SPtVector3< T > operator%( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00117 { return SPtVector3< T >( v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x ); } 00118 00119 // Friend Functions for Overloaded Operators with class SPtMatrix3x3 00120 friend SPtVector3< T > operator*( const SPtMatrix3x3< T > &M, const SPtVector3< T > &v ) 00121 { 00122 return SPtVector3< T >( M.Get(0,0)*v.x + M.Get(0,1)*v.y + M.Get(0,2)*v.z, 00123 M.Get(1,0)*v.x + M.Get(1,1)*v.y + M.Get(1,2)*v.z, 00124 M.Get(2,0)*v.x + M.Get(2,1)*v.y + M.Get(2,2)*v.z 00125 ); 00126 } 00127 00128 00129 00130 // Member Functions ----------------------------------------------------------- 00131 public: 00132 // Constructors 00133 SPtVector3() : SPtSpace3< T >() { } 00134 SPtVector3( T xval, T yval, T zval ) : SPtSpace3< T >( xval, yval, zval ) { } 00135 SPtVector3( const SPtVector3< T > &v ) : SPtSpace3< T >( v.x, v.y, v.z ) { } 00136 //SPtVector3( const SPtVector3T< T > &v ) : SPtSpace3< T >( v.GetX(), v.GetY(), v.GetZ() ) { } 00137 SPtVector3( const SPtPoint3< T > &p ) : SPtSpace3< T >( p.x, p.y, p.z ) { } 00138 SPtVector3( const SPtPoint3< T > &start, const SPtPoint3< T > &end ) 00139 : SPtSpace3< T >( end.x - start.x, end.y - start.y, end.z - start.z ) { } 00140 00141 // return vector length 00142 T Length(); 00143 // Normalize and return the vector 00144 SPtVector3< T > &Norm(); 00145 00146 // Operators ------------------------------------ 00147 // assign scalar 00148 SPtVector3< T > &operator=( T ); 00149 // assign point 00150 SPtVector3< T > &operator=( const SPtPoint3< T > & ); 00151 // assign vector 00152 SPtVector3< T > &operator=( const SPtVector3< T > & ); 00153 // add/assign vector v 00154 SPtVector3< T > &operator+=( const SPtVector3< T > & ); 00155 // subtract/assign vector v 00156 SPtVector3< T > &operator-=( const SPtVector3< T > & ); 00157 // multiply/assign by scalar s 00158 SPtVector3< T > &operator*=( T ); 00159 // divide/assign by scalar s 00160 SPtVector3< T > &operator/=( T ); 00161 // negation 00162 SPtVector3< T > operator-() const; 00163 00164 // V1*V2_t ==> Matrix3x3 00165 SPtMatrix3x3< T > operator*( const SPtVector3T< T > & ) const; 00166 // V1_t*V1_t ==> V2 00167 T SelfInnerProduct() const; 00168 // V1*V1_t ==> Matrix3x3 00169 SPtMatrix3x3< T > SelfOuterProduct() const; 00170 00171 // return the (3-by-3) star matrix of this vector 00172 SPtMatrix3x3< T > GetStarMatrix() const; 00173 00174 }; // END: SPtVector3 00175 //=============================================================================================== 00176 00177 00178 //=============================================================================================== 00179 // CLASS: SPtVector3T ********************************************************** 00180 // Desc: 3-D Vector 00181 template< typename T > 00182 class SPtVector3T : public SPtVector3< T > 00183 { 00184 // Overloaded Operator -------------------------------------------------- 00185 friend ostream &operator<<( ostream &, const SPtVector3T< T > & ); 00186 00187 00188 // Member Functions ------------------------------------------------------- 00189 public: 00190 // Constructors 00191 SPtVector3T() : SPtVector3< T >() { } 00192 SPtVector3T( T xval, T yval, T zval ) : SPtVector3< T >( xval, yval, zval ) { } 00193 SPtVector3T( const SPtVector3T< T > &v ) : SPtVector3< T >( v.x, v.y, v.z ) { } 00194 SPtVector3T( const SPtVector3< T > &v ) : SPtVector3< T >( v.GetX(), v.GetY(), v.GetZ() ) { } // conversion constructor 00195 SPtVector3T( const SPtPoint3< T > &p ) : SPtVector3< T >( p.GetX(), p.GetY(), p.GetZ() ) { } 00196 SPtVector3T( const SPtPoint3< T > &start, const SPtPoint3< T > &end ) 00197 : SPtVector3< T >( end.GetX() - start.GetX(), end.GetY() - start.GetY(), end.GetZ() - start.GetZ() ) { } 00198 00199 // Overloaded for * with a 3-by-3 matrix 00200 SPtVector3T operator*( const SPtMatrix3x3< T > & ); 00201 00202 // Overloaded for * with a SPtVector3 00203 T operator*( const SPtVector3< T > & ) const; 00204 00205 }; // END: SPtVector3 00206 //=============================================================================================== 00207 00208 00209 00210 //=============================================================================================== 00211 // 00212 // M E M B E R F U N C T I O N D E F I N I T I O N S 00213 // 00214 //=============================================================================================== 00215 // START: SPtPoint3 Member Functions ****************************************** 00216 00217 // Overloaded Operators ----------------------------- 00218 00219 // assign scalar 00220 template< typename T > 00221 SPtPoint3< T > &SPtPoint3< T >::operator=( T s ) 00222 { 00223 x = y = z = s; 00224 return *this; 00225 } 00226 00227 // assign point 00228 template< typename T > 00229 SPtPoint3< T > &SPtPoint3< T >::operator=( const SPtPoint3< T > &p ) 00230 { 00231 x = p.x; 00232 y = p.y; 00233 z = p.z; 00234 return *this; 00235 } 00236 00237 // assign vector 00238 template< typename T > 00239 SPtPoint3< T > &SPtPoint3< T >::operator=( const SPtVector3< T > &v ) 00240 { 00241 x = v.GetX(); 00242 y = v.GetY(); 00243 z = v.GetZ(); 00244 return *this; 00245 } 00246 00247 // Friend Functions for Operator Overloading -------- 00248 // add vector v to point p 00249 template< typename T > 00250 SPtPoint3< T > operator+( const SPtPoint3< T > &p, const SPtVector3< T > &v ) 00251 { return SPtPoint3< T >( p.x + v.GetX(), p.y + v.GetY(), p.z + v.GetZ() ); } 00252 00253 // add point p to vector v 00254 template< typename T > 00255 SPtPoint3< T > operator+( const SPtVector3< T > &v, const SPtPoint3< T > &p ) 00256 { return p + v; } 00257 00258 // END: SPtPoint3 Member Functions ****************************************** 00259 //=============================================================================================== 00260 00261 00262 //=============================================================================================== 00263 // Start: SPtVector3 Member Functions ***************************************** 00264 00265 // return vector length 00266 template< typename T > 00267 T SPtVector3< T >::Length() { return sqrt( x*x + y*y + z*z ); } 00268 00269 // Normalize and return the vector 00270 template< typename T > 00271 SPtVector3< T > &SPtVector3< T >::Norm() 00272 { 00273 T len = Length(); 00274 if ( fabs(len) < 1E-40 ) len = 1.0; 00275 x /= len; 00276 y /= len; 00277 z /= len; 00278 return *this; 00279 } 00280 00281 // Operators ------------------------------------ 00282 // assign scalar 00283 template< typename T > 00284 SPtVector3< T > &SPtVector3< T >::operator=( T s ) 00285 { 00286 x = y = z = s; 00287 return *this; 00288 } 00289 00290 // assign point 00291 template< typename T > 00292 SPtVector3< T > &SPtVector3< T >::operator=( const SPtPoint3< T > &p ) 00293 { 00294 x = p.x; 00295 y = p.y; 00296 z = p.z; 00297 return *this; 00298 } 00299 00300 // assign vector 00301 template< typename T > 00302 SPtVector3< T > &SPtVector3< T >::operator=( const SPtVector3< T > &v ) 00303 { 00304 x = v.x; 00305 y = v.y; 00306 z = v.z; 00307 return *this; 00308 } 00309 00310 // add/assign vector v 00311 template< typename T > 00312 SPtVector3< T > &SPtVector3< T >::operator+=( const SPtVector3< T > &v ) 00313 { 00314 x += v.x; 00315 y += v.y; 00316 z += v.z; 00317 return *this; 00318 } 00319 00320 // subtract/assign vector v 00321 template< typename T > 00322 SPtVector3< T > &SPtVector3< T >::operator-=( const SPtVector3< T > &v ) 00323 { 00324 x -= v.x; 00325 y -= v.y; 00326 z -= v.z; 00327 return *this; 00328 } 00329 00330 // multiply/assign by scalar s 00331 template< typename T > 00332 SPtVector3< T > &SPtVector3< T >::operator*=( T s ) 00333 { 00334 x *= s; 00335 y *= s; 00336 z *= s; 00337 return *this; 00338 } 00339 00340 // divide/assign by scalar s 00341 template< typename T > 00342 SPtVector3< T > &SPtVector3< T >::operator/=( T s ) 00343 { 00344 x /= s; 00345 y /= s; 00346 z /= s; 00347 return *this; 00348 } 00349 00350 // negation 00351 template< typename T > 00352 SPtVector3< T > SPtVector3< T >::operator-() const 00353 { return SPtVector3< T >( -x, -y, -z ); } 00354 00355 // V1*V2_t ==> Matrix3x3 00356 template< typename T > 00357 SPtMatrix3x3< T > SPtVector3< T >::operator*( const SPtVector3T< T > &V ) const 00358 { 00359 return SPtMatrix3x3< T >( x*V.x, x*V.y, x*V.z, 00360 y*V.x, y*V.y, y*V.z, 00361 z*V.x, z*V.y, z*V.z 00362 ); 00363 } 00364 00365 // V1_t*V1_t ==> V2 00366 template< typename T > 00367 T SPtVector3< T >::SelfInnerProduct() const 00368 { 00369 return x*x + y*y + z*z; 00370 } 00371 00372 // V1*V1_t ==> Matrix3x3 00373 template< typename T > 00374 SPtMatrix3x3< T > SPtVector3< T >::SelfOuterProduct() const 00375 { 00376 return SPtMatrix3x3< T >( x*x, x*y, x*z, 00377 y*x, y*y, y*z, 00378 z*x, z*y, z*z 00379 ); 00380 } 00381 00382 // Return the (3-by-3) star matrix of this vector 00383 // | 0 -z y | 00384 // v* = | z 0 -x | 00385 // | -y x 0 | 00386 template< typename T > 00387 SPtMatrix3x3< T > SPtVector3< T >::GetStarMatrix() const 00388 { 00389 return SPtMatrix3x3< T >( 0, -z, y, 00390 z, 0, -x, 00391 -y, x, 0 00392 ); 00393 } 00394 00395 00396 /* 00397 //============================================================================= 00398 // Friend Overloaded Operators 00399 // Add vector v2 to vector v1 00400 template< typename T > 00401 SPtVector3< T > operator+( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00402 { return SPtVector3< T >( v1.x + v2.x, v1.y + v2.y, v1.z + v2.z ); } 00403 00404 // subtract vector v2 from vector v1 00405 template< typename T > 00406 SPtVector3< T > operator-( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00407 { return SPtVector3< T >( v1.x - v2.x, v1.y - v2.y, v1.z - v2.z ); } 00408 00409 // multiply vector v by scalar s 00410 template< typename T > 00411 SPtVector3< T > operator*( const SPtVector3< T > &v, T s ) 00412 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00413 template< typename T > 00414 SPtVector3< T > operator*( const SPtVector3< T > &v, double s ) 00415 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00416 template< typename T > 00417 SPtVector3< T > operator*( const SPtVector3< T > &v, float s ) 00418 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00419 template< typename T > 00420 SPtVector3< T > operator*( const SPtVector3< T > &v, long s ) 00421 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00422 template< typename T > 00423 SPtVector3< T > operator*( const SPtVector3< T > &v, int s ) 00424 { return SPtVector3< T >( v.x * s, v.y * s, v.z * s ); } 00425 00426 // multiply scalar s by vector v 00427 template< typename T > 00428 SPtVector3< T > operator*( T s, const SPtVector3< T > &v ) 00429 { return v * s; } 00430 template< typename T > 00431 SPtVector3< T > operator*( double s, const SPtVector3< T > &v ) 00432 { return v * s; } 00433 template< typename T > 00434 SPtVector3< T > operator*( float s, const SPtVector3< T > &v ) 00435 { return v * s; } 00436 template< typename T > 00437 SPtVector3< T > operator*( long s, const SPtVector3< T > &v ) 00438 { return v * s; } 00439 template< typename T > 00440 SPtVector3< T > operator*( int s, const SPtVector3< T > &v ) 00441 { return v * s; } 00442 00443 // divide vector v by scalar s 00444 template< typename T > 00445 SPtVector3< T > operator/( const SPtVector3< T > &v, double s ) 00446 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00447 template< typename T > 00448 SPtVector3< T > operator/( const SPtVector3< T > &v, float s ) 00449 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00450 template< typename T > 00451 SPtVector3< T > operator/( const SPtVector3< T > &v, long s ) 00452 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00453 template< typename T > 00454 SPtVector3< T > operator/( const SPtVector3< T > &v, int s ) 00455 { return SPtVector3< T >( v.x / s, v.y / s, v.z / s ); } 00456 00457 // Return dot product of vector v1 and v2 00458 template< typename T > 00459 T InnerProduct( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00460 { return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ); } 00461 template< typename T > 00462 T DotProduct( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00463 { return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ); } 00464 template< typename T > 00465 T operator*( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00466 { return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ); } 00467 00468 // Return cross product of vecter v1 and v2 00469 template< typename T > 00470 SPtVector3< T > CrossProduct( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00471 { return SPtVector3< T >( v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x ); } 00472 template< typename T > 00473 SPtVector3< T > operator%( const SPtVector3< T > &v1, const SPtVector3< T > &v2 ) 00474 { return SPtVector3< T >( v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x ); } 00475 00476 // Overloaded for * with a 3-by-3 matrix 00477 template< typename T > 00478 SPtVector3< T > operator*( const SPtMatrix3x3< T > &M, const SPtVector3< T > &v ) 00479 { 00480 return SPtVector3< T >( M.Get(0,0)*v.x + M.Get(0,1)*v.y + M.Get(0,2)*v.z, 00481 M.Get(1,0)*v.x + M.Get(1,1)*v.y + M.Get(1,2)*v.z, 00482 M.Get(2,0)*v.x + M.Get(2,1)*v.y + M.Get(2,2)*v.z 00483 ); 00484 } 00485 */ 00486 // END: SPtVector3 Member Functions ***************************************** 00487 //=============================================================================================== 00488 00489 00490 //=============================================================================================== 00491 // Start: SPtVector3T Member Functions ***************************************** 00492 00493 // Friend Overloaded Operator ******************************************************* 00494 template< typename T > 00495 ostream &operator<<( ostream &output, const SPtVector3T< T > &s ) 00496 { 00497 output << "(" << s.GetX() << "," << s.GetY() << "," << s.GetZ() << ")"; 00498 return output; 00499 } 00500 00501 00502 // Overloaded for * with a 3-by-3 matrix 00503 template< typename T > 00504 SPtVector3T< T > SPtVector3T< T >::operator*( const SPtMatrix3x3< T > &M ) 00505 { 00506 T x, y, z; 00507 GetXYZ( x, y, z ); 00508 return SPtVector3T< T >( x*M.Get(0,0) + y*M.Get(1,0) + z*M.Get(2,0), 00509 x*M.Get(0,1) + y*M.Get(1,1) + z*M.Get(2,1), 00510 x*M.Get(0,2) + y*M.Get(1,2) + z*M.Get(2,2) 00511 ); 00512 } 00513 00514 // Overloaded for * with a SPtVector3 00515 template< typename T > 00516 T SPtVector3T< T >::operator*( const SPtVector3< T > &V ) const 00517 { 00518 T x, y, z; 00519 GetXYZ( x, y, z ); 00520 return x*V.x + y*V.y + z*V.z; 00521 } 00522 00523 00524 // END: SPtVector3T Member Functions ***************************************** 00525 //=============================================================================================== 00526 00527 #endif