00001
00002
00012
00013
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017
00018
00019
00020
00021
00022 #ifndef _VECTORW_H_
00023 #define _VECTORW_H_
00024
00025
00026
00027
00028
00029 #include "SIBCMathLib.h"
00030
00031
00032
00033
00034
00035
00036
00037
00038
00052 class XSICOREEXPORT CSIBCVectorwd
00053 {
00054
00055 public:
00056
00057
00058
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
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
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
00521
00522
00523
00524
00525
00526
00528 bool SetOrthogonal ( const CSIBCVectorwd& in_vct1,
00529 const CSIBCVectorwd& in_vct2 );
00530
00531
00532
00534 bool SetOrthoProj ( const CSIBCVectorwd& in_vct1,
00535 const CSIBCVectorwd& in_vct2 );
00536
00537
00539 friend bool AreOrthogonal ( const CSIBCVectorwd& in_vct1,
00540 const CSIBCVectorwd& in_vct2,
00541 const double in_dEpsilon = PICO_EPS );
00542
00543
00545 CSIBCVectorwd& SetProjection ( const CSIBCVectorwd& in_vct );
00546
00547
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
00562 CSIBCVectorwd& Combine( const CSIBCVectorwd& in_vct1, const double in_dS1,
00563 const CSIBCVectorwd& in_vct2, const double in_dS2 );
00564
00565
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
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
00585 friend double GetVctCosAngle( const CSIBCVectorwd& in_vct1,
00586 const CSIBCVectorwd& in_vct2 );
00587
00588
00590 friend double GetPntCosAngle( const CSIBCVectorwd& in_pnt1,
00591 const CSIBCVectorwd& in_pnt2,
00592 const CSIBCVectorwd& in_pnt3 );
00593
00594
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
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
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
00617
00618
00619
00620 private:
00621
00622
00623
00624
00625
00626
00627
00628 double m_dX, m_dY, m_dZ, m_dW;
00629
00630
00631
00632 CSIBCVectorwd ( const CSIBCVectorwd& in_vct );
00633
00634 CSIBCVectorwd& operator = ( const CSIBCVectorwd& in_vct );
00635 };
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 inline CSIBCVectorwd&
00660 CSIBCVectorwd::SetMinimal
00661 (
00662 const double in_dEpsilon
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_