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