00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00013 #pragma once
00014 #endif
00015
00016
00017
00018
00019 #ifndef _MATRIX44_H_
00020 #define _MATRIX44_H_
00021
00022
00023
00024
00025 #include <assert.h>
00026 #include "SIBCMathLib.h"
00027
00028 #define _3D_NB_BITS_RESERVED_BY_MAT44 (unsigned char)1 //This number must represent the number of bits flags in m_MaskInfo
00029
00030
00031
00032
00033
00034
00035
00036
00038
00047 class XSICOREEXPORT CSIBCMatrix44d
00048 {
00049 public:
00050
00051
00052
00053
00054
00059 CSIBCMatrix44d( void );
00060
00072 CSIBCMatrix44d(
00073 const CSIBCVector4Dd& in_vct0,
00074 const CSIBCVector4Dd& in_vct1,
00075 const CSIBCVector4Dd& in_vct2,
00076 const CSIBCVector4Dd& in_vct3,
00077 const bool in_bAreRows = true );
00078
00098 CSIBCMatrix44d(
00099 const double in_dA00, const double in_dA01, const double in_dA02, const double in_dA03,
00100 const double in_dA10, const double in_dA11, const double in_dA12, const double in_dA13,
00101 const double in_dA20, const double in_dA21, const double in_dA22, const double in_dA23,
00102 const double in_dA30, const double in_dA31, const double in_dA32, const double in_dA33 );
00103
00104
00105 ~CSIBCMatrix44d();
00106
00107
00108
00109
00110
00117 double Get( const int in_nRow, const int in_nCol ) const;
00118
00119
00120
00121
00122
00133 CSIBCMatrix44d& Set( int in_nRow, int in_nCol, const double in_dVal );
00134
00158 CSIBCMatrix44d& Set(
00159 const double in_dA00, const double in_dA01, const double in_dA02, const double in_dA03,
00160 const double in_dA10, const double in_dA11, const double in_dA12, const double in_dA13,
00161 const double in_dA20, const double in_dA21, const double in_dA22, const double in_dA23,
00162 const double in_dA30, const double in_dA31, const double in_dA32, const double in_dA33 );
00163
00164
00174 CSIBCMatrix44d& Set( const double in_dArray[4][4] );
00175
00185 CSIBCMatrix44d& Set( const double *in_dPtr )
00186 {
00187 return Set( (const double (*)[4] ) in_dPtr );
00188 };
00189
00190
00199 CSIBCMatrix44d& Set( const CSIBCMatrix44d& in_mat );
00200
00210 CSIBCMatrix44d& SetRow( const int in_nRow, const CSIBCVector4Dd& in_vct );
00211
00223 CSIBCMatrix44d& SetRow( const int in_nRow, double in_dA0, double in_dA1,
00224 double in_dA2, double in_dA3 );
00225
00235 CSIBCMatrix44d& SetCol( const int in_nCol, const CSIBCVector4Dd& in_vct );
00236
00248 CSIBCMatrix44d& SetCol( const int in_nCol, double in_dA0, double in_dA1,
00249 double in_dA2, double in_dA3 );
00250
00256 CSIBCMatrix44d& SetNull();
00257
00263 CSIBCMatrix44d& SetIdentity();
00264
00265
00266
00267
00268
00279 friend bool AreAlmostEqual( const CSIBCMatrix44d& in_mat1,
00280 const CSIBCMatrix44d& in_mat2, const double in_dEpsilon = PICO_EPS );
00281
00289 bool operator ==( const CSIBCMatrix44d& in_mat ) const;
00290
00298 bool operator !=( const CSIBCMatrix44d& in_mat ) const;
00299
00309 bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00310
00311
00312
00313
00314
00322 CSIBCMatrix44d& Add( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00323
00330 CSIBCMatrix44d& Add( const CSIBCMatrix44d& in_mat );
00331
00339 CSIBCMatrix44d& Sub( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00340
00348 CSIBCMatrix44d& Sub( const CSIBCMatrix44d& in_mat );
00349
00360 CSIBCMatrix44d& Mul( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00361
00371 CSIBCMatrix44d& Mul( const CSIBCMatrix44d& in_mat );
00372
00383 CSIBCMatrix44d& MulTransByReg( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00384
00395 CSIBCMatrix44d& MulRegByTrans( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00396
00403 CSIBCMatrix44d& Negate( const CSIBCMatrix44d& in_mat );
00404
00410 CSIBCMatrix44d& Negate();
00411
00420 CSIBCMatrix44d& Mul( const double in_dFactor, const CSIBCMatrix44d& in_mat );
00421
00430 CSIBCMatrix44d& Mul( const CSIBCMatrix44d& in_mat, const double in_dFactor );
00431
00438 CSIBCMatrix44d& Mul( const double in_dFactor );
00439
00448 CSIBCMatrix44d& Div( const CSIBCMatrix44d& in_mat, const double in_dFactor );
00449
00456 CSIBCMatrix44d& Div( const double in_dFactor );
00457
00463 double GetDet( void ) const;
00464
00473 double GetDet( int in_nRow, int in_nCol ) const;
00474
00479 double GetTrace( void ) const;
00480
00487 CSIBCMatrix44d& Transpose( const CSIBCMatrix44d& in_mat );
00488
00494 CSIBCMatrix44d& Transpose( void );
00495
00503 bool Invert( const CSIBCMatrix44d& in_mat );
00504
00511 bool Invert( void );
00512
00521 bool TransposeInverse( const CSIBCMatrix44d& in_mat );
00522
00530 bool TransposeInverse( void );
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00542 CSIBCMatrix44d& Symmetry( CSIBCMatrix44d& in_mat ) const;
00543
00544
00546 CSIBCMatrix44d& Symmetry( void ) const;
00547
00548
00550 CSIBCMatrix44d& Adjoint( CSIBCMatrix44d& in_mat ) const;
00551
00552
00554 CSIBCMatrix44d& Adjoint( void ) const;
00555
00556
00558 void SetOuterProduct( const CSIBCVector4Dd& in_vct1, const CSIBCVector4Dd& in_vct2 );
00559
00560
00561 protected:
00562
00563
00564
00565
00566
00567 double m_dMat[4][4];
00568
00569
00570
00571
00572
00573 bool ComputeInverse( const double in_dMat[4][4],
00574 double out_dInv[4][4], const bool bTransposeResult=false );
00575
00576
00577 protected:
00578
00579
00580
00581
00582
00583
00584
00585 unsigned char m_MaskInfo;
00586 };
00587
00588
00589 #endif