00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00026 #pragma once
00027 #endif
00028
00029
00030
00031
00032 #ifndef _VECTOR2_H_
00033 #define _VECTOR2_H_
00034
00035
00036
00037
00038 #include "SIBCMathLib.h"
00039
00040
00041
00042
00043
00044
00045
00046
00047
00049
00059 class XSICOREEXPORT CSIBCVector2Dd
00060 {
00061
00062 public:
00063
00064
00065
00066
00070 CSIBCVector2Dd( );
00071
00077 CSIBCVector2Dd( const double in_dX, const double in_dY );
00078
00083 CSIBCVector2Dd( const double in_dXY[2] );
00084
00089 CSIBCVector2Dd( int in_nIndex, double in_dVal );
00090
00091 ~CSIBCVector2Dd();
00092
00099 const double * GetArray() const;
00100
00107 double GetX( void ) const;
00108
00115 double GetY( void ) const;
00116
00124 double Get( const int in_nIndex ) const;
00125
00133 void Get( double& out_dX, double& out_dY ) const;
00134
00144 double GetMaxComponent( bool in_bInAbs = true ) const;
00145
00155 double GetMinComponent( bool in_bInAbs = true ) const;
00156
00165 int GetIndexOfMaxComponent( bool in_bInAbs = true ) const;
00166
00175 int GetIndexOfMinComponent( bool in_bInAbs = true ) const;
00176
00184 CSIBCVector2Dd& SetX ( const double in_dVal );
00185
00193 CSIBCVector2Dd& SetY ( const double in_dVal );
00194
00203 CSIBCVector2Dd& Set( const CSIBCVector2Dd& in_vct );
00204
00212 CSIBCVector2Dd& Set( const int in_nIndex, const double in_dVal );
00213
00223 CSIBCVector2Dd& Set( const double in_dX, const double in_dY );
00224
00230 CSIBCVector2Dd& SetNull( void );
00231
00240 bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00241
00254 CSIBCVector2Dd& SetMinimal ( bool in_bInAbs = true, const double in_dEpsilon=PICO_EPS );
00255
00269 CSIBCVector2Dd& SetMinimal ( const CSIBCVector2Dd & in_vct, bool in_bInAbs = true );
00270
00271
00282 friend bool AreAlmostEqual( const CSIBCVector2Dd& in_vct1,
00283 const CSIBCVector2Dd& in_vct2,
00284 const double in_dEpsilon = PICO_EPS );
00285
00286
00294 bool operator == ( const CSIBCVector2Dd& in_vct ) const;
00295
00303 bool operator != ( const CSIBCVector2Dd& in_vct ) const;
00304
00310 CSIBCVector2Dd& Negate( const CSIBCVector2Dd& in_vct );
00311
00316 CSIBCVector2Dd& Negate( void );
00317
00324 double GetSquaredLength( void ) const;
00325
00332 double GetLength( void ) const;
00333
00341 bool SetLength( const double in_dLength );
00342
00349 bool Normalize( void );
00350
00351
00352
00359 CSIBCVector2Dd& Add( const CSIBCVector2Dd& in_vct );
00360
00368 CSIBCVector2Dd& Add( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00369
00376 CSIBCVector2Dd& Sub( const CSIBCVector2Dd& in_vct );
00377
00385 CSIBCVector2Dd& Sub( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00386
00396 CSIBCVector2Dd& Mul( const double in_dFactor );
00397
00408 CSIBCVector2Dd& Mul( const double in_dFactor, const CSIBCVector2Dd& in_vct );
00409
00420 CSIBCVector2Dd& Mul( const CSIBCVector2Dd& in_vct, const double in_dFactor );
00421
00431 CSIBCVector2Dd& Div( const double in_dFactor );
00432
00443 CSIBCVector2Dd& Div( const CSIBCVector2Dd& in_vct, const double in_dFactor );
00444
00455 CSIBCVector2Dd& MulComp( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00456
00466 CSIBCVector2Dd& MulComp( const CSIBCVector2Dd& in_vct );
00467
00477 CSIBCVector2Dd& DivComp( const CSIBCVector2Dd& in_vct );
00478
00489 CSIBCVector2Dd& DivComp( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00490
00491
00492
00493
00494
00507 CSIBCVector2Dd& Mul( const CSIBCVector3Dd& in_vct, const CSIBCRotMatd& in_mat );
00508
00521 CSIBCVector2Dd& Mul( const CSIBCRotMatd& in_mat, const CSIBCVector3Dd& in_vct );
00522
00528 friend double GetDot( const CSIBCVector2Dd& in_vct1, const CSIBCVector2Dd& in_vct2 );
00529
00536 bool SetProjection( const CSIBCVector2Dd& in_vct );
00537
00544 CSIBCVector2Dd& SetMirror( const CSIBCVector2Dd& in_vct1,
00545 const CSIBCVector2Dd& in_vct2 );
00546
00547
00555 friend double GetDistance( const CSIBCVector2Dd& in_pnt1,
00556 const CSIBCVector2Dd& in_pnt2 );
00557
00565 friend double GetSquaredDistance( const CSIBCVector2Dd& in_pnt1,
00566 const CSIBCVector2Dd& in_pnt2 );
00567
00576 friend int Get2DPntSide( const CSIBCVector2Dd& in_pnt,
00577 const CSIBCVector2Dd& in_pntOrigin,
00578 const CSIBCVector2Dd& in_pntTip );
00579
00588 friend bool FSegmentIntersect( const CSIBCVector2Dd& a0,
00589 const CSIBCVector2Dd& a1,
00590 const CSIBCVector2Dd& b0,
00591 const CSIBCVector2Dd& b1 );
00592
00599 CSIBCVector2Dd& SetMidpoint( const CSIBCVector2Dd& in_pnt1,
00600 const CSIBCVector2Dd& in_pnt2 );
00601
00610 CSIBCVector2Dd& LinearPositionInterpolate( const CSIBCVector2Dd& in_vct1,
00611 const CSIBCVector2Dd& in_vct2, const double in_dT );
00612
00614
00616
00617
00618
00619
00620
00621
00623 void SetBounds( const CSIBCVector2Dd& in_pnt,
00624 CSIBCVector2Dd& io_min, CSIBCVector2Dd& io_max );
00625
00626
00628 CSIBCVector2Dd& Combine( const CSIBCVector2Dd& in_vct1, const double in_dS1,
00629 const CSIBCVector2Dd& in_vct2, const double in_dS2 );
00630
00632
00634
00635
00637 CSIBCVector2Dd& BsplinePositionInterpolate( const CSIBCVector2Dd& in_vct1,
00638 const CSIBCVector2Dd& in_vct2, const CSIBCVector2Dd& in_vct3,
00639 const CSIBCVector2Dd& in_vct4, const double in_dT );
00640
00642 CSIBCVector2Dd& BsplineVectorInterpolate( const CSIBCVector2Dd& in_vct1,
00643 const CSIBCVector2Dd& in_vct2, const CSIBCVector2Dd& in_vct3,
00644 const CSIBCVector2Dd& in_vct4, const double in_dT );
00645
00646
00648 friend bool ArePntsCollinear( const CSIBCVector2Dd& in_pnt1,
00649 const CSIBCVector2Dd& in_pnt2,
00650 const CSIBCVector2Dd& in_pnt3,
00651 const double in_dEpsilon = PICO_EPS );
00652
00653
00654 private:
00655
00656 CSIBCVector2Dd( const CSIBCVector2Dd& in_vct );
00657
00658
00659
00660
00661
00662
00663 double m_dX, m_dY;
00664 };
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682 inline CSIBCVector2Dd&
00683 CSIBCVector2Dd::SetMinimal
00684 (
00685 bool in_bInAbs,
00686 const double in_dEpsilon
00687 )
00688 {
00689
00690 if( in_bInAbs )
00691 {
00692
00693 if( fabs(m_dX) < in_dEpsilon )
00694 m_dX = ( ( m_dX >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00695 if( fabs(m_dY) < in_dEpsilon )
00696 m_dY = ( ( m_dY >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00697 }
00698 else
00699 {
00700 if( m_dX < in_dEpsilon )
00701 {
00702 m_dX = in_dEpsilon;
00703 }
00704 if( m_dY < in_dEpsilon )
00705 {
00706 m_dY = in_dEpsilon;
00707 }
00708 }
00709
00710 return *this;
00711 }
00712
00713 #endif