# xsi_matrix3.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 __XSIMATRIX3_H__
    00018 #define __XSIMATRIX3_H__
    00019
    00020 #include "sicppsdk.h"
    00021
    00022 namespace XSI {
    00023 namespace MATH {
    00024
    00025 class CVector3;
    00026 class CQuaternion;
    00027
    00028 //*****************************************************************************
    00050 //*****************************************************************************
    00051 class SICPPSDKDECL CMatrix3
    00052 {
    00053 public:
    00054
    00056     SICPPSDK_INLINE CMatrix3();
    00057
    00069     SICPPSDK_INLINE CMatrix3(double in_d00, double in_d01, double in_d02,
    00070              double in_d10, double in_d11, double in_d12,
    00071              double in_d20, double in_d21, double in_d22);
    00072
    00076     SICPPSDK_INLINE CMatrix3( const CMatrix3& in_matrix3);
    00077
    00079     SICPPSDK_INLINE ~CMatrix3();
    00080
    00084     SICPPSDK_INLINE CMatrix3  & operator=( const CMatrix3 & in_matrix3 );
    00085
    00086
    00092     SICPPSDK_INLINE CMatrix3 & operator*=(const CMatrix3 & in_matrix3 );
    00093
    00099     CVector3& operator[](const short& in_sIndex);
    00100
    00104     SICPPSDK_INLINE CMatrix3&   SetIdentity();
    00105
    00109     bool        InvertInPlace();
    00110
    00115     bool        Invert(const CMatrix3& in_matrix3);
    00116
    00120     bool        TransposeInverseInPlace();
    00121
    00127     bool        TransposeInverse(const CMatrix3& in_matrix3);
    00128
    00131     SICPPSDK_INLINE void        TransposeInPlace();
    00132
    00136     SICPPSDK_INLINE void        Transpose(const CMatrix3& in_matrix3);
    00137
    00143     SICPPSDK_INLINE CMatrix3&       MulInPlace(const CMatrix3& in_matrix3);
    00144
    00151     SICPPSDK_INLINE CMatrix3&       Mul(const CMatrix3& in_matrix3A, const CMatrix3& in_matrix3B);
    00152
    00164     SICPPSDK_INLINE void    Get(    double& io_d00, double& io_d01, double& io_d02,
    00165                     double& io_d10, double& io_d11, double& io_d12,
    00166                     double& io_d20, double& io_d21, double& io_d22) const;
    00167
    00168
    00180     SICPPSDK_INLINE void    Set(    double in_d00, double in_d01, double in_d02,
    00181                     double in_d10, double in_d11, double in_d12,
    00182                     double in_d20, double in_d21, double in_d22);
    00183
    00187     SICPPSDK_INLINE void    Set(const double in_dVal[3][3]);
    00188
    00194     SICPPSDK_INLINE double      GetValue(short in_sRow,short in_sCol )const;
    00195
    00201     SICPPSDK_INLINE void        SetValue(short in_sRow, short in_sCol, double in_dVal );
    00202
    00207     CMatrix3& SetFromQuaternion( const CQuaternion& in_quaternion );
    00208
    00212     CQuaternion GetQuaternion(void)const;
    00213
    00219     bool EpsilonEquals
    00220     (
    00221         const CMatrix3& in_matrix3,
    00222         double in_dEpsilon
    00223     ) const;
    00224
    00229     SICPPSDK_INLINE bool Equals(const CMatrix3& in_matrix3) const;
    00235     SICPPSDK_INLINE bool operator ==(const CMatrix3 & in_matrix3 ) const;
    00236
    00242     SICPPSDK_INLINE bool operator !=(const CMatrix3 & in_matrix3 ) const;
    00243
    00244 private:
    00245     double m_dMat[3][3];
    00246 };
    00247
    00248 //inline functions
    00249 SICPPSDK_INLINE CMatrix3::CMatrix3()
    00250 {
    00251     m_dMat[0][0] = 0.0;
    00252     m_dMat[0][1] = 0.0;
    00253     m_dMat[0][2] = 0.0;
    00254     m_dMat[1][0] = 0.0;
    00255     m_dMat[1][1] = 0.0;
    00256     m_dMat[1][2] = 0.0;
    00257     m_dMat[2][0] = 0.0;
    00258     m_dMat[2][1] = 0.0;
    00259     m_dMat[2][2] = 0.0;
    00260 }
    00261
    00262 SICPPSDK_INLINE CMatrix3::CMatrix3
    00263 (
    00264  double in_d00, double in_d01, double in_d02,
    00265  double in_d10, double in_d11, double in_d12,
    00266  double in_d20, double in_d21, double in_d22
    00267 )
    00268 {
    00269     m_dMat[0][0] = in_d00;
    00270     m_dMat[0][1] = in_d01;
    00271     m_dMat[0][2] = in_d02;
    00272     m_dMat[1][0] = in_d10;
    00273     m_dMat[1][1] = in_d11;
    00274     m_dMat[1][2] = in_d12;
    00275     m_dMat[2][0] = in_d20;
    00276     m_dMat[2][1] = in_d21;
    00277     m_dMat[2][2] = in_d22;
    00278 }
    00279
    00280 SICPPSDK_INLINE CMatrix3::CMatrix3(const CMatrix3& in_matrix3)
    00281 {
    00282     m_dMat[0][0] = in_matrix3.m_dMat[0][0];
    00283     m_dMat[0][1] = in_matrix3.m_dMat[0][1];
    00284     m_dMat[0][2] = in_matrix3.m_dMat[0][2];
    00285     m_dMat[1][0] = in_matrix3.m_dMat[1][0];
    00286     m_dMat[1][1] = in_matrix3.m_dMat[1][1];
    00287     m_dMat[1][2] = in_matrix3.m_dMat[1][2];
    00288     m_dMat[2][0] = in_matrix3.m_dMat[2][0];
    00289     m_dMat[2][1] = in_matrix3.m_dMat[2][1];
    00290     m_dMat[2][2] = in_matrix3.m_dMat[2][2];
    00291 }
    00292
    00293 SICPPSDK_INLINE CMatrix3::~CMatrix3()
    00294 {}
    00295
    00296 SICPPSDK_INLINE CMatrix3& CMatrix3::operator=( const CMatrix3 & in_matrix3 )
    00297 {
    00298     Set(in_matrix3.m_dMat);
    00299     return *this;
    00300 }
    00301
    00302 SICPPSDK_INLINE CMatrix3& CMatrix3::operator *=(const CMatrix3& in_matrix3)
    00303 {
    00304     return MulInPlace(in_matrix3);
    00305 }
    00306
    00307 SICPPSDK_INLINE CMatrix3&   CMatrix3::SetIdentity()
    00308 {
    00309     m_dMat[0][0] =  1.0;
    00310     m_dMat[0][1] =  0.0;
    00311     m_dMat[0][2] =  0.0;
    00312     m_dMat[1][0] =  0.0;
    00313     m_dMat[1][1] =  1.0;
    00314     m_dMat[1][2] =  0.0;
    00315     m_dMat[2][0] =  0.0;
    00316     m_dMat[2][1] =  0.0;
    00317     m_dMat[2][2] =  1.0;
    00318     return *this;
    00319 }
    00320
    00321 SICPPSDK_INLINE void CMatrix3::TransposeInPlace()
    00322 {
    00323     Transpose(*this);
    00324 }
    00325
    00326 SICPPSDK_INLINE void CMatrix3::Transpose(const CMatrix3& in_matrix3)
    00327 {
    00328    double  dTempMat[3][3];
    00329
    00330    for(int nR=0; nR<3; nR++)
    00331       for(int nC=0; nC<3; nC++)
    00332          dTempMat[nR][nC] = in_matrix3.m_dMat[nC][nR];
    00333
    00334     Set(dTempMat);
    00335 }
    00336
    00337 SICPPSDK_INLINE CMatrix3&   CMatrix3::MulInPlace(const CMatrix3& in_matrix3)
    00338 {
    00339     return Mul(*this,in_matrix3);
    00340 }
    00341
    00342 SICPPSDK_INLINE CMatrix3&   CMatrix3::Mul
    00343 (
    00344  const CMatrix3& in_matrix3A,
    00345  const CMatrix3& in_matrix3B
    00346 )
    00347 {
    00348     double  dTempMat[3][3];
    00349
    00350     for(int nR=0; nR<3; nR++)
    00351         for(int nC=0; nC<3; nC++)
    00352             dTempMat[nR][nC] =
    00353                 in_matrix3A.m_dMat[nR][0] * in_matrix3B.m_dMat[0][nC] +
    00354                 in_matrix3A.m_dMat[nR][1] * in_matrix3B.m_dMat[1][nC] +
    00355                 in_matrix3A.m_dMat[nR][2] * in_matrix3B.m_dMat[2][nC];
    00356
    00357     Set(dTempMat);
    00358     return *this;
    00359 }
    00360
    00361 SICPPSDK_INLINE void CMatrix3::Get
    00362 (
    00363     double& io_d00, double& io_d01, double& io_d02,
    00364     double& io_d10, double& io_d11, double& io_d12,
    00365     double& io_d20, double& io_d21, double& io_d22
    00366 ) const
    00367 {
    00368
    00369     io_d00 = m_dMat[0][0];
    00370     io_d01 = m_dMat[0][1];
    00371     io_d02 = m_dMat[0][2];
    00372     io_d10 = m_dMat[1][0];
    00373     io_d11 = m_dMat[1][1];
    00374     io_d12 = m_dMat[1][2];
    00375     io_d20 = m_dMat[2][0];
    00376     io_d21 = m_dMat[2][1];
    00377     io_d22 = m_dMat[2][2];
    00378
    00379 }
    00380
    00381 SICPPSDK_INLINE void CMatrix3::Set
    00382 (
    00383     double in_d00, double in_d01, double in_d02,
    00384     double in_d10, double in_d11, double in_d12,
    00385     double in_d20, double in_d21, double in_d22
    00386 )
    00387 {
    00388     m_dMat[0][0] = in_d00;
    00389     m_dMat[0][1] = in_d01;
    00390     m_dMat[0][2] = in_d02;
    00391     m_dMat[1][0] = in_d10;
    00392     m_dMat[1][1] = in_d11;
    00393     m_dMat[1][2] = in_d12;
    00394     m_dMat[2][0] = in_d20;
    00395     m_dMat[2][1] = in_d21;
    00396     m_dMat[2][2] = in_d22;
    00397 }
    00398
    00399 SICPPSDK_INLINE void CMatrix3::Set(const double in_dVal[3][3])
    00400 {
    00401     m_dMat[0][0] = in_dVal[0][0];
    00402     m_dMat[0][1] = in_dVal[0][1];
    00403     m_dMat[0][2] = in_dVal[0][2];
    00404     m_dMat[1][0] = in_dVal[1][0];
    00405     m_dMat[1][1] = in_dVal[1][1];
    00406     m_dMat[1][2] = in_dVal[1][2];
    00407     m_dMat[2][0] = in_dVal[2][0];
    00408     m_dMat[2][1] = in_dVal[2][1];
    00409     m_dMat[2][2] = in_dVal[2][2];
    00410 }
    00411
    00412 SICPPSDK_INLINE double  CMatrix3::GetValue(short in_sRow,short in_sCol ) const
    00413 {
    00414     bool l_bValidIndex =  ( in_sRow >=0 && in_sCol >= 0 &&
    00415                             in_sRow <=2 && in_sCol <= 2);
    00416     assert(l_bValidIndex);
    00417
    00418     if(l_bValidIndex)
    00419     {
    00420         return m_dMat[in_sRow][in_sCol];
    00421     }
    00422     return 0.0;
    00423 }
    00424
    00425 SICPPSDK_INLINE void CMatrix3::SetValue(short in_sRow, short in_sCol, double in_dVal )
    00426 {
    00427     bool l_bValidIndex =  ( in_sRow >=0 && in_sCol >= 0 &&
    00428                             in_sRow <=2 && in_sCol <= 2);
    00429     assert(l_bValidIndex);
    00430
    00431     if(l_bValidIndex)
    00432     {
    00433         m_dMat[in_sRow][in_sCol] = in_dVal;
    00434     }
    00435 }
    00436
    00437
    00438
    00439 SICPPSDK_INLINE bool CMatrix3::Equals(const CMatrix3& in_matrix3) const
    00440 {
    00441     return (this == &in_matrix3) ? true :
    00442         m_dMat[0][0] == in_matrix3.m_dMat[0][0] &&
    00443         m_dMat[0][1] == in_matrix3.m_dMat[0][1] &&
    00444         m_dMat[0][2] == in_matrix3.m_dMat[0][2] &&
    00445         m_dMat[1][0] == in_matrix3.m_dMat[1][0] &&
    00446         m_dMat[1][1] == in_matrix3.m_dMat[1][1] &&
    00447         m_dMat[1][2] == in_matrix3.m_dMat[1][2] &&
    00448         m_dMat[2][0] == in_matrix3.m_dMat[2][0] &&
    00449         m_dMat[2][1] == in_matrix3.m_dMat[2][1] &&
    00450         m_dMat[2][2] == in_matrix3.m_dMat[2][2];
    00451 }
    00452
    00453 SICPPSDK_INLINE bool CMatrix3::operator ==(const CMatrix3 & in_matrix3 ) const
    00454 {
    00455     return Equals( in_matrix3 );
    00456 }
    00457
    00458 SICPPSDK_INLINE bool CMatrix3::operator !=(const CMatrix3 & in_matrix3 ) const
    00459 {
    00460     return ! Equals( in_matrix3 );
    00461 }
    00462
    00463
    00464 };
    00465 };
    00466
    00467 #endif // __XSIMATRIX3_H__