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
00020
00021 #ifndef _MATRIX33_H_
00022 #define _MATRIX33_H_
00023
00024
00025
00026
00027
00028
00029 #include "SIBCMathLib.h"
00030
00031
00032
00033
00034
00035
00036
00038
00050 class XSICOREEXPORT CSIBCMatrix33d
00051 {
00052
00053 public:
00054
00055
00056
00057
00058
00063 CSIBCMatrix33d( void );
00064
00075 CSIBCMatrix33d(
00076 const CSIBCVector3Dd& in_vct0,
00077 const CSIBCVector3Dd& in_vct1,
00078 const CSIBCVector3Dd& in_vct2,
00079 const bool in_bAreRows = true );
00080
00093 CSIBCMatrix33d(
00094 const double in_dA00, const double in_dA01, const double in_dA02,
00095 const double in_dA10, const double in_dA11, const double in_dA12,
00096 const double in_dA20, const double in_dA21, const double in_dA22 );
00097
00108 CSIBCMatrix33d( int in_nRow, int in_nCol, const CSIBCMatrix44d& in_mat );
00109
00110
00111
00112 ~CSIBCMatrix33d();
00113
00114
00115
00116
00117
00124 double Get( const int in_nRow, const int in_nCol ) const;
00125
00126
00127
00128
00129
00140 CSIBCMatrix33d& Set( int in_nRow, int in_nCol, const double in_dVal );
00141
00158 CSIBCMatrix33d& Set(
00159 const double in_dA00, const double in_dA01, const double in_dA02,
00160 const double in_dA10, const double in_dA11, const double in_dA12,
00161 const double in_dA20, const double in_dA21, const double in_dA22 );
00162
00172 CSIBCMatrix33d& Set( double in_dVal[3][3] );
00173
00182 CSIBCMatrix33d& Set( const CSIBCMatrix33d& in_mat );
00183
00195 CSIBCMatrix33d& Set( int in_nRow, int in_nCol, const CSIBCMatrix44d& in_mat );
00196
00206 CSIBCMatrix33d& SetRow( const int in_nRow, const CSIBCVector3Dd& in_vct );
00207
00218 CSIBCMatrix33d& SetRow( const int in_nRow, double in_dA0, double in_dA1, double in_dA2 );
00219
00229 CSIBCMatrix33d& SetCol( const int in_nCol, const CSIBCVector3Dd& in_vct );
00230
00241 CSIBCMatrix33d& SetCol( const int in_nCol, double in_dA0, double in_dA1, double in_dA2 );
00242
00248 CSIBCMatrix33d& SetNull();
00249
00255 CSIBCMatrix33d& SetIdentity();
00256
00257
00258
00259
00260
00271 friend bool AreAlmostEqual( const CSIBCMatrix33d& in_mat1,
00272 const CSIBCMatrix33d& in_mat2, const double in_dEpsilon = PICO_EPS );
00273
00281 bool operator ==( const CSIBCMatrix33d& in_mat ) const;
00282
00290 bool operator !=( const CSIBCMatrix33d& in_mat ) const;
00291
00301 bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00302
00312 bool IsSingular( const double in_dEpsilon=PICO_EPS ) const;
00313
00322 bool IsSymmetric( const double in_dEpsilon=PICO_EPS ) const;
00323
00324
00325
00326
00327
00335 CSIBCMatrix33d& Add( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00336
00343 CSIBCMatrix33d& Add( const CSIBCMatrix33d& in_mat );
00344
00352 CSIBCMatrix33d& Sub( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00353
00361 CSIBCMatrix33d& Sub( const CSIBCMatrix33d& in_mat );
00362
00373 CSIBCMatrix33d& Mul( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00374
00384 CSIBCMatrix33d& Mul( const CSIBCMatrix33d& in_mat );
00385
00396 CSIBCMatrix33d& MulTransByReg( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00397
00408 CSIBCMatrix33d& MulRegByTrans( const CSIBCMatrix33d& in_mat1, const CSIBCMatrix33d& in_mat2 );
00409
00416 CSIBCMatrix33d& Negate( const CSIBCMatrix33d& in_mat );
00417
00423 CSIBCMatrix33d& Negate();
00424
00433 CSIBCMatrix33d& Mul( const double in_dFactor, const CSIBCMatrix33d& in_mat );
00434
00443 CSIBCMatrix33d& Mul( const CSIBCMatrix33d& in_mat, const double in_dFactor );
00444
00451 CSIBCMatrix33d& Mul( const double in_dFactor );
00452
00461 CSIBCMatrix33d& Div( const CSIBCMatrix33d& in_mat, const double in_dFactor );
00462
00469 CSIBCMatrix33d& Div( const double in_dFactor );
00470
00476 double GetDet( void ) const;
00477
00482 double GetTrace( void ) const;
00483
00491 CSIBCMatrix33d& Transpose( const CSIBCMatrix33d& in_mat );
00492
00498 CSIBCMatrix33d& Transpose( void );
00499
00507 bool Invert( const CSIBCMatrix33d& in_mat );
00508
00515 bool Invert( void );
00516
00525 bool TransposeInverse( const CSIBCMatrix33d& in_mat );
00526
00534 bool TransposeInverse( void );
00535
00541 CSIBCMatrix33d& Adjoint( const CSIBCMatrix33d& in_mat );
00542
00547 CSIBCMatrix33d& Adjoint( void );
00548
00556 bool GetEigenVectors( CSIBCMatrix33d& out_matEigenVectors, CSIBCVector3Dd& out_vctEigenValues, const double in_dEps=PICO_EPS ) const;
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00568 CSIBCMatrix33d& Symmetry( CSIBCMatrix33d& in_mat ) const;
00569
00570
00572 CSIBCMatrix33d& Symmetry( void ) const;
00573
00574
00576 void SetOuterProduct( const CSIBCVector3Dd& in_vct1, const CSIBCVector3Dd& in_vct2 );
00577
00578
00579 protected:
00580
00581
00582
00583
00584
00585 double m_dMat[3][3];
00586
00587
00588
00589
00590
00591
00592 bool ComputeInverse( const double in_dMat[3][3], double out_dInv[3][3],
00593 const bool in_bTransposeResult=false, const double in_dDetMin=PICO_EPS ) const;
00594
00595 void ComputeAdjoint( const double in_dMat[3][3], double out_dAdj[3][3] ) const;
00596
00597
00598 double ComputeDetFast( double in_dMat[3][3], double in_dAdj[3][3] ) const;
00599
00600
00601 void ComputeDetAndDetSize( const double in_dMat[3][3],
00602 double &out_dDet, double &out_dDetSize ) const;
00603
00604 bool ComputeEigen( const double in_dMat[3][3], double out_dMatEigenVectors[3][3], CSIBCVector3Dd &out_vctEigenValues,
00605 const double in_dEps=PICO_EPS ) const;
00606 };
00607
00608
00609 #endif
00610