SIBCVector2Dd.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 _VECTOR2_H_
00022 #define _VECTOR2_H_
00023 
00024 //******************************************************************************
00025 // Includes
00026 //******************************************************************************
00027 #include "SIBCMathLib.h"
00028 
00029 //******************************************************************************
00030 // Typedefs
00031 //******************************************************************************
00032 
00033 //******************************************************************************
00034 // CSIBCVector2Dd | General 2D vector.
00035 //******************************************************************************
00036 
00049 class XSICOREEXPORT CSIBCVector2Dd
00050 {
00051     // Public members
00052     public:
00053 
00054         //****************************************
00055         // IMPLEMENTATION
00056 
00060         CSIBCVector2Dd( );
00061 
00067         CSIBCVector2Dd( const double  in_dX, const double in_dY );
00068 
00073         CSIBCVector2Dd( const double in_dXY[2] );
00074 
00080         CSIBCVector2Dd( int in_nIndex, double in_dVal );
00081 
00082         ~CSIBCVector2Dd();
00083 
00090         const double * GetArray() const;
00091 
00098         double GetX( void ) const;
00099 
00106         double GetY( void ) const;
00107 
00115         double Get( const int in_nIndex ) const;
00116 
00124         void    Get( double& out_dX, double& out_dY ) const;
00125 
00133         double GetMaxComponent( bool in_bInAbs = true ) const;
00134 
00142         double GetMinComponent( bool in_bInAbs = true ) const;
00143 
00151         int GetIndexOfMaxComponent( bool in_bInAbs = true ) const;
00152 
00160         int GetIndexOfMinComponent( bool in_bInAbs = true ) const;
00161 
00169         CSIBCVector2Dd& SetX ( const double in_dVal );
00170 
00178         CSIBCVector2Dd& SetY ( const double in_dVal );
00179 
00188         CSIBCVector2Dd& Set( const CSIBCVector2Dd& in_vct );
00189 
00197         CSIBCVector2Dd& Set( const int in_nIndex, const double in_dVal );
00198 
00208         CSIBCVector2Dd& Set( const double in_dX, const double in_dY );
00209 
00215         CSIBCVector2Dd& SetNull( void );
00216 
00225         bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00226 
00239         CSIBCVector2Dd& SetMinimal ( bool in_bInAbs = true, const double in_dEpsilon=PICO_EPS );
00240 
00254         CSIBCVector2Dd& SetMinimal ( const CSIBCVector2Dd & in_vct, bool in_bInAbs = true );
00255 
00256 
00268         friend bool AreAlmostEqual( const CSIBCVector2Dd& in_vct1,
00269                                     const CSIBCVector2Dd& in_vct2,
00270                                     const double in_dEpsilon = PICO_EPS );
00271 
00272 
00281         bool operator == ( const CSIBCVector2Dd& in_vct ) const;
00282 
00291         bool operator != ( const CSIBCVector2Dd& in_vct ) const;
00292 
00298         CSIBCVector2Dd& Negate( const CSIBCVector2Dd& in_vct );
00299 
00304         CSIBCVector2Dd& Negate( void );
00305 
00312         double GetSquaredLength( void ) const;
00313 
00320         double GetLength( void ) const;
00321 
00329         bool SetLength( const double in_dLength );
00330 
00337         bool Normalize( void );
00338 
00339         // Efficient arithmetic operations.
00340 
00347         CSIBCVector2Dd& Add( const CSIBCVector2Dd&  in_vct  );
00348 
00356         CSIBCVector2Dd& Add( const CSIBCVector2Dd&  in_vct1, const CSIBCVector2Dd& in_vct2 );
00357 
00364         CSIBCVector2Dd& Sub( const CSIBCVector2Dd&  in_vct );
00365 
00373         CSIBCVector2Dd& Sub( const CSIBCVector2Dd&  in_vct1, const CSIBCVector2Dd& in_vct2 );
00374 
00384         CSIBCVector2Dd& Mul( const double in_dFactor );
00385 
00396         CSIBCVector2Dd& Mul( const double in_dFactor, const CSIBCVector2Dd& in_vct );
00397 
00408         CSIBCVector2Dd& Mul( const CSIBCVector2Dd& in_vct, const double in_dFactor );
00409 
00419         CSIBCVector2Dd& Div( const double in_dFactor );
00420 
00431         CSIBCVector2Dd& Div( const CSIBCVector2Dd& in_vct, const double in_dFactor );
00432 
00443         CSIBCVector2Dd& MulComp( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2  );
00444 
00454         CSIBCVector2Dd& MulComp( const CSIBCVector2Dd& in_vct );
00455 
00465         CSIBCVector2Dd& DivComp( const CSIBCVector2Dd& in_vct );
00466 
00477         CSIBCVector2Dd& DivComp( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00478 
00479         // TODO  Remove set of functions to multiply by CSIBCRotMatd as soon as
00480         //       CSIBCRotMatd and CSIBCMatrix33d will both derived public from a
00481         //       common base matrix class.
00482 
00495         CSIBCVector2Dd& Mul( const CSIBCVector3Dd&  in_vct, const CSIBCRotMatd& in_mat );
00496 
00509         CSIBCVector2Dd& Mul( const CSIBCRotMatd& in_mat, const CSIBCVector3Dd& in_vct );
00510 
00516         friend double GetDot( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00517 
00524         bool SetProjection( const CSIBCVector2Dd& in_vct );
00525 
00532         CSIBCVector2Dd& SetMirror( const CSIBCVector2Dd& in_vct1,
00533                                     const CSIBCVector2Dd& in_vct2 );
00534 
00535 
00543         friend double GetDistance( const CSIBCVector2Dd& in_pnt1,
00544                                     const CSIBCVector2Dd& in_pnt2 );
00545 
00553         friend double GetSquaredDistance( const CSIBCVector2Dd& in_pnt1,
00554                                     const CSIBCVector2Dd& in_pnt2 );
00555 
00565         friend int Get2DPntSide(    const CSIBCVector2Dd& in_pnt,
00566                                     const CSIBCVector2Dd& in_pntOrigin,
00567                                     const CSIBCVector2Dd& in_pntTip );
00568 
00578         friend bool FSegmentIntersect(  const CSIBCVector2Dd& a0,
00579                                         const CSIBCVector2Dd& a1,
00580                                         const CSIBCVector2Dd& b0,
00581                                         const CSIBCVector2Dd& b1 );
00582 
00589         CSIBCVector2Dd& SetMidpoint(    const CSIBCVector2Dd& in_pnt1,
00590                                         const CSIBCVector2Dd& in_pnt2 );
00591 
00600         CSIBCVector2Dd& LinearPositionInterpolate( const CSIBCVector2Dd& in_vct1,
00601                                     const CSIBCVector2Dd& in_vct2, const double in_dT );
00602 
00604         // To be implemented later //
00606         // The following methods will be implemented later.
00607 
00608         // Cardinal & Bezier Position Interpolate doens't exist in SI3D3.7
00609         // What about Linear, Cardinal & Bezier VectorInterpolate
00610 
00611         // SetBounds    | Readjust boundaries (min and max) to contain a given point.
00613         void SetBounds( const CSIBCVector2Dd& in_pnt,
00614                                     CSIBCVector2Dd& io_min, CSIBCVector2Dd& io_max );
00615 
00616         // Combine      | Compute this=s1*v1 + s2*v2.
00618         CSIBCVector2Dd& Combine( const CSIBCVector2Dd& in_vct1, const double in_dS1,
00619                                     const CSIBCVector2Dd& in_vct2, const double in_dS2 );
00620 
00622         // To finish implementing.   //
00624 
00625         // BsplinePositionInterpolate | Interpolates a BSpline position between four 2D vectors.
00627         CSIBCVector2Dd& BsplinePositionInterpolate( const CSIBCVector2Dd& in_vct1,
00628                                     const CSIBCVector2Dd& in_vct2, const CSIBCVector2Dd& in_vct3,
00629                                     const CSIBCVector2Dd& in_vct4, const double in_dT );
00630         // BsplineVectorInterpolate | Interpolates a BSpline vector between four 2D vectors.
00632         CSIBCVector2Dd& BsplineVectorInterpolate( const CSIBCVector2Dd& in_vct1,
00633                                     const CSIBCVector2Dd& in_vct2, const CSIBCVector2Dd& in_vct3,
00634                                     const CSIBCVector2Dd& in_vct4, const double in_dT );
00635 
00636         // ArePntsCollinear | Verify if three points are collinear.
00638         friend bool ArePntsCollinear( const CSIBCVector2Dd& in_pnt1,
00639                                         const CSIBCVector2Dd& in_pnt2,
00640                                         const CSIBCVector2Dd& in_pnt3,
00641                                         const double in_dEpsilon = PICO_EPS );
00642 
00643     // Private Members
00644     private:
00645 
00646         CSIBCVector2Dd( const CSIBCVector2Dd& in_vct );
00647 
00648         //****************************************
00649         // ATTRIBUTES
00650         //****************************************
00651         // double | CSIBCVector2Dd | m_dX | X component of the vector.
00652         // double | CSIBCVector2Dd | m_dY | Y component of the vector.
00653         double  m_dX, m_dY;
00654 };
00655 
00656 //******************************************************************************
00657 //
00658 // Author       : Michel Carigan
00659 // Date         : 08/05/96
00660 // Updated by   : Eric Cabot (02/25/97)
00661 //
00662 // Set each component to be at least epsilon (in absolute or not depending on in_bInAbs).
00663 //
00664 // A reference on this.
00665 //
00666 // This function works like the macro _SI_VCT_EPS in v3.51
00667 // That is, each component are set to eps only if they are less than epsilon.
00668 // In that case the sign is unchanged.
00669 //
00670 //
00671 //******************************************************************************
00672 inline CSIBCVector2Dd&
00673 CSIBCVector2Dd::SetMinimal
00674     (
00675         bool in_bInAbs,             // Tells if the test is done in absolute value or not (true by default).
00676         const double in_dEpsilon    // The epsilon to compare with (#PICO_EPS by default).
00677     )
00678 {
00679 
00680     if( in_bInAbs )
00681     {
00682 
00683         if( fabs(m_dX) < in_dEpsilon )
00684             m_dX = ( ( m_dX >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00685         if( fabs(m_dY) < in_dEpsilon )
00686             m_dY = ( ( m_dY >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00687     }
00688     else
00689     {
00690         if( m_dX < in_dEpsilon )
00691         {
00692             m_dX = in_dEpsilon;
00693         }
00694         if( m_dY < in_dEpsilon )
00695         {
00696             m_dY = in_dEpsilon;
00697         }
00698     }
00699 
00700     return *this;
00701 }
00702 
00703 #endif