00001
00002
00012
00013
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017
00018
00019
00020
00021 #ifndef _MATRIX44_H_
00022 #define _MATRIX44_H_
00023
00024
00025
00026
00027 #include <assert.h>
00028 #include "SIBCMathLib.h"
00029
00030 #define _3D_NB_BITS_RESERVED_BY_MAT44 (unsigned char)1 //This number must represent the number of bits flags in m_MaskInfo
00031
00032
00033
00034
00035
00036
00037
00038
00050 class XSICOREEXPORT CSIBCMatrix44d
00051 {
00052 public:
00053
00054
00055
00056
00057
00062 CSIBCMatrix44d( void );
00063
00075 CSIBCMatrix44d(
00076 const CSIBCVector4Dd& in_vct0,
00077 const CSIBCVector4Dd& in_vct1,
00078 const CSIBCVector4Dd& in_vct2,
00079 const CSIBCVector4Dd& in_vct3,
00080 const bool in_bAreRows = true );
00081
00101 CSIBCMatrix44d(
00102 const double in_dA00, const double in_dA01, const double in_dA02, const double in_dA03,
00103 const double in_dA10, const double in_dA11, const double in_dA12, const double in_dA13,
00104 const double in_dA20, const double in_dA21, const double in_dA22, const double in_dA23,
00105 const double in_dA30, const double in_dA31, const double in_dA32, const double in_dA33 );
00106
00107
00108 ~CSIBCMatrix44d();
00109
00110
00111
00112
00113
00120 double Get( const int in_nRow, const int in_nCol ) const;
00121
00122
00123
00124
00125
00136 CSIBCMatrix44d& Set( int in_nRow, int in_nCol, const double in_dVal );
00137
00161 CSIBCMatrix44d& Set(
00162 const double in_dA00, const double in_dA01, const double in_dA02, const double in_dA03,
00163 const double in_dA10, const double in_dA11, const double in_dA12, const double in_dA13,
00164 const double in_dA20, const double in_dA21, const double in_dA22, const double in_dA23,
00165 const double in_dA30, const double in_dA31, const double in_dA32, const double in_dA33 );
00166
00167
00177 CSIBCMatrix44d& Set( const double in_dArray[4][4] );
00178
00188 CSIBCMatrix44d& Set( const double *in_dPtr )
00189 {
00190 return Set( (const double (*)[4] ) in_dPtr );
00191 };
00192
00193
00202 CSIBCMatrix44d& Set( const CSIBCMatrix44d& in_mat );
00203
00213 CSIBCMatrix44d& SetRow( const int in_nRow, const CSIBCVector4Dd& in_vct );
00214
00226 CSIBCMatrix44d& SetRow( const int in_nRow, double in_dA0, double in_dA1,
00227 double in_dA2, double in_dA3 );
00228
00238 CSIBCMatrix44d& SetCol( const int in_nCol, const CSIBCVector4Dd& in_vct );
00239
00251 CSIBCMatrix44d& SetCol( const int in_nCol, double in_dA0, double in_dA1,
00252 double in_dA2, double in_dA3 );
00253
00259 CSIBCMatrix44d& SetNull();
00260
00266 CSIBCMatrix44d& SetIdentity();
00267
00268
00269
00270
00271
00283 friend bool AreAlmostEqual( const CSIBCMatrix44d& in_mat1,
00284 const CSIBCMatrix44d& in_mat2, const double in_dEpsilon = PICO_EPS );
00285
00294 bool operator ==( const CSIBCMatrix44d& in_mat ) const;
00295
00304 bool operator !=( const CSIBCMatrix44d& in_mat ) const;
00305
00316 bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00317
00318
00319
00320
00321
00329 CSIBCMatrix44d& Add( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00330
00337 CSIBCMatrix44d& Add( const CSIBCMatrix44d& in_mat );
00338
00346 CSIBCMatrix44d& Sub( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00347
00355 CSIBCMatrix44d& Sub( const CSIBCMatrix44d& in_mat );
00356
00367 CSIBCMatrix44d& Mul( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00368
00378 CSIBCMatrix44d& Mul( const CSIBCMatrix44d& in_mat );
00379
00390 CSIBCMatrix44d& MulTransByReg( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00391
00402 CSIBCMatrix44d& MulRegByTrans( const CSIBCMatrix44d& in_mat1, const CSIBCMatrix44d& in_mat2 );
00403
00410 CSIBCMatrix44d& Negate( const CSIBCMatrix44d& in_mat );
00411
00417 CSIBCMatrix44d& Negate();
00418
00427 CSIBCMatrix44d& Mul( const double in_dFactor, const CSIBCMatrix44d& in_mat );
00428
00437 CSIBCMatrix44d& Mul( const CSIBCMatrix44d& in_mat, const double in_dFactor );
00438
00445 CSIBCMatrix44d& Mul( const double in_dFactor );
00446
00455 CSIBCMatrix44d& Div( const CSIBCMatrix44d& in_mat, const double in_dFactor );
00456
00463 CSIBCMatrix44d& Div( const double in_dFactor );
00464
00470 double GetDet( void ) const;
00471
00480 double GetDet( int in_nRow, int in_nCol ) const;
00481
00486 double GetTrace( void ) const;
00487
00494 CSIBCMatrix44d& Transpose( const CSIBCMatrix44d& in_mat );
00495
00501 CSIBCMatrix44d& Transpose( void );
00502
00510 bool Invert( const CSIBCMatrix44d& in_mat );
00511
00518 bool Invert( void );
00519
00528 bool TransposeInverse( const CSIBCMatrix44d& in_mat );
00529
00537 bool TransposeInverse( void );
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00549 CSIBCMatrix44d& Symmetry( CSIBCMatrix44d& in_mat ) const;
00550
00551
00553 CSIBCMatrix44d& Symmetry( void ) const;
00554
00555
00557 CSIBCMatrix44d& Adjoint( CSIBCMatrix44d& in_mat ) const;
00558
00559
00561 CSIBCMatrix44d& Adjoint( void ) const;
00562
00563
00565 void SetOuterProduct( const CSIBCVector4Dd& in_vct1, const CSIBCVector4Dd& in_vct2 );
00566
00567
00568 protected:
00569
00570
00571
00572
00573
00574 double m_dMat[4][4];
00575
00576
00577
00578
00579
00580 bool ComputeInverse( const double in_dMat[4][4],
00581 double out_dInv[4][4], const bool bTransposeResult=false );
00582
00583
00584 protected:
00585
00586
00587
00588
00589
00590
00591
00592 unsigned char m_MaskInfo;
00593 };
00594
00595
00596 #endif