SIBCVectorwd.h

00001 //***************************************************************************************
00002 //
00003 // File supervisor: Softimage 3D Games & 3D Bridge team
00004 //
00005 // (c) Copyright 1999-2002 Avid Technology, Inc. . All rights reserved.
00006 //
00007 // SIBCVectorwd.h | Main header file for CSIBCVectorwd implementation.
00008 //***************************************************************************************
00009 
00010 /****************************************************************************************
00011 THIS CODE IS PUBLISHED AS A SAMPLE ONLY AND IS PROVIDED "AS IS".
00012 IN NO EVENT SHALL SOFTIMAGE, AVID TECHNOLOGY, INC. AND/OR THEIR RESPECTIVE
00013 SUPPLIERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
00014 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
00015 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
00016 CONNECTION WITH THE USE OR PERFORMANCE OF THIS CODE .
00017 
00018 COPYRIGHT NOTICE. Copyright © 1999-2002 Avid Technology Inc. . All rights reserved. 
00019 
00020 SOFTIMAGE is a registered trademark of Avid Technology Inc. or its subsidiaries 
00021 or divisions. Windows NT is a registered trademark of Microsoft Corp. All other
00022 trademarks contained herein are the property of their respective owners. 
00023 ****************************************************************************************/
00024 
00025 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00026 #pragma once
00027 #endif
00028 
00029 //******************************************************************************
00030 // Defines
00031 //******************************************************************************
00032 
00033 #ifndef _VECTORW_H_
00034 #define _VECTORW_H_
00035 
00036 //******************************************************************************
00037 // Includes
00038 //****************************************************************************** 
00039 
00040 #include "SIBCMathLib.h"
00041 
00042 //******************************************************************************
00043 // Typedefs
00044 //******************************************************************************
00045 
00046 //******************************************************************************
00047 // CSIBCVectorwd | General 3D vector.
00048 //******************************************************************************
00049 
00051 
00062 class XSICOREEXPORT CSIBCVectorwd
00063 {
00064     // Public members
00065     public:
00066 
00067         //****************************************
00068         // IMPLEMENTATION
00069         //****************************************
00070 
00074         CSIBCVectorwd ( );
00075 
00084         CSIBCVectorwd ( const double in_dX, const double in_dY,
00085                         const double in_dZ, const double in_dW );
00086 
00087         ~CSIBCVectorwd();
00088                      
00089         // Individual access to private member:
00090 
00099         double GetX( void ) const;
00100 
00109         double GetY( void ) const;
00110 
00119         double GetZ( void ) const;
00120 
00129         double GetW( void ) const;
00130 
00141         double Get( const int in_iIndex ) const;
00142 
00154         void  Get(  double& out_dX, double& out_dY,
00155                     double& out_dZ, double& out_dW ) const;
00156 
00166         CSIBCVectorwd& SetX( const double in_dVal );
00167 
00177         CSIBCVectorwd& SetY( const double in_dVal );
00178 
00188         CSIBCVectorwd& SetZ( const double in_dVal );
00189 
00199         CSIBCVectorwd& SetW( const double in_dVal );
00200 
00209         CSIBCVectorwd& Set( const int in_nIndex, const double in_dVal );
00210 
00211 
00225         CSIBCVectorwd& Set( const double in_dX, const double in_dY,
00226                             const double in_dZ, const double in_dW );
00227 
00228 
00234         CSIBCVectorwd& SetNull( void );
00235 
00244         bool IsNull( const double in_dEpsilon=PICO_EPS ) const;
00245 
00252         CSIBCVectorwd& SetMinimal ( const double in_dEpsilon=PICO_EPS );
00253 
00263         bool AreAlmostEqual ( const CSIBCVectorwd& in_vct,
00264                               const double in_dEpsilon = PICO_EPS ) ;
00265 
00273         bool operator == ( const CSIBCVectorwd& in_vct ) const;
00274 
00282         bool operator != ( const CSIBCVectorwd& in_vct ) const;
00283 
00288         CSIBCVectorwd& Negate( void );
00289 
00296         double GetLength( void ) const;
00297 
00305         bool SetLength( const double in_dLength );
00306 
00313         bool Normalize( void );
00314 
00315         // Efficient arithmetic operations.
00316 
00317 
00326         CSIBCVectorwd& Add( const CSIBCVectorwd& in_vct );
00327 
00337         CSIBCVectorwd& Add( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2  );
00338 
00347         CSIBCVectorwd& Sub( const CSIBCVectorwd& in_vct1 );
00348         
00358         CSIBCVectorwd& Sub( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2  );
00359 
00369         CSIBCVectorwd& Mul( const double in_vct );
00370 
00381         CSIBCVectorwd& Mul( const double in_dFactor, const CSIBCVectorwd& in_vct );
00382 
00393         CSIBCVectorwd& Mul( const CSIBCVectorwd& in_vct, const double in_dFactor );
00394 
00404         CSIBCVectorwd& Div( const double in_vct1);
00405 
00416         CSIBCVectorwd& Div( const double in_dFactor, const CSIBCVectorwd& in_vct );
00417 
00429         CSIBCVectorwd& MulComp( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2  );
00430 
00441         CSIBCVectorwd& MulComp( const CSIBCVectorwd& in_vct );
00442 
00453         CSIBCVectorwd& DivComp( const CSIBCVectorwd& in_vct );
00454 
00466         CSIBCVectorwd& DivComp( const CSIBCVectorwd& in_vct1, const CSIBCVectorwd& in_vct2 );
00467 
00468 
00475         friend double GetDot(   const CSIBCVectorwd& in_vct1,
00476                                 const CSIBCVectorwd& in_vct2 );
00477 
00478 
00486         friend double GetDistance(  const CSIBCVectorwd& in_pnt1, 
00487                                     const CSIBCVectorwd& in_pnt2 );
00488 
00496         friend double GetSquaredDistance (  const CSIBCVectorwd& in_pnt1, 
00497                                             const CSIBCVectorwd& in_pnt2 );
00498 
00499 
00508         CSIBCVectorwd& SetMidpoint (    const CSIBCVectorwd& in_pnt1,
00509                                         const CSIBCVectorwd& in_pnt2 );
00510 
00511 
00521         CSIBCVectorwd& LinearPositionInterpolate (  const CSIBCVectorwd& in_vct1,
00522                                                     const CSIBCVectorwd& in_vct2, 
00523                                                     const double in_dT );
00524 
00525         
00527         // To be implemented later //
00529         
00530 
00531 
00532         // SetOrthogonal    | Given v1 and v2, compute the vector that
00533         //                    is orthogonal to v1, and that is in the same
00534         //                    plane as v1 and v2.
00536         bool SetOrthogonal ( const CSIBCVectorwd& in_vct1,
00537                              const CSIBCVectorwd& in_vct2 );
00538         
00539         // SetOrthoProj     | Same as SetOrthogonal, but the resulting
00540         //                    vector is the projection of v2.
00542         bool SetOrthoProj  ( const CSIBCVectorwd& in_vct1,
00543                              const CSIBCVectorwd& in_vct2 );
00544 
00545         // AreOrthogonal    | Verify if two vectors are orthogonal.
00547         friend bool AreOrthogonal ( const CSIBCVectorwd& in_vct1,
00548                                     const CSIBCVectorwd& in_vct2,
00549                                     const double in_dEpsilon = PICO_EPS );
00550 
00551         // SetProjection    | Project this vector onto another vector.
00553         CSIBCVectorwd& SetProjection ( const CSIBCVectorwd& in_vct );
00554 
00555         // SetMirror        | Compute this=2*v2 - v1.                    
00557         CSIBCVectorwd& SetMirror(   const CSIBCVectorwd& in_vct1,
00558                                     const CSIBCVectorwd& in_vct2 );
00559 
00561         CSIBCVectorwd& BsplinePositionInterpolate ( const CSIBCVectorwd& in_vct1,
00562                                             const CSIBCVectorwd& in_vct2, 
00563                                             const CSIBCVectorwd& in_vct3, 
00564                                             const CSIBCVectorwd& in_vct4, 
00565                                             const double in_dT );
00566 
00567 
00568         // Combine          | Compute this=s1*v1 + s2*v2.
00570          CSIBCVectorwd& Combine(    const CSIBCVectorwd& in_vct1, const double in_dS1,
00571                                     const CSIBCVectorwd& in_vct2, const double in_dS2 );
00572 
00573         // SetBounds        | Readjust boundaries (min and max) to contain a given point.
00575          void SetBounds     ( const CSIBCVectorwd& in_pnt,
00576                               CSIBCVectorwd& io_min,
00577                               CSIBCVectorwd& io_max );
00578 
00580          friend double GetVctAngle  (   const CSIBCVectorwd& in_vct1,
00581                                         const CSIBCVectorwd& in_vct2,
00582                                         const bool in_bIsSigned = false );
00583 
00584         // GetPntAngle  | Compute angle (signed or not) between three points.
00586         friend double GetPntAngle(  const CSIBCVectorwd& in_pnt1,
00587                                     const CSIBCVectorwd& in_pnt2,
00588                                     const CSIBCVectorwd& in_pnt3,
00589                                     const bool in_bIsSigned = false );
00590 
00591         // GetVctCosAngle   | Compute cosinus of angle between two vectors.
00593           friend double GetVctCosAngle( const CSIBCVectorwd& in_vct1,
00594                                         const CSIBCVectorwd& in_vct2 );
00595 
00596         // GetPntCosAngle   | Compute cosinus of angle between three points.
00598         friend double GetPntCosAngle(   const CSIBCVectorwd& in_pnt1,
00599                                         const CSIBCVectorwd& in_pnt2,
00600                                         const CSIBCVectorwd& in_pnt3 );
00601 
00602         // ArePntCollinear | Verify if three points are collinear.
00604         friend bool ArePntCollinear(    const CSIBCVectorwd& in_pnt1,
00605                                         const CSIBCVectorwd& in_pnt2,
00606                                         const CSIBCVectorwd& in_pnt3,
00607                                         const double in_dEpsilon = PICO_EPS );
00608 
00609         // AreVctCoplanar   | Verify if two vectors are coplanar.
00611         friend bool AreVctCoplanar (    const CSIBCVectorwd& in_vct1,
00612                                         const CSIBCVectorwd& in_vct2,
00613                                         const CSIBCVectorwd& in_vct3,
00614                                         const double in_dEpsilon = PICO_EPS );
00615 
00616         // ArePntCoplanar   | Verify if three points are coplanar.
00618         friend bool ArePntCoplanar( const CSIBCVectorwd& in_pnt1,
00619                                     const CSIBCVectorwd& in_pnt2,
00620                                     const CSIBCVectorwd& in_pnt3,
00621                                     const CSIBCVectorwd& in_pnt4,
00622                                     const double in_dEpsilon = PICO_EPS );
00623 
00624         // GetVctAngle      | Compute angle (signed or not) between two vectors.
00625 
00626         
00627     // Private Members
00628     private:
00629 
00630         //****************************************
00631         // ATTRIBUTES
00632         //****************************************
00633         // double | CSIBCVectorwd | m_dX | X component of the vector.
00634         // double | CSIBCVectorwd | m_dY | Y component of the vector.
00635         // double | CSIBCVectorwd | m_dZ | Z component of the vector.
00636         double  m_dX, m_dY, m_dZ, m_dW;
00637 
00638         //Disable copy constructor and operator =
00639         // CSIBCVectorwd      | The copy Constructor
00640         CSIBCVectorwd ( const CSIBCVectorwd& in_vct );
00641         // operator=                    | Assigment operator.
00642         CSIBCVectorwd& operator = ( const CSIBCVectorwd& in_vct );
00643 };
00644 
00645 //******************************************************************************
00646 //
00647 // Author : Michel Carigan
00648 // Date  : 08/15/96
00649 //
00650 // CSIBCVectorwd& | CSIBCVectorwd | SetMinimal | Sets each component to be at least
00651 //                                epsilon (in absolute).
00652 //
00653 // CSIBCVectorwd& SetMinimal( const double in_dEpsilon = PICO_EPS )
00654 //
00655 // double | in_dEpsilon | Specify the user minimal value. If not given, the default
00656 //                                        value will be <t PICO_EPS>
00657 //
00658 // A reference on this.
00659 //
00660 // This function works like the macro _SI_VCT_EPS in v3.51
00661 // That is, each component are set to eps only if they are less than epsilon.
00662 // In that case the sign is unchanged.
00663 // The w component is set to 1.0
00664 //
00665 //
00666 //******************************************************************************
00667 inline  CSIBCVectorwd&  
00668 CSIBCVectorwd::SetMinimal
00669     (
00670         const double in_dEpsilon /* = PICO_EPS */
00671     )
00672 {
00673     if( fabs(m_dX) < in_dEpsilon )
00674         m_dX = ( ( m_dX >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00675     if( fabs(m_dY) < in_dEpsilon )
00676         m_dY = ( ( m_dY >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00677     if( fabs(m_dZ) < in_dEpsilon )
00678         m_dZ = ( ( m_dZ >= 0 ) ? in_dEpsilon : -in_dEpsilon ) ;
00679     m_dW = 1;
00680     return *this;
00681 }
00682 
00683 
00684 #endif  // _VECTORW_H_