TAPs 0.7.7.3
TAPsMatrix3x3.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsMatrix3x3.cpp
00003 
00004 Matrix3x3 class is a class for 3-by-3 matrices.
00005 
00006 SUKITTI PUNAK   (09/14/2004)
00007 UPDATE          (07/30/2005)
00008 ******************************************************************************/
00009 #include "TAPsMatrix3x3.hpp"
00010 // Using Inclusion Model (i.e. definitions are included in declarations)
00011 //                       (this name.cpp is included in name.hpp)
00012 // Each friend is defined directly inside its declaration.
00013 
00014 BEGIN_NAMESPACE_TAPs
00015 //=============================================================================
00016 //-----------------------------------------------------------------------------
00017 // Static Data Members for Data Conversions
00018 template <typename T> float         Matrix3x3<T>::g_f[9];
00019 template <typename T> double        Matrix3x3<T>::g_d[9];
00020 template <typename T> long double   Matrix3x3<T>::g_ld[9];
00021 //=============================================================================
00022 // Constructors and Destructor
00023 //-----------------------------------------------------------------------------
00024 template <typename T>
00025 Matrix3x3<T>::Matrix3x3 ()
00026 {
00027     // Identity Matrix
00028     /*e0*/  e[1]  = e[2]  = 
00029     e[3]  = /*e4*/  e[5]  =
00030     e[6]  = e[7]  = /*e8*/ Math<T>::ZERO;
00031     e[0]  = e[4]  = e[8] = Math<T>::ONE;
00032 }
00033 //-----------------------------------------------------------------------------
00034 template <typename T>
00035 Matrix3x3<T>::Matrix3x3 ( Matrix3x3<T> const &M )
00036 {
00037     e[0] = M.e[0];  e[1] = M.e[1];  e[2] = M.e[2];
00038     e[3] = M.e[3];  e[4] = M.e[4];  e[5] = M.e[5];
00039     e[6] = M.e[6];  e[7] = M.e[7];  e[8] = M.e[8];
00040 }
00041 //-----------------------------------------------------------------------------
00042 template <typename T>
00043 Matrix3x3<T>::Matrix3x3 ( T t )
00044 {
00045     e[0] = e[1] = e[2] = 
00046     e[3] = e[4] = e[5] =
00047     e[6] = e[7] = e[8] = t;
00048 }
00049 //-----------------------------------------------------------------------------
00050 template <typename T>
00051 Matrix3x3<T>::Matrix3x3 ( T e00, T e01, T e02, 
00052                           T e10, T e11, T e12,
00053                           T e20, T e21, T e22 )
00054 {
00055     e[0] = e00;  e[1] = e01;  e[2] = e02;
00056     e[3] = e10;  e[4] = e11;  e[5] = e12;
00057     e[6] = e20;  e[7] = e21;  e[8] = e22;
00058 }
00059 //-----------------------------------------------------------------------------
00060 template <typename T>
00061 Matrix3x3<T>::Matrix3x3 ( T const af[9] )
00062 {
00063     e[0] = af[0];  e[1] = af[1];  e[2] = af[2];
00064     e[3] = af[3];  e[4] = af[4];  e[5] = af[5];
00065     e[6] = af[6];  e[7] = af[7];  e[8] = af[8];
00066 }
00067 //-----------------------------------------------------------------------------
00068 template <typename T>
00069 Matrix3x3<T>::~Matrix3x3 ()
00070 {}
00071 //-----------------------------------------------------------------------------
00072 //=============================================================================
00073 // Member Access
00074 //-----------------------------------------------------------------------------
00075 template <typename T>
00076 inline T & Matrix3x3<T>::operator[] ( int i )
00077 {   return e[i];    }
00078 //-----------------------------------------------------------------------------
00079 template <typename T>
00080 inline T const & Matrix3x3<T>::operator[] ( int i ) const
00081 {   return e[i];    }
00082 //-----------------------------------------------------------------------------
00083 template <typename T>
00084 inline T & Matrix3x3<T>::operator() ( int r, int c )
00085 {   return e[r*3 + c];  }
00086 //-----------------------------------------------------------------------------
00087 template <typename T>
00088 inline T const & Matrix3x3<T>::operator() ( int r, int c ) const
00089 {   return e[r*3 + c];  }
00090 //-----------------------------------------------------------------------------
00091 //=============================================================================
00092 // Convert to one dimension array
00093 //-----------------------------------------------------------------------------
00094 template <typename T>
00095 Matrix3x3<T>::operator const T * () const
00096 {   return e;   }
00097 //-----------------------------------------------------------------------------
00098 template <typename T>
00099 Matrix3x3<T>::operator T * ()
00100 {   return e;   }
00101 //-----------------------------------------------------------------------------
00102 //=============================================================================
00103 // Useful Functions
00104 //-----------------------------------------------------------------------------
00105 template <typename T>
00106 inline void Matrix3x3<T>::SetAllElements (  T t )
00107 {
00108     e[0] = e[1] = e[2] =
00109     e[3] = e[4] = e[5] =
00110     e[6] = e[7] = e[8] = t;
00111 }
00112 //-----------------------------------------------------------------------------
00113 template <typename T>
00114 inline void Matrix3x3<T>::SetAllElements (  T e00, T e01, T e02, 
00115                                             T e10, T e11, T e12,
00116                                             T e20, T e21, T e22 )
00117 {
00118     e[0] = e00;  e[1] = e01;  e[2] = e02;
00119     e[3] = e10;  e[4] = e11;  e[5] = e12;
00120     e[6] = e20;  e[7] = e21;  e[8] = e22;
00121 }
00122 //-----------------------------------------------------------------------------
00123 template <typename T>
00124 inline void Matrix3x3<T>::SetAllElements ( T const af[9] )
00125 {
00126     e[0] = af[0];  e[1] = af[1];  e[2] = af[2];
00127     e[3] = af[3];  e[4] = af[4];  e[5] = af[5];
00128     e[6] = af[6];  e[7] = af[7];  e[8] = af[8];
00129 }
00130 //-----------------------------------------------------------------------------
00131 template <typename T>
00132 inline void Matrix3x3<T>::MakeIdentity ()
00133 {
00134     e[0] = e[4] = e[8] = Math<T>::ONE;
00135     e[1] = e[2] = e[3] = e[5] = e[6] = e[7] = Math<T>::ZERO;
00136 }
00137 //-----------------------------------------------------------------------------
00138 template <typename T>
00139 inline void Matrix3x3<T>::MakeDiagonal ( T d )
00140 {
00141     e[0] = e[4] = e[8] = d;
00142     e[1] = e[2] = e[3] = e[5] = e[6] = e[7] = Math<T>::ZERO;
00143 }
00144 //-----------------------------------------------------------------------------
00145 template <typename T>
00146 inline void Matrix3x3<T>::MakeDiagonal ( T const af[3] )
00147 {
00148     e[0] = af[0];
00149     e[4] = af[1];
00150     e[8] = af[2];
00151     e[1] = e[2] = e[3] = e[5] = e[6] = e[7] = Math<T>::ZERO;
00152 }
00153 //-----------------------------------------------------------------------------
00154 template <typename T>
00155 inline void Matrix3x3<T>::MakeZero ()
00156 {
00157     e[0] = e[1] = e[2] = 
00158     e[3] = e[4] = e[5] = 
00159     e[6] = e[7] = e[8] = Math<T>::ZERO;
00160 }
00161 //-----------------------------------------------------------------------------
00162 //-----------------------------------------------------------------------------
00163 template <typename T>
00164 inline bool Matrix3x3<T>::IsIdentity () const
00165 {
00166     return  e[ 0] == Math<T>::ONE   &&
00167             e[ 1] == Math<T>::ZERO  &&
00168             e[ 2] == Math<T>::ZERO  &&
00169 
00170             e[ 3] == Math<T>::ZERO  &&
00171             e[ 4] == Math<T>::ONE   &&
00172             e[ 5] == Math<T>::ZERO  &&
00173 
00174             e[ 6] == Math<T>::ZERO  &&
00175             e[ 7] == Math<T>::ZERO  &&
00176             e[ 8] == Math<T>::ONE;
00177 }
00178 //=============================================================================
00179 // Matrix Operations
00180 //-----------------------------------------------------------------------------
00181 template <typename T>
00182 inline Matrix3x3<T> & Matrix3x3<T>::Transposed ()
00183 {
00184     T temp;
00185     temp = e[1];  e[1] = e[3];  e[3] = temp;
00186     temp = e[2];  e[2] = e[6];  e[6] = temp;
00187     temp = e[5];  e[5] = e[7];  e[7] = temp;
00188     return *this;
00189 }
00190 //-----------------------------------------------------------------------------
00191 template <typename T>
00192 inline Matrix3x3<T> Matrix3x3<T>::GetTranspose() const
00193 {
00194     return  Matrix3x3<T> (  e[0], e[3], e[6], 
00195                             e[1], e[4], e[7], 
00196                             e[2], e[5], e[8] );
00197 }
00198 //-----------------------------------------------------------------------------
00199 // Inverse the matrix
00200 template <typename T>
00201 inline Matrix3x3<T> & Matrix3x3<T>::Inversed ()
00202 {
00203     *this = (*this).GetInverse();
00204     return *this;
00205 }
00206 //-----------------------------------------------------------------------------
00207 // Get the matrix inverse
00208 template <typename T>
00209 Matrix3x3<T> Matrix3x3<T>::GetInverse () const
00210 {
00211     T detInv = T(1) / GetDeterminant();
00212 
00213     //if ( -Math<T>::EPSILON < det && det < Math<T>::EPSILON )
00214     //  return Matrix3x3( Math<T>::INFINITY );
00215 
00216     return Matrix3x3<T>(     ( e[4]*e[8] - e[7]*e[5] ) * detInv,
00217                             -( e[1]*e[8] - e[7]*e[2] ) * detInv,
00218                              ( e[1]*e[5] - e[4]*e[2] ) * detInv,
00219                             -( e[3]*e[8] - e[6]*e[5] ) * detInv,
00220                              ( e[0]*e[8] - e[6]*e[2] ) * detInv,
00221                             -( e[0]*e[5] - e[3]*e[2] ) * detInv,
00222                              ( e[3]*e[7] - e[6]*e[4] ) * detInv,
00223                             -( e[0]*e[7] - e[6]*e[1] ) * detInv,
00224                              ( e[0]*e[4] - e[3]*e[1] ) * detInv );
00225 }
00226 //-----------------------------------------------------------------------------
00227 template <typename T>
00228 inline T Matrix3x3<T>::GetDeterminant () const
00229 {
00230     return      e[0] * ( e[4]*e[8] - e[5]*e[7] ) 
00231             -   e[3] * ( e[1]*e[8] - e[2]*e[7] )
00232             +   e[6] * ( e[1]*e[5] - e[2]*e[4] );
00233 }
00234 //-----------------------------------------------------------------------------
00235 //=============================================================================
00236 // Assignment Overloaded Operator
00237 //--------------------------------------------------------------------------
00238 // Assignment Operator
00239 template <typename T>
00240 inline Matrix3x3<T> & Matrix3x3<T>::operator= ( Matrix3x3<T> const &M )
00241 {
00242     if ( this != &M )
00243     {
00244         e[0] = M.e[0];  e[1] = M.e[1];  e[2] = M.e[2];
00245         e[3] = M.e[3];  e[4] = M.e[4];  e[5] = M.e[5];
00246         e[6] = M.e[6];  e[7] = M.e[7];  e[8] = M.e[8];
00247     }
00248     return *this;
00249 }
00250 //-----------------------------------------------------------------------------
00251 //=============================================================================
00252 // Unary Overloaded Operators
00253 //-----------------------------------------------------------------------------
00254 template <typename T>
00255 Matrix3x3<T> Matrix3x3<T>::operator- ()
00256 {
00257     return Matrix3x3<T>(    -e[0], -e[1], -e[2], 
00258                             -e[3], -e[4], -e[5], 
00259                             -e[6], -e[7], -e[8] );
00260 }
00261 //=============================================================================
00262 // Assign Overloaded Operators
00263 //-----------------------------------------------------------------------------
00264 template <typename T>
00265 Matrix3x3<T> & Matrix3x3<T>::operator+= ( Matrix3x3<T> const &M )
00266 {
00267     e[0] += M.e[0];  e[1] += M.e[1];  e[2] += M.e[2];
00268     e[3] += M.e[3];  e[4] += M.e[4];  e[5] += M.e[5];
00269     e[6] += M.e[6];  e[7] += M.e[7];  e[8] += M.e[8];
00270     return *this;
00271 }
00272 //-----------------------------------------------------------------------------
00273 template <typename T>
00274 Matrix3x3<T> & Matrix3x3<T>::operator-= ( Matrix3x3<T> const &M )
00275 {
00276     e[0] -= M.e[0];  e[1] -= M.e[1];  e[2] -= M.e[2];
00277     e[3] -= M.e[3];  e[4] -= M.e[4];  e[5] -= M.e[5];
00278     e[6] -= M.e[6];  e[7] -= M.e[7];  e[8] -= M.e[8];
00279     return *this;
00280 }
00281 //-----------------------------------------------------------------------------
00282 template <typename T>
00283 Matrix3x3<T> & Matrix3x3<T>::operator*= ( Matrix3x3<T> const &M )
00284 {
00285     *this = (*this) * M;
00286     return *this;
00287 }
00288 //-----------------------------------------------------------------------------
00289 template <typename T>
00290 Matrix3x3<T> & Matrix3x3<T>::operator*= ( T s )
00291 {
00292     e[0] *= s;  e[1] *= s;  e[2] *= s;
00293     e[3] *= s;  e[4] *= s;  e[5] *= s;
00294     e[6] *= s;  e[7] *= s;  e[8] *= s;
00295     return *this;
00296 }
00297 //-----------------------------------------------------------------------------
00298 template <typename T>
00299 Matrix3x3<T> & Matrix3x3<T>::operator/= ( T s )
00300 {
00301     e[0] /= s;  e[1] /= s;  e[2] /= s;
00302     e[3] /= s;  e[4] /= s;  e[5] /= s;
00303     e[6] /= s;  e[7] /= s;  e[8] /= s;
00304     return *this;
00305 }
00306 //-----------------------------------------------------------------------------
00307 //=============================================================================
00308 // Binary Overloaded Operators
00309 //-----------------------------------------------------------------------------
00310 template <typename T>
00311 Matrix3x3<T> Matrix3x3<T>::operator+ ( Matrix3x3<T> const &M ) const
00312 {
00313     return Matrix3x3<T>(    e[0]+M.e[0], e[1]+M.e[1], e[2]+M.e[2],
00314                             e[3]+M.e[3], e[4]+M.e[4], e[5]+M.e[5],
00315                             e[6]+M.e[6], e[7]+M.e[7], e[8]+M.e[8] );
00316 }
00317 //-----------------------------------------------------------------------------
00318 template <typename T>
00319 Matrix3x3<T> Matrix3x3<T>::operator- ( Matrix3x3<T> const &M ) const
00320 {
00321     return Matrix3x3<T>(    e[0]-M.e[0], e[1]-M.e[1], e[2]-M.e[2],
00322                             e[3]-M.e[3], e[4]-M.e[4], e[5]-M.e[5],
00323                             e[6]-M.e[6], e[7]-M.e[7], e[8]-M.e[8] );
00324 }
00325 //-----------------------------------------------------------------------------
00326 template <typename T>
00327 Matrix3x3<T> Matrix3x3<T>::operator* ( Matrix3x3<T> const &M ) const
00328 {
00329     return Matrix3x3<T>(    e[0]*M.e[0] + e[1]*M.e[3] + e[2]*M.e[6],
00330                             e[0]*M.e[1] + e[1]*M.e[4] + e[2]*M.e[7],
00331                             e[0]*M.e[2] + e[1]*M.e[5] + e[2]*M.e[8],
00332                             e[3]*M.e[0] + e[4]*M.e[3] + e[5]*M.e[6],
00333                             e[3]*M.e[1] + e[4]*M.e[4] + e[5]*M.e[7],
00334                             e[3]*M.e[2] + e[4]*M.e[5] + e[5]*M.e[8],
00335                             e[6]*M.e[0] + e[7]*M.e[3] + e[8]*M.e[6],
00336                             e[6]*M.e[1] + e[7]*M.e[4] + e[8]*M.e[7],
00337                             e[6]*M.e[2] + e[7]*M.e[5] + e[8]*M.e[8] );
00338 }
00339 //-----------------------------------------------------------------------------
00340 template <typename T>
00341 Matrix3x3<T> Matrix3x3<T>::operator* ( T s ) const
00342 {
00343     return Matrix3x3<T>(    e[0]*s, e[1]*s, e[2]*s,
00344                             e[3]*s, e[4]*s, e[5]*s,
00345                             e[6]*s, e[7]*s, e[8]*s );
00346 }
00347 //-----------------------------------------------------------------------------
00348 template <typename T>
00349 Matrix3x3<T> Matrix3x3<T>::operator/ ( T s ) const
00350 {
00351     return Matrix3x3<T>(    e[0]/s, e[1]/s, e[2]/s,
00352                             e[3]/s, e[4]/s, e[5]/s,
00353                             e[6]/s, e[7]/s, e[8]/s );
00354 }
00355 //-----------------------------------------------------------------------------
00356 template <typename T>
00357 inline void Matrix3x3<T>::MultLeft ( Matrix3x3<T> const &M )
00358 {
00359     *this = M * (*this);
00360 }
00361 //-----------------------------------------------------------------------------
00362 template <typename T>
00363 inline void Matrix3x3<T>::MultRight ( Matrix3x3<T> const &M )
00364 {
00365     *this *= M;
00366 }
00367 //-----------------------------------------------------------------------------
00368 // Matrix * Vector
00369 template <typename T>
00370 Vector3<T> Matrix3x3<T>::operator* ( Vector3<T> const &V ) const
00371 {
00372     return Vector3<T>(
00373             V[0]*e[0] + V[1]*e[1] + V[2]*e[2],
00374             V[0]*e[3] + V[1]*e[4] + V[2]*e[5],
00375             V[0]*e[6] + V[1]*e[7] + V[2]*e[8] );
00376 }
00377 //-----------------------------------------------------------------------------
00378 
00379 //=============================================================================
00380 // Static Member Functions for Data Conversions
00381 //-----------------------------------------------------------------------------
00382 template <typename T>
00383 const float * Matrix3x3<T>::GetDataFloat () const
00384 {
00385     for ( int i = 0; i < 9; ++i ) {
00386         g_f[i] = static_cast<float>( e[i] );
00387     }
00388     return g_f;
00389 }
00390 //-----------------------------------------------------------------------------
00391 template <typename T>
00392 const double * Matrix3x3<T>::GetDataDouble () const
00393 {
00394     for ( int i = 0; i < 9; ++i ) {
00395         g_d[i] = static_cast<double>( e[i] );
00396     }
00397     return g_d;
00398 }
00399 //-----------------------------------------------------------------------------
00400 template <typename T>
00401 const long double * Matrix3x3<T>::GetDataLongDouble () const
00402 {
00403     for ( int i = 0; i < 9; ++i ) {
00404         g_ld[i] = static_cast<long double>( e[i] );
00405     }
00406     return g_ld;
00407 }
00408 //-----------------------------------------------------------------------------
00409 template <typename T>
00410 const float * Matrix3x3<T>::GetTransposeDataFloat () const
00411 {
00412     g_f[0] = static_cast<float>( e[0] );
00413     g_f[1] = static_cast<float>( e[3] );
00414     g_f[2] = static_cast<float>( e[6] );
00415     g_f[3] = static_cast<float>( e[1] );
00416     g_f[4] = static_cast<float>( e[4] );
00417     g_f[5] = static_cast<float>( e[7] );
00418     g_f[6] = static_cast<float>( e[2] );
00419     g_f[7] = static_cast<float>( e[5] );
00420     g_f[8] = static_cast<float>( e[8] );
00421     return g_f;
00422 }
00423 //-----------------------------------------------------------------------------
00424 template <typename T>
00425 const double * Matrix3x3<T>::GetTransposeDataDouble () const
00426 {
00427     g_d[0] = static_cast<double>( e[0] );
00428     g_d[1] = static_cast<double>( e[3] );
00429     g_d[2] = static_cast<double>( e[6] );
00430     g_d[3] = static_cast<double>( e[1] );
00431     g_d[4] = static_cast<double>( e[4] );
00432     g_d[5] = static_cast<double>( e[7] );
00433     g_d[6] = static_cast<double>( e[2] );
00434     g_d[7] = static_cast<double>( e[5] );
00435     g_d[8] = static_cast<double>( e[8] );
00436     return g_d;
00437 }
00438 //-----------------------------------------------------------------------------
00439 template <typename T>
00440 const long double * Matrix3x3<T>::GetTransposeDataLongDouble () const
00441 {
00442     g_ld[0] = static_cast<long double>( e[0] );
00443     g_ld[1] = static_cast<long double>( e[3] );
00444     g_ld[2] = static_cast<long double>( e[6] );
00445     g_ld[3] = static_cast<long double>( e[1] );
00446     g_ld[4] = static_cast<long double>( e[4] );
00447     g_ld[5] = static_cast<long double>( e[7] );
00448     g_ld[6] = static_cast<long double>( e[2] );
00449     g_ld[7] = static_cast<long double>( e[5] );
00450     g_ld[8] = static_cast<long double>( e[8] );
00451     return g_ld;
00452 }
00453 //-----------------------------------------------------------------------------
00454 //=============================================================================
00455 END_NAMESPACE_TAPs
00456 //345678901234567890123456789012345678901234567890123456789012345678901234567890
00457 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines