00001
00002
00012
00013
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017
00018
00019
00020
00021
00022
00023 #ifndef _MATRIX33_H_
00024 #define _MATRIX33_H_
00025
00026
00027
00028
00029
00030
00031 #include "SIBCMathLib.h"
00032
00033
00034
00035
00036
00037
00038
00053 class XSICOREEXPORT CSIBCMatrix33d
00054 {
00055
00056 public:
00057
00058
00059
00060
00061
00066 CSIBCMatrix33d( void );
00067
00078 CSIBCMatrix33d(
00079 const CSIBCVector3Dd& in_vct0,
00080 const CSIBCVector3Dd& in_vct1,
00081 const CSIBCVector3Dd& in_vct2,
00082 const bool in_bAreRows = true );
00083
00096 CSIBCMatrix33d(
00097 const double in_dA00, const double in_dA01, const double in_dA02,
00098 const double in_dA10, const double in_dA11, const double in_dA12,
00099 const double in_dA20, const double in_dA21, const double in_dA22 );
00100
00111 CSIBCMatrix33d( int in_nRow, int in_nCol, const CSIBCMatrix44d& in_mat );
00112
00113
00114
00115 ~CSIBCMatrix33d();
00116
00117
00118
00119
00120
00127 double Get( const int in_nRow, const int in_nCol ) const;
00128
00129
00130
00131
00132
00143 CSIBCMatrix33d& Set( int in_nRow, int in_nCol, const double in_dVal );
00144
00161 CSIBCMatrix33d& Set(
00162 const double in_dA00, const double in_dA01, const double in_dA02,
00163 const double in_dA10, const double in_dA11, const double in_dA12,
00164 const double in_dA20, const double in_dA21, const double in_dA22 );
00165
00175 CSIBCMatrix33d& Set( double in_dVal[3][3] );
00176
00185 CSIBCMatrix33d& Set( const CSIBCMatrix33d& in_mat );
00186
00198 CSIBCMatrix33d& Set( int in_nRow, int in_nCol, const CSIBCMatrix44d& in_mat );
00199
00209 CSIBCMatrix33d& SetRow( const int in_nRow, const CSIBCVector3Dd& in_vct );
00210
00221 CSIBCMatrix33d& SetRow( const int in_nRow, double in_dA0, double in_dA1, double in_dA2 );
00222
00232 CSIBCMatrix33d& SetCol( const int in_nCol, const CSIBCVector3Dd& in_vct );
00233
00244 CSIBCMatrix33d& SetCol( const int in_nCol, double in_dA0, double in_dA1, double in_dA2 );
00245
00251 CSIBCMatrix33d& SetNull();
00252
00258 CSIBCMatrix33d& SetIdentity();
00259
00260
00261
00262
00263
00275 friend bool AreAlmostEqual( const CSIBCMatrix33d& in_mat1,
00276 const CSIBCMatrix33d& in_mat2, const double in_dEpsilon = PICO_EPS );
00277
00286 bool operator ==( const CSIBCMatrix33d& in_mat ) const;
00287
00296 bool operator !=( const CSIBCMatrix33d& in_mat ) const;
00297
00308 bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00309
00320 bool IsSingular( const double in_dEpsilon=PICO_EPS ) const;
00321
00331 bool IsSymmetric( const double in_dEpsilon=PICO_EPS ) const;
00332
00333
00334
00335
00336
00344 CSIBCMatrix33d& Add( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00345
00352 CSIBCMatrix33d& Add( const CSIBCMatrix33d& in_mat );
00353
00361 CSIBCMatrix33d& Sub( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00362
00370 CSIBCMatrix33d& Sub( const CSIBCMatrix33d& in_mat );
00371
00382 CSIBCMatrix33d& Mul( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00383
00393 CSIBCMatrix33d& Mul( const CSIBCMatrix33d& in_mat );
00394
00405 CSIBCMatrix33d& MulTransByReg( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00406
00417 CSIBCMatrix33d& MulRegByTrans( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00418
00425 CSIBCMatrix33d& Negate( const CSIBCMatrix33d& in_mat );
00426
00432 CSIBCMatrix33d& Negate();
00433
00442 CSIBCMatrix33d& Mul( const double in_dFactor, const CSIBCMatrix33d& in_mat );
00443
00452 CSIBCMatrix33d& Mul( const CSIBCMatrix33d& in_mat, const double in_dFactor );
00453
00460 CSIBCMatrix33d& Mul( const double in_dFactor );
00461
00470 CSIBCMatrix33d& Div( const CSIBCMatrix33d& in_mat, const double in_dFactor );
00471
00478 CSIBCMatrix33d& Div( const double in_dFactor );
00479
00485 double GetDet( void ) const;
00486
00491 double GetTrace( void ) const;
00492
00500 CSIBCMatrix33d& Transpose( const CSIBCMatrix33d& in_mat );
00501
00507 CSIBCMatrix33d& Transpose( void );
00508
00516 bool Invert( const CSIBCMatrix33d& in_mat );
00517
00524 bool Invert( void );
00525
00534 bool TransposeInverse( const CSIBCMatrix33d& in_mat );
00535
00543 bool TransposeInverse( void );
00544
00550 CSIBCMatrix33d& Adjoint( const CSIBCMatrix33d& in_mat );
00551
00556 CSIBCMatrix33d& Adjoint( void );
00557
00565 bool GetEigenVectors( CSIBCMatrix33d& out_matEigenVectors, CSIBCVector3Dd& out_vctEigenValues, const double in_dEps=PICO_EPS ) const;
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00579 CSIBCMatrix33d& Symmetry( CSIBCMatrix33d& in_mat ) const;
00580
00581
00583 CSIBCMatrix33d& Symmetry( void ) const;
00584
00585
00590 void SetOuterProduct( const CSIBCVector3Dd& in_vct1, const CSIBCVector3Dd& in_vct2 );
00591
00592
00593 protected:
00594
00595
00596
00597
00598
00599 double m_dMat[3][3];
00600
00601
00602
00603
00604
00605
00606 bool ComputeInverse( const double in_dMat[3][3], double out_dInv[3][3],
00607 const bool in_bTransposeResult=false, const double in_dDetMin=PICO_EPS ) const;
00608
00609 void ComputeAdjoint( const double in_dMat[3][3], double out_dAdj[3][3] ) const;
00610
00611
00612 double ComputeDetFast( double in_dMat[3][3], double in_dAdj[3][3] ) const;
00613
00614
00615 void ComputeDetAndDetSize( const double in_dMat[3][3],
00616 double &out_dDet, double &out_dDetSize ) const;
00617
00618 bool ComputeEigen( const double in_dMat[3][3], double out_dMatEigenVectors[3][3], CSIBCVector3Dd &out_vctEigenValues,
00619 const double in_dEps=PICO_EPS ) const;
00620 };
00621
00622
00623 #endif
00624