xsi_matrix3f.h Source File
 
 
 
xsi_matrix3f.h
Go to the documentation of this file.
00001 //*****************************************************************************
00011 //*****************************************************************************
00012 
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016 
00017 #ifndef __XSIMATRIX3F_H__
00018 #define __XSIMATRIX3F_H__
00019 
00020 #include "sicppsdk.h"
00021 #include "xsi_math.h"
00022 
00023 namespace XSI {
00024 namespace MATH {
00025 
00026 class CVector3f;
00027 
00028 //*****************************************************************************
00033 //*****************************************************************************
00034 class SICPPSDKDECL CMatrix3f
00035 {
00036 public:
00037 
00039         SICPPSDK_INLINE CMatrix3f();
00040 
00052         SICPPSDK_INLINE CMatrix3f(      float in_00, float in_01, float in_02,
00053                                                                 float in_10, float in_11, float in_12,
00054                                                                 float in_20, float in_21, float in_22);
00055 
00059         SICPPSDK_INLINE CMatrix3f( const CMatrix3f& in_matrix3);
00060 
00062         SICPPSDK_INLINE ~CMatrix3f();
00063 
00067         SICPPSDK_INLINE CMatrix3f  & operator=( const CMatrix3f & in_matrix3 );
00068 
00074         SICPPSDK_INLINE CMatrix3f & operator*=(const CMatrix3f & in_matrix3 );
00075 
00079         SICPPSDK_INLINE CMatrix3f& SetIdentity();
00080 
00085         SICPPSDK_INLINE bool Invert(const CMatrix3f& in_matrix3);
00086 
00090         SICPPSDK_INLINE bool TransposeInverseInPlace();
00091 
00097         SICPPSDK_INLINE bool TransposeInverse(const CMatrix3f& in_matrix3);
00098 
00101         SICPPSDK_INLINE void TransposeInPlace();
00102 
00106         SICPPSDK_INLINE void Transpose(const CMatrix3f& in_matrix3);
00107 
00112         SICPPSDK_INLINE CMatrix3f& MulInPlace(const CMatrix3f& in_matrix3);
00113 
00120         SICPPSDK_INLINE CMatrix3f& Mul(const CMatrix3f& in_matrix3A, const CMatrix3f& in_matrix3B);
00121 
00133         SICPPSDK_INLINE void Get(       float& io_00, float& io_01, float& io_02,
00134                                                                 float& io_10, float& io_11, float& io_12,
00135                                                                 float& io_20, float& io_21, float& io_22) const;
00136 
00148         SICPPSDK_INLINE void Set(       float in_00, float in_01, float in_02,
00149                                                                 float in_10, float in_11, float in_12,
00150                                                                 float in_20, float in_21, float in_22);
00151 
00155         SICPPSDK_INLINE void Set(const float in_Val[3][3]);
00156 
00160         SICPPSDK_INLINE float* Get();
00161 
00167         SICPPSDK_INLINE float GetValue(short in_sRow,short in_sCol )const;
00168 
00174         SICPPSDK_INLINE void SetValue(short in_sRow, short in_sCol, float in_Val );
00175 
00181         bool EpsilonEquals( const CMatrix3f& in_matrix3, float in_Epsilon ) const;
00182 
00187         SICPPSDK_INLINE bool Equals(const CMatrix3f& in_matrix3) const;
00188 
00194         SICPPSDK_INLINE bool operator ==(const CMatrix3f & in_matrix3 ) const;
00195 
00201         SICPPSDK_INLINE bool operator !=(const CMatrix3f & in_matrix3 ) const;
00202 
00210         SICPPSDK_INLINE bool operator < (const CMatrix3f& in_matrix3 )const;
00211 
00216         SICPPSDK_INLINE const float* Get() const;
00217 
00218 private:
00219         float m_Mat[3][3];
00220 
00221         SICPPSDK_INLINE void ComputeDetAndDetSize
00222         (
00223                 const float in_fMat[3][3],
00224                 float &out_fDet,
00225                 float &out_fDetSize
00226         );
00227         SICPPSDK_INLINE void ComputeAdjoint
00228         (
00229                 const float in_fMat[3][3],
00230                 float out_fAdj[3][3]
00231         );
00232         SICPPSDK_INLINE bool ComputeInverse
00233         (
00234                 const float in_fMat[3][3],
00235                 float out_fInv[3][3],
00236                 const bool in_bTransposeResult = false,
00237                 const float in_fEps = MicroEPS
00238         );
00239 };
00240 
00241 SICPPSDK_INLINE CMatrix3f::CMatrix3f()
00242 {
00243         m_Mat[0][0] = 0.0;
00244         m_Mat[0][1] = 0.0;
00245         m_Mat[0][2] = 0.0;
00246         m_Mat[1][0] = 0.0;
00247         m_Mat[1][1] = 0.0;
00248         m_Mat[1][2] = 0.0;
00249         m_Mat[2][0] = 0.0;
00250         m_Mat[2][1] = 0.0;
00251         m_Mat[2][2] = 0.0;
00252 }
00253 
00254 SICPPSDK_INLINE CMatrix3f::CMatrix3f
00255 (
00256         float in_00, float in_01, float in_02,
00257         float in_10, float in_11, float in_12,
00258         float in_20, float in_21, float in_22
00259 )
00260 {
00261         m_Mat[0][0] = in_00;
00262         m_Mat[0][1] = in_01;
00263         m_Mat[0][2] = in_02;
00264         m_Mat[1][0] = in_10;
00265         m_Mat[1][1] = in_11;
00266         m_Mat[1][2] = in_12;
00267         m_Mat[2][0] = in_20;
00268         m_Mat[2][1] = in_21;
00269         m_Mat[2][2] = in_22;
00270 }
00271 
00272 SICPPSDK_INLINE CMatrix3f::CMatrix3f(const CMatrix3f& in_matrix3)
00273 {
00274         m_Mat[0][0] = in_matrix3.m_Mat[0][0];
00275         m_Mat[0][1] = in_matrix3.m_Mat[0][1];
00276         m_Mat[0][2] = in_matrix3.m_Mat[0][2];
00277         m_Mat[1][0] = in_matrix3.m_Mat[1][0];
00278         m_Mat[1][1] = in_matrix3.m_Mat[1][1];
00279         m_Mat[1][2] = in_matrix3.m_Mat[1][2];
00280         m_Mat[2][0] = in_matrix3.m_Mat[2][0];
00281         m_Mat[2][1] = in_matrix3.m_Mat[2][1];
00282         m_Mat[2][2] = in_matrix3.m_Mat[2][2];
00283 }
00284 
00285 SICPPSDK_INLINE CMatrix3f::~CMatrix3f()
00286 {}
00287 
00288 SICPPSDK_INLINE CMatrix3f& CMatrix3f::operator=( const CMatrix3f & in_matrix3 )
00289 {
00290         Set(in_matrix3.m_Mat);
00291         return *this;
00292 }
00293 
00294 SICPPSDK_INLINE CMatrix3f& CMatrix3f::operator *=(const CMatrix3f& in_matrix3)
00295 {
00296         return MulInPlace(in_matrix3);
00297 }
00298 
00299 SICPPSDK_INLINE CMatrix3f&      CMatrix3f::SetIdentity()
00300 {
00301         m_Mat[0][0] =  1.0;
00302         m_Mat[0][1] =  0.0;
00303         m_Mat[0][2] =  0.0;
00304         m_Mat[1][0] =  0.0;
00305         m_Mat[1][1] =  1.0;
00306         m_Mat[1][2] =  0.0;
00307         m_Mat[2][0] =  0.0;
00308         m_Mat[2][1] =  0.0;
00309         m_Mat[2][2] =  1.0;
00310         return *this;
00311 }
00312 
00313 SICPPSDK_INLINE bool CMatrix3f::Invert(const CMatrix3f& in_matrix3)
00314 {
00315         float Inv[3][3];
00316 
00317         if (ComputeInverse(in_matrix3.m_Mat, Inv))
00318         {
00319                 Set( Inv);
00320                 return true;
00321         }
00322         else // singular matrix
00323         {
00324                 return false;
00325         }
00326 }
00327 
00328 SICPPSDK_INLINE bool CMatrix3f::TransposeInverseInPlace()
00329 {
00330         return TransposeInverse(*this);
00331 }
00332 
00333 SICPPSDK_INLINE bool CMatrix3f::TransposeInverse(const CMatrix3f& in_matrix3)
00334 {
00335         float TransInv[3][3];
00336 
00337         if(ComputeInverse(in_matrix3.m_Mat, TransInv, true))
00338         {
00339                 Set(TransInv);
00340                 return true;
00341         }
00342         else // singular matrix
00343         {
00344                 return false;
00345         }
00346 }
00347 
00348 SICPPSDK_INLINE void CMatrix3f::TransposeInPlace()
00349 {
00350         Transpose(*this);
00351 }
00352 
00353 SICPPSDK_INLINE void CMatrix3f::Transpose(const CMatrix3f& in_matrix3)
00354 {
00355    float  fTempMat[3][3];
00356 
00357    for(int nR=0; nR<3; nR++)
00358    {
00359            for(int nC=0; nC<3; nC++)
00360            {
00361          fTempMat[nR][nC] = in_matrix3.m_Mat[nC][nR];
00362            }
00363    }
00364 
00365         Set(fTempMat);
00366 }
00367 
00368 SICPPSDK_INLINE CMatrix3f&      CMatrix3f::MulInPlace(const CMatrix3f& in_matrix3)
00369 {
00370         return Mul(*this,in_matrix3);
00371 }
00372 
00373 SICPPSDK_INLINE CMatrix3f& CMatrix3f::Mul
00374 (
00375         const CMatrix3f& in_matrix3A,
00376         const CMatrix3f& in_matrix3B
00377 )
00378 {
00379         float  fTempMat[3][3];
00380 
00381         for(int nR=0; nR<3; nR++)
00382         {
00383                 for(int nC=0; nC<3; nC++)
00384                 {
00385                         fTempMat[nR][nC] =
00386                                 in_matrix3A.m_Mat[nR][0] * in_matrix3B.m_Mat[0][nC] +
00387                                 in_matrix3A.m_Mat[nR][1] * in_matrix3B.m_Mat[1][nC] +
00388                                 in_matrix3A.m_Mat[nR][2] * in_matrix3B.m_Mat[2][nC];
00389                 }
00390         }
00391         Set(fTempMat);
00392         return *this;
00393 }
00394 
00395 SICPPSDK_INLINE void CMatrix3f::Get
00396 (
00397         float& io_00, float& io_01, float& io_02,
00398         float& io_10, float& io_11, float& io_12,
00399         float& io_20, float& io_21, float& io_22
00400 ) const
00401 {
00402         io_00 = m_Mat[0][0];
00403         io_01 = m_Mat[0][1];
00404         io_02 = m_Mat[0][2];
00405         io_10 = m_Mat[1][0];
00406         io_11 = m_Mat[1][1];
00407         io_12 = m_Mat[1][2];
00408         io_20 = m_Mat[2][0];
00409         io_21 = m_Mat[2][1];
00410         io_22 = m_Mat[2][2];
00411 }
00412 
00413 SICPPSDK_INLINE void CMatrix3f::Set
00414 (
00415         float in_00, float in_01, float in_02,
00416         float in_10, float in_11, float in_12,
00417         float in_20, float in_21, float in_22
00418 )
00419 {
00420         m_Mat[0][0] = in_00;
00421         m_Mat[0][1] = in_01;
00422         m_Mat[0][2] = in_02;
00423         m_Mat[1][0] = in_10;
00424         m_Mat[1][1] = in_11;
00425         m_Mat[1][2] = in_12;
00426         m_Mat[2][0] = in_20;
00427         m_Mat[2][1] = in_21;
00428         m_Mat[2][2] = in_22;
00429 }
00430 
00431 SICPPSDK_INLINE void CMatrix3f::Set(const float in_Val[3][3])
00432 {
00433         m_Mat[0][0] = in_Val[0][0];
00434         m_Mat[0][1] = in_Val[0][1];
00435         m_Mat[0][2] = in_Val[0][2];
00436         m_Mat[1][0] = in_Val[1][0];
00437         m_Mat[1][1] = in_Val[1][1];
00438         m_Mat[1][2] = in_Val[1][2];
00439         m_Mat[2][0] = in_Val[2][0];
00440         m_Mat[2][1] = in_Val[2][1];
00441         m_Mat[2][2] = in_Val[2][2];
00442 }
00443 
00444 SICPPSDK_INLINE float* CMatrix3f::Get()
00445 {
00446         return &m_Mat[0][0];
00447 }
00448 
00449 SICPPSDK_INLINE const float* CMatrix3f::Get() const
00450 {
00451         return &m_Mat[0][0];
00452 }
00453 
00454 SICPPSDK_INLINE float CMatrix3f::GetValue(short in_sRow,short in_sCol ) const
00455 {
00456         bool l_bValidIndex =  ( in_sRow >=0 && in_sCol >= 0 && in_sRow <=2 && in_sCol <= 2);
00457         assert(l_bValidIndex);
00458 
00459         if(l_bValidIndex)
00460         {
00461                 return m_Mat[in_sRow][in_sCol];
00462         }
00463         return 0.0;
00464 }
00465 
00466 SICPPSDK_INLINE void CMatrix3f::SetValue(short in_sRow, short in_sCol, float in_Val )
00467 {
00468         bool l_bValidIndex =  ( in_sRow >=0 && in_sCol >= 0 &&
00469                                                         in_sRow <=2 && in_sCol <= 2);
00470         assert(l_bValidIndex);
00471 
00472         if(l_bValidIndex)
00473         {
00474                 m_Mat[in_sRow][in_sCol] = in_Val;
00475         }
00476 }
00477 
00478 SICPPSDK_INLINE bool CMatrix3f::Equals(const CMatrix3f& in_matrix3) const
00479 {
00480         return (this == &in_matrix3) ? true :
00481                 m_Mat[0][0] == in_matrix3.m_Mat[0][0] &&
00482                 m_Mat[0][1] == in_matrix3.m_Mat[0][1] &&
00483                 m_Mat[0][2] == in_matrix3.m_Mat[0][2] &&
00484                 m_Mat[1][0] == in_matrix3.m_Mat[1][0] &&
00485                 m_Mat[1][1] == in_matrix3.m_Mat[1][1] &&
00486                 m_Mat[1][2] == in_matrix3.m_Mat[1][2] &&
00487                 m_Mat[2][0] == in_matrix3.m_Mat[2][0] &&
00488                 m_Mat[2][1] == in_matrix3.m_Mat[2][1] &&
00489                 m_Mat[2][2] == in_matrix3.m_Mat[2][2];
00490 }
00491 
00492 SICPPSDK_INLINE bool CMatrix3f::operator ==(const CMatrix3f & in_matrix3 ) const
00493 {
00494         return Equals( in_matrix3 );
00495 }
00496 
00497 SICPPSDK_INLINE bool CMatrix3f::operator !=(const CMatrix3f & in_matrix3 ) const
00498 {
00499         return ! Equals( in_matrix3 );
00500 }
00501 
00502 SICPPSDK_INLINE bool CMatrix3f::operator < (const CMatrix3f& in_matrix3 )const
00503 {
00504         if ( m_Mat[0][0] != in_matrix3.m_Mat[0][0] ) return m_Mat[0][0] < in_matrix3.m_Mat[0][0];
00505         if ( m_Mat[0][1] != in_matrix3.m_Mat[0][1] ) return m_Mat[0][1] < in_matrix3.m_Mat[0][1];
00506         if ( m_Mat[0][2] != in_matrix3.m_Mat[0][2] ) return m_Mat[0][2] < in_matrix3.m_Mat[0][2];
00507         if ( m_Mat[1][0] != in_matrix3.m_Mat[1][0] ) return m_Mat[1][0] < in_matrix3.m_Mat[1][0];
00508         if ( m_Mat[1][1] != in_matrix3.m_Mat[1][1] ) return m_Mat[1][1] < in_matrix3.m_Mat[1][1];
00509         if ( m_Mat[1][2] != in_matrix3.m_Mat[1][2] ) return m_Mat[1][2] < in_matrix3.m_Mat[1][2];
00510         if ( m_Mat[2][0] != in_matrix3.m_Mat[2][0] ) return m_Mat[2][0] < in_matrix3.m_Mat[2][0];
00511         if ( m_Mat[2][1] != in_matrix3.m_Mat[2][1] ) return m_Mat[2][1] < in_matrix3.m_Mat[2][1];
00512         if ( m_Mat[2][2] != in_matrix3.m_Mat[2][2] ) return m_Mat[2][2] < in_matrix3.m_Mat[2][2];
00513         return false;
00514 }
00515 
00516 SICPPSDK_INLINE void CMatrix3f::ComputeDetAndDetSize
00517 (
00518         const float in_fMat[3][3],
00519         float &out_fDet,
00520         float &out_fDetSize
00521 )
00522 {
00523         float fTemp;
00524         out_fDet = 0.0;
00525         out_fDetSize = 0.0;
00526 
00527         fTemp =  in_fMat[0][0] * in_fMat[1][1] * in_fMat[2][2];
00528         out_fDet += fTemp;
00529         out_fDetSize += fabs(fTemp);
00530 
00531         fTemp =  in_fMat[0][1] * in_fMat[1][2] * in_fMat[2][0];
00532         out_fDet += fTemp;
00533         out_fDetSize += fabs(fTemp);
00534 
00535         fTemp =  in_fMat[0][2] * in_fMat[1][0] * in_fMat[2][1];
00536         out_fDet += fTemp;
00537         out_fDetSize += fabs(fTemp);
00538 
00539         fTemp = -in_fMat[0][2] * in_fMat[1][1] * in_fMat[2][0];
00540         out_fDet += fTemp;
00541         out_fDetSize += fabs(fTemp);
00542 
00543         fTemp = -in_fMat[0][1] * in_fMat[1][0] * in_fMat[2][2];
00544         out_fDet += fTemp;
00545         out_fDetSize += fabs(fTemp);
00546 
00547         fTemp = -in_fMat[0][0] * in_fMat[1][2] * in_fMat[2][1];
00548         out_fDet += fTemp;
00549         out_fDetSize += fabs(fTemp);
00550 }
00551 
00552 SICPPSDK_INLINE void CMatrix3f::ComputeAdjoint
00553 (
00554         const float in_fMat[3][3],
00555         float out_fAdj[3][3]
00556 )
00557 {
00558         out_fAdj[0][0] = (in_fMat[1][1]*in_fMat[2][2] - in_fMat[1][2]*in_fMat[2][1]);
00559         out_fAdj[0][1] = - (in_fMat[0][1]*in_fMat[2][2] - in_fMat[0][2]*in_fMat[2][1]);
00560         out_fAdj[0][2] = (in_fMat[0][1]*in_fMat[1][2] - in_fMat[0][2]*in_fMat[1][1]);
00561 
00562         out_fAdj[1][0] = - (in_fMat[1][0]*in_fMat[2][2] - in_fMat[1][2]*in_fMat[2][0]);
00563         out_fAdj[1][1] = (in_fMat[0][0]*in_fMat[2][2] - in_fMat[0][2]*in_fMat[2][0]);
00564         out_fAdj[1][2] = - (in_fMat[0][0]*in_fMat[1][2] - in_fMat[0][2]*in_fMat[1][0]);
00565 
00566         out_fAdj[2][0] = (in_fMat[1][0]*in_fMat[2][1] - in_fMat[1][1]*in_fMat[2][0]);
00567         out_fAdj[2][1] = - (in_fMat[0][0]*in_fMat[2][1] - in_fMat[0][1]*in_fMat[2][0]);
00568         out_fAdj[2][2] = (in_fMat[0][0]*in_fMat[1][1] - in_fMat[0][1]*in_fMat[1][0]);
00569 }
00570 
00571 SICPPSDK_INLINE bool CMatrix3f::ComputeInverse
00572 (
00573         const float in_fMat[3][3],
00574         float out_fInv[3][3],
00575         const bool in_bTransposeResult,
00576         const float in_fEps
00577 )
00578 {
00579         float fAdj[3][3];
00580         float fDet=0.0, fDetSize=0.0, fInvDet;
00581 
00582         ComputeDetAndDetSize(in_fMat, fDet, fDetSize);
00583         if(fDetSize != 0.0 && fabs(fDet/fDetSize) >= in_fEps)
00584         {
00585                 ComputeAdjoint(in_fMat, fAdj);
00586                 fInvDet = 1.0f/fDet;
00587                 if(in_bTransposeResult)
00588                 {
00589                         for(int nR=0; nR<3; nR++)
00590                         {
00591                                 for(int nC=0; nC<3; nC++)
00592                                 {
00593                                         out_fInv[nC][nR] = fAdj[nR][nC] * fInvDet;
00594                                 }
00595                         }
00596                 }
00597                 else
00598                 {
00599                         for(int nR=0; nR<3; nR++)
00600                         {
00601                                 for(int nC=0; nC<3; nC++)
00602                                 {
00603                                         out_fInv[nR][nC] = fAdj[nR][nC] * fInvDet;
00604                                 }
00605                         }
00606                 }
00607                 return true;
00608         }
00609         else
00610         {
00611                 return false;
00612         }
00613 }
00614 
00615 };
00616 };
00617 
00618 #endif // __XSIMATRIX3F_H__