TAPs 0.7.7.3
spt_point3_vector3.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines