SIBCMatrix33d.h

Go to the documentation of this file.
00001 //***************************************************************************************
00002 // File supervisor: Crosswalk team
00012 //***************************************************************************************
00013 
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017 
00018 //******************************************************************************
00019 //
00020 // Defines
00021 //
00022 //******************************************************************************
00023 #ifndef _MATRIX33_H_
00024 #define _MATRIX33_H_
00025 
00026 //******************************************************************************
00027 //
00028 // Includes
00029 //
00030 //******************************************************************************
00031 #include "SIBCMathLib.h"
00032 
00033 //******************************************************************************
00034 //
00035 // CSIBCMatrix33d | General 3X3 matrix.
00036 //
00037 //******************************************************************************
00038 
00053 class XSICOREEXPORT CSIBCMatrix33d
00054 {
00055     // Public members
00056     public:
00057 
00058         //****************************************
00059         // Constructors/destructor:
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         // Destructor.
00115         ~CSIBCMatrix33d();
00116 
00117         //****************************************
00118         // General access functions:
00119         //****************************************
00120 
00127         double Get( const int in_nRow, const int in_nCol ) const;
00128 
00129         //****************************************
00130         // Matrix element modification functions:
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         // Matrix comparison functions:
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         // Matrix algebra functions:
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         // Utility functions:
00569         //****************************************
00570 
00571         //****************************************
00572         // To be implemented later:
00573         //****************************************
00574 
00575         // Sets this matrix to the symmetrical of the input matrix.
00579         CSIBCMatrix33d& Symmetry( CSIBCMatrix33d& in_mat ) const;
00580 
00581         // Sets this matrix to its symmetrical.
00583         CSIBCMatrix33d& Symmetry( void ) const;
00584 
00585         // Sets this matrix to the product of V1^T and V2.
00590         void SetOuterProduct( const CSIBCVector3Dd& in_vct1, const CSIBCVector3Dd& in_vct2 );
00591 
00592     // Protected members
00593     protected:
00594 
00595         //****************************************
00596         // Protected data
00597         //****************************************
00598         // double[3][3] | CSIBCMatrix33d | m_dMat | Matrix itself.
00599         double m_dMat[3][3];
00600 
00601         //****************************************
00602         // Utility functions:
00603         //****************************************
00604 
00605         // Computes the inverse of a matrix.
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         // Computes the adjoint of a matrix.
00609         void ComputeAdjoint( const double in_dMat[3][3], double out_dAdj[3][3] ) const;
00610 
00611         // Computes the determinant of a matrix given its adjoint.
00612         double ComputeDetFast( double in_dMat[3][3], double in_dAdj[3][3] ) const;
00613 
00614         // Compute the determinant of a matrix and compute a measure of its scale (max. order of magnitude).
00615         void ComputeDetAndDetSize( const double in_dMat[3][3],
00616                 double &out_dDet, double &out_dDetSize ) const;
00617         // Computes eigenvalues and eigenvectors of a symmetric matrix
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