![]() |
TAPs 0.7.7.3
|
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