SIBCQuaterniond.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 // SIBCQuaterniond.h | Main header file for CSIBCQuaterniond 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 #ifndef _QUATERNION_H_
00033 #define _QUATERNION_H_
00034 
00035 //******************************************************************************
00036 // Includes
00037 //******************************************************************************
00038 #include "SIBCMathLib.h"
00039 
00040 //******************************************************************************
00041 // Typedefs
00042 //******************************************************************************
00043 
00044 //******************************************************************************
00045 // CSIBCQuaterniond | Implementation of a quaternion q=W+Xi+Yj+Zk.
00046 //******************************************************************************
00047 
00049 
00058 class XSICOREEXPORT CSIBCQuaterniond
00059 {
00060     // Public members
00061     public:
00062         //****************************************
00063         // IMPLEMENTATION
00064         //****************************************
00065 
00070         CSIBCQuaterniond();
00071 
00079         CSIBCQuaterniond( const double in_dW, const double in_dX,
00080                const double in_dY, const double in_dZ );
00081 
00082 
00088         CSIBCQuaterniond( const CSIBCVector3Dd& in_vct );
00089 
00094         CSIBCQuaterniond( const CSIBCVector4Dd& in_vct );
00095 
00096         ~CSIBCQuaterniond();
00097 
00105         bool IsPure( double in_dEpsilon = PICO_EPS ) const;
00106 
00112         double GetLength() const;
00113 
00119         double GetSquaredLength() const;
00120 
00126         CSIBCQuaterniond& SetIdentity();
00127 
00134         bool IsIdentity();
00135 
00141         CSIBCQuaterniond& Normalize();
00142 
00151         double GetW() const;
00152 
00161         double GetX() const;
00162 
00171         double GetY() const;
00172 
00181         double GetZ() const;
00182 
00192         CSIBCQuaterniond& SetW( const double in_dW );
00193 
00203         CSIBCQuaterniond& SetX( const double in_dX );
00204 
00214         CSIBCQuaterniond& SetY( const double in_dY );
00215 
00225         CSIBCQuaterniond& SetZ( const double in_dZ );
00226 
00233         CSIBCVector4Dd& Get( CSIBCVector4Dd& out_vct ) const;
00234 
00243         void Get(   double& out_dW, double& out_dX,
00244                     double& out_dY, double& out_dZ ) const;
00245 
00255         CSIBCQuaterniond& Set( const double in_dW, const double in_dX,
00256                            const double in_dY, const double in_dZ );
00257 
00264         CSIBCQuaterniond& Set( const CSIBCVector4Dd& in_vct );
00265 
00273         CSIBCQuaterniond& Set( const CSIBCVector3Dd& in_vct );
00274 
00281         CSIBCQuaterniond& Set( const CSIBCQuaterniond& in_quat);
00282 
00294         friend bool AreAlmostEqual( const CSIBCQuaterniond& in_quat1,
00295                                     const CSIBCQuaterniond& in_quat2,
00296                                     const double in_dEpsilon = PICO_EPS );
00297 
00298 
00306         bool operator ==( const CSIBCQuaterniond& in_quat ) const;
00307 
00317         bool operator !=( const CSIBCQuaterniond& in_quat ) const;
00318 
00324         CSIBCQuaterniond& Negate();
00325 
00336         CSIBCQuaterniond& Invert( const CSIBCQuaterniond& in_quat );
00337 
00345         CSIBCQuaterniond& Invert();
00346 
00356         CSIBCQuaterniond& Conjugate( const CSIBCQuaterniond& in_quat );
00357 
00365         CSIBCQuaterniond& Conjugate();
00366 
00373         CSIBCQuaterniond& Add( const CSIBCQuaterniond& in_quat  );
00374 
00382         CSIBCQuaterniond& Add( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00383 
00390         CSIBCQuaterniond& Sub( const CSIBCQuaterniond& in_quat );
00391 
00399         CSIBCQuaterniond& Sub( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 ); 
00400 
00408         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00409 
00416         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat );
00417 
00427         CSIBCQuaterniond& Mul( const CSIBCVector3Dd& in_quatPure, const CSIBCQuaterniond& in_quat );
00428 
00438         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat, const CSIBCVector3Dd& in_quatPure );
00439 
00446         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat, const double in_dFactor );
00447 
00454         CSIBCQuaterniond& Mul( const double in_dFactor, const CSIBCQuaterniond& in_quat );
00455 
00461         CSIBCQuaterniond& Mul( const double in_dFactor );
00462 
00468         friend double GetDot( const CSIBCQuaterniond& in_quat1,
00469                                    const CSIBCQuaterniond& in_quat2 );
00470 
00483         CSIBCQuaterniond& Slerp( const CSIBCQuaterniond& in_quatStart,
00484                       const CSIBCQuaterniond& in_quatEnd,
00485                       const double in_dU );
00486 
00488         // To be implemented later... //
00490 
00491         // BisectSlerp     | Fast slerp for u=0.5
00493         CSIBCQuaterniond& BisectSlerp( const CSIBCQuaterniond& in_quatStart,
00494                             const CSIBCQuaterniond& in_quatEnd );
00495 
00496         // DoubleSlerp     | Fast slerp for u=2.0
00498         CSIBCQuaterniond& DoubleSlerp( const CSIBCQuaterniond& in_quatStart,
00499                             const CSIBCQuaterniond& in_quatEnd );
00500 
00501         // Ln              | Compute ln(q) (for a unit quaternion). Result is a pure quaternion.
00503         bool Ln( CSIBCQuaterniond& out_quat );
00504 
00505         // Exp             | Compute e^q (for a pure quaternion). Result is a unit quaternion.
00507         bool Exp( CSIBCQuaterniond& out_quat );
00508 
00509         // Squad           | Quadrangle interpolation of quaternions, using three spherical 
00510         //                   linear interpolations.
00512         CSIBCQuaterniond& Squad( const CSIBCQuaterniond& in_quatB0,
00513                       const CSIBCQuaterniond& in_quatS1,
00514                       const CSIBCQuaterniond& in_quatS2,
00515                       const CSIBCQuaterniond& in_quatB3,
00516                       const double in_dU,
00517                       const double in_dT );
00518 
00519     // Private members
00520     private:
00521 
00522         //****************************************
00523         // IMPLEMENTATION
00524         //****************************************
00525 
00526         //****************************************
00527         // ATTRIBUTES
00528         //****************************************
00529 
00530         // double | CSIBCQuaterniond | m_dW | W (scalar) component of the quaternion.
00531         // double | CSIBCQuaterniond | m_dX | X component of the quaternion.
00532         // double | CSIBCQuaterniond | m_dY | Y component of the quaternion.
00533         // double | CSIBCQuaterniond | m_dZ | Z component of the quaternion.
00534         double m_dW, m_dX, m_dY, m_dZ;
00535 
00536         // Disable copy constructor and operator =
00537         // CSIBCQuaterniond         | Copy constructor.
00538         CSIBCQuaterniond( const CSIBCQuaterniond& in_quat );
00539         // operator =               | Assignment operator.
00540         CSIBCQuaterniond& operator =( const CSIBCQuaterniond& in_quat );
00541 };
00542 
00543 #endif