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