SIBCMatrix44d.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 // Defines
00020 //******************************************************************************
00021 #ifndef _MATRIX44_H_
00022 #define _MATRIX44_H_
00023 
00024 //******************************************************************************
00025 // Includes
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                                                         //reserved for the specific usage of CSIBCMatrix44d
00032 
00033 //******************************************************************************
00034 //
00035 // CSIBCMatrix44d | General 4X4 matrix.
00036 //
00037 //******************************************************************************
00038 
00050 class XSICOREEXPORT CSIBCMatrix44d
00051 {
00052     public:
00053 
00054         //****************************************
00055         // Constructors/destructor:
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         // Destructor.
00108         ~CSIBCMatrix44d();
00109 
00110         //****************************************
00111         // General access functions:
00112         //****************************************
00113 
00120         double Get( const int in_nRow, const int in_nCol ) const;
00121 
00122         //****************************************
00123         // Matrix element modification functions:
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         // Matrix comparison functions:
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         // Matrix algebra functions:
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         // Utility functions:
00541         //****************************************
00542 
00543         //****************************************
00544         // To be implemented later:
00545         //****************************************
00546 
00547         // Sets this matrix to the symmetrical of the input matrix.
00549         CSIBCMatrix44d& Symmetry( CSIBCMatrix44d& in_mat ) const;
00550 
00551         // Sets this matrix to its symmetrical.
00553         CSIBCMatrix44d& Symmetry( void ) const;
00554 
00555         // Sets this matrix to the adjoint of the input matrix.
00557         CSIBCMatrix44d& Adjoint( CSIBCMatrix44d& in_mat ) const;
00558 
00559         // Sets this matrix to its adjoint.
00561         CSIBCMatrix44d& Adjoint( void ) const;
00562 
00563         // Sets this matrix to the product of V1^T and V2.
00565         void SetOuterProduct( const CSIBCVector4Dd& in_vct1, const CSIBCVector4Dd& in_vct2 );
00566 
00567     // Protected members
00568     protected:
00569 
00570         //****************************************
00571         // Protected data
00572         //****************************************
00573         // double[4][4] | CSIBCMatrix44d | m_dMat | Matrix itself.
00574         double m_dMat[4][4];
00575 
00576         //****************************************
00577         // Utility functions:
00578         //****************************************
00579         // Computes the inverse of a matrix.
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         // Private data
00587         //****************************************
00588         // unsigned char | CSIBCMatrix44d | m_MaskInfo |
00589         // Flag to indicate if matrix content has changed
00590         // since last call to SetContentUnchanged().
00591 
00592         unsigned char   m_MaskInfo;
00593 };
00594 
00595 
00596 #endif