00001
00002
00012
00013
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017
00018
00019
00020
00021 #ifndef _VECTOR2_H_
00022 #define _VECTOR2_H_
00023
00024
00025
00026
00027 #include "SIBCMathLib.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00049 class XSICOREEXPORT CSIBCVector2Dd
00050 {
00051
00052 public:
00053
00054
00055
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
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
00480
00481
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
00606
00607
00608
00609
00610
00611
00613 void SetBounds( const CSIBCVector2Dd& in_pnt,
00614 CSIBCVector2Dd& io_min, CSIBCVector2Dd& io_max );
00615
00616
00618 CSIBCVector2Dd& Combine( const CSIBCVector2Dd& in_vct1, const double in_dS1,
00619 const CSIBCVector2Dd& in_vct2, const double in_dS2 );
00620
00622
00624
00625
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
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
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
00644 private:
00645
00646 CSIBCVector2Dd( const CSIBCVector2Dd& in_vct );
00647
00648
00649
00650
00651
00652
00653 double m_dX, m_dY;
00654 };
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672 inline CSIBCVector2Dd&
00673 CSIBCVector2Dd::SetMinimal
00674 (
00675 bool in_bInAbs,
00676 const double in_dEpsilon
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