SIBCVectorwd.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 
00022 #ifndef _VECTORW_H_
00023 #define _VECTORW_H_
00024 
00025 //******************************************************************************
00026 // Includes
00027 //******************************************************************************
00028 
00029 #include "SIBCMathLib.h"
00030 
00031 //******************************************************************************
00032 // Typedefs
00033 //******************************************************************************
00034 
00035 //******************************************************************************
00036 // CSIBCVectorwd | General 3D vector.
00037 //******************************************************************************
00038 
00052 class XSICOREEXPORT CSIBCVectorwd
00053 {
00054     // Public members
00055     public:
00056 
00057         //****************************************
00058         // IMPLEMENTATION
00059         //****************************************
00060 
00064         CSIBCVectorwd ( );
00065 
00074         CSIBCVectorwd ( const double in_dX, const double in_dY,
00075                         const double in_dZ, const double in_dW );
00076 
00077         ~CSIBCVectorwd();
00078 
00079         // Individual access to private member:
00080 
00089         double GetX( void ) const;
00090 
00099         double GetY( void ) const;
00100 
00109         double GetZ( void ) const;
00110 
00119         double GetW( void ) const;
00120 
00130         double Get( const int in_iIndex ) const;
00131 
00143         void  Get(  double& out_dX, double& out_dY,
00144                     double& out_dZ, double& out_dW ) const;
00145 
00155         CSIBCVectorwd& SetX( const double in_dVal );
00156 
00166         CSIBCVectorwd& SetY( const double in_dVal );
00167 
00177         CSIBCVectorwd& SetZ( const double in_dVal );
00178 
00188         CSIBCVectorwd& SetW( const double in_dVal );
00189 
00197         CSIBCVectorwd& Set( const int in_nIndex, const double in_dVal );
00198 
00199 
00213         CSIBCVectorwd& Set( const double in_dX, const double in_dY,
00214                             const double in_dZ, const double in_dW );
00215 
00216 
00222         CSIBCVectorwd& SetNull( void );
00223 
00233         bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00234 
00241         CSIBCVectorwd& SetMinimal ( const double in_dEpsilon=PICO_EPS );
00242 
00253         bool AreAlmostEqual ( const CSIBCVectorwd& in_vct,
00254                               const double in_dEpsilon = PICO_EPS ) ;
00255 
00264         bool operator == ( const CSIBCVectorwd& in_vct ) const;
00265 
00274         bool operator != ( const CSIBCVectorwd& in_vct ) const;
00275 
00280         CSIBCVectorwd& Negate( void );
00281 
00288         double GetLength( void ) const;
00289 
00297         bool SetLength( const double in_dLength );
00298 
00305         bool Normalize( void );
00306 
00307         // Efficient arithmetic operations.
00308 
00309 
00318         CSIBCVectorwd& Add( const CSIBCVectorwd& in_vct );
00319 
00329         CSIBCVectorwd& Add( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2  );
00330 
00339         CSIBCVectorwd& Sub( const CSIBCVectorwd& in_vct1 );
00340 
00350         CSIBCVectorwd& Sub( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2  );
00351 
00361         CSIBCVectorwd& Mul( const double in_vct );
00362 
00373         CSIBCVectorwd& Mul( const double in_dFactor, const CSIBCVectorwd& in_vct );
00374 
00385         CSIBCVectorwd& Mul( const CSIBCVectorwd& in_vct, const double in_dFactor );
00386 
00396         CSIBCVectorwd& Div( const double in_vct1);
00397 
00408         CSIBCVectorwd& Div( const double in_dFactor, const CSIBCVectorwd& in_vct );
00409 
00421         CSIBCVectorwd& MulComp( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2  );
00422 
00433         CSIBCVectorwd& MulComp( const CSIBCVectorwd& in_vct );
00434 
00445         CSIBCVectorwd& DivComp( const CSIBCVectorwd& in_vct );
00446 
00458         CSIBCVectorwd& DivComp( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2 );
00459 
00460 
00467         friend double GetDot(   const CSIBCVectorwd& in_vct1,
00468                                 const CSIBCVectorwd& in_vct2 );
00469 
00470 
00478         friend double GetDistance(  const CSIBCVectorwd& in_pnt1,
00479                                     const CSIBCVectorwd& in_pnt2 );
00480 
00488         friend double GetSquaredDistance (  const CSIBCVectorwd& in_pnt1,
00489                                             const CSIBCVectorwd& in_pnt2 );
00490 
00491 
00500         CSIBCVectorwd& SetMidpoint (    const CSIBCVectorwd& in_pnt1,
00501                                         const CSIBCVectorwd& in_pnt2 );
00502 
00503 
00513         CSIBCVectorwd& LinearPositionInterpolate (  const CSIBCVectorwd& in_vct1,
00514                                                     const CSIBCVectorwd& in_vct2,
00515                                                     const double in_dT );
00516 
00517 
00519         // To be implemented later //
00521 
00522 
00523 
00524         // SetOrthogonal    | Given v1 and v2, compute the vector that
00525         //                    is orthogonal to v1, and that is in the same
00526         //                    plane as v1 and v2.
00528         bool SetOrthogonal ( const CSIBCVectorwd& in_vct1,
00529                              const CSIBCVectorwd& in_vct2 );
00530 
00531         // SetOrthoProj     | Same as SetOrthogonal, but the resulting
00532         //                    vector is the projection of v2.
00534         bool SetOrthoProj  ( const CSIBCVectorwd& in_vct1,
00535                              const CSIBCVectorwd& in_vct2 );
00536 
00537         // AreOrthogonal    | Verify if two vectors are orthogonal.
00539         friend bool AreOrthogonal ( const CSIBCVectorwd& in_vct1,
00540                                     const CSIBCVectorwd& in_vct2,
00541                                     const double in_dEpsilon = PICO_EPS );
00542 
00543         // SetProjection    | Project this vector onto another vector.
00545         CSIBCVectorwd& SetProjection ( const CSIBCVectorwd& in_vct );
00546 
00547         // SetMirror        | Compute this=2*v2 - v1.
00549         CSIBCVectorwd& SetMirror(   const CSIBCVectorwd& in_vct1,
00550                                     const CSIBCVectorwd& in_vct2 );
00551 
00553         CSIBCVectorwd& BsplinePositionInterpolate ( const CSIBCVectorwd& in_vct1,
00554                                             const CSIBCVectorwd& in_vct2,
00555                                             const CSIBCVectorwd& in_vct3,
00556                                             const CSIBCVectorwd& in_vct4,
00557                                             const double in_dT );
00558 
00559 
00560         // Combine          | Compute this=s1*v1 + s2*v2.
00562          CSIBCVectorwd& Combine(    const CSIBCVectorwd& in_vct1, const double in_dS1,
00563                                     const CSIBCVectorwd& in_vct2, const double in_dS2 );
00564 
00565         // SetBounds        | Readjust boundaries (min and max) to contain a given point.
00567          void SetBounds     ( const CSIBCVectorwd& in_pnt,
00568                               CSIBCVectorwd& io_min,
00569                               CSIBCVectorwd& io_max );
00570 
00572          friend double GetVctAngle  (   const CSIBCVectorwd& in_vct1,
00573                                         const CSIBCVectorwd& in_vct2,
00574                                         const bool in_bIsSigned = false );
00575 
00576         // GetPntAngle  | Compute angle (signed or not) between three points.
00578         friend double GetPntAngle(  const CSIBCVectorwd& in_pnt1,
00579                                     const CSIBCVectorwd& in_pnt2,
00580                                     const CSIBCVectorwd& in_pnt3,
00581                                     const bool in_bIsSigned = false );
00582 
00583         // GetVctCosAngle   | Compute cosinus of angle between two vectors.
00585           friend double GetVctCosAngle( const CSIBCVectorwd& in_vct1,
00586                                         const CSIBCVectorwd& in_vct2 );
00587 
00588         // GetPntCosAngle   | Compute cosinus of angle between three points.
00590         friend double GetPntCosAngle(   const CSIBCVectorwd& in_pnt1,
00591                                         const CSIBCVectorwd& in_pnt2,
00592                                         const CSIBCVectorwd& in_pnt3 );
00593 
00594         // ArePntCollinear | Verify if three points are collinear.
00596         friend bool ArePntCollinear(    const CSIBCVectorwd& in_pnt1,
00597                                         const CSIBCVectorwd& in_pnt2,
00598                                         const CSIBCVectorwd& in_pnt3,
00599                                         const double in_dEpsilon = PICO_EPS );
00600 
00601         // AreVctCoplanar   | Verify if two vectors are coplanar.
00603         friend bool AreVctCoplanar (    const CSIBCVectorwd& in_vct1,
00604                                         const CSIBCVectorwd& in_vct2,
00605                                         const CSIBCVectorwd& in_vct3,
00606                                         const double in_dEpsilon = PICO_EPS );
00607 
00608         // ArePntCoplanar   | Verify if three points are coplanar.
00610         friend bool ArePntCoplanar( const CSIBCVectorwd& in_pnt1,
00611                                     const CSIBCVectorwd& in_pnt2,
00612                                     const CSIBCVectorwd& in_pnt3,
00613                                     const CSIBCVectorwd& in_pnt4,
00614                                     const double in_dEpsilon = PICO_EPS );
00615 
00616         // GetVctAngle      | Compute angle (signed or not) between two vectors.
00617 
00618 
00619     // Private Members
00620     private:
00621 
00622         //****************************************
00623         // ATTRIBUTES
00624         //****************************************
00625         // double | CSIBCVectorwd | m_dX | X component of the vector.
00626         // double | CSIBCVectorwd | m_dY | Y component of the vector.
00627         // double | CSIBCVectorwd | m_dZ | Z component of the vector.
00628         double  m_dX, m_dY, m_dZ, m_dW;
00629 
00630         //Disable copy constructor and operator =
00631         // CSIBCVectorwd      | The copy Constructor
00632         CSIBCVectorwd ( const CSIBCVectorwd& in_vct );
00633         // operator=                    | Assigment operator.
00634         CSIBCVectorwd& operator = ( const CSIBCVectorwd& in_vct );
00635 };
00636 
00637 //******************************************************************************
00638 //
00639 // Author : Michel Carigan
00640 // Date  : 08/15/96
00641 //
00642 // CSIBCVectorwd& | CSIBCVectorwd | SetMinimal | Sets each component to be at least
00643 //                                epsilon (in absolute).
00644 //
00645 // CSIBCVectorwd& SetMinimal( const double in_dEpsilon = PICO_EPS )
00646 //
00647 // double | in_dEpsilon | Specify the user minimal value. If not given, the default
00648 //                                        value will be <t PICO_EPS>
00649 //
00650 // A reference on this.
00651 //
00652 // This function works like the macro _SI_VCT_EPS in v3.51
00653 // That is, each component are set to eps only if they are less than epsilon.
00654 // In that case the sign is unchanged.
00655 // The w component is set to 1.0
00656 //
00657 //
00658 //******************************************************************************
00659 inline  CSIBCVectorwd&
00660 CSIBCVectorwd::SetMinimal
00661     (
00662         const double in_dEpsilon /* = PICO_EPS */
00663     )
00664 {
00665     if( fabs(m_dX) < in_dEpsilon )
00666         m_dX = ( ( m_dX >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00667     if( fabs(m_dY) < in_dEpsilon )
00668         m_dY = ( ( m_dY >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00669     if( fabs(m_dZ) < in_dEpsilon )
00670         m_dZ = ( ( m_dZ >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00671     m_dW = 1;
00672     return *this;
00673 }
00674 
00675 
00676 #endif  // _VECTORW_H_