SIBCQuaterniond.h

00001 //***************************************************************************************
00002 //
00003 // File supervisor: Crosswalk team
00004 //
00005 // Copyright 2008 Autodesk, Inc.  All rights reserved.  
00006 // Use of this software is subject to the terms of the Autodesk license agreement 
00007 // provided at the time of installation or download, or which otherwise accompanies 
00008 // this software in either electronic or hard copy form.
00009 //
00010 //***************************************************************************************
00011 
00012 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00013 #pragma once
00014 #endif
00015 
00016 //******************************************************************************
00017 // Defines
00018 //******************************************************************************
00019 #ifndef _QUATERNION_H_
00020 #define _QUATERNION_H_
00021 
00022 //******************************************************************************
00023 // Includes
00024 //******************************************************************************
00025 #include "SIBCMathLib.h"
00026 
00027 //******************************************************************************
00028 // Typedefs
00029 //******************************************************************************
00030 
00031 //******************************************************************************
00032 // CSIBCQuaterniond | Implementation of a quaternion q=W+Xi+Yj+Zk.
00033 //******************************************************************************
00034 
00036 
00045 class XSICOREEXPORT CSIBCQuaterniond
00046 {
00047     // Public members
00048     public:
00049         //****************************************
00050         // IMPLEMENTATION
00051         //****************************************
00052 
00057         CSIBCQuaterniond();
00058 
00066         CSIBCQuaterniond( const double in_dW, const double in_dX,
00067                const double in_dY, const double in_dZ );
00068 
00069 
00075         CSIBCQuaterniond( const CSIBCVector3Dd& in_vct );
00076 
00081         CSIBCQuaterniond( const CSIBCVector4Dd& in_vct );
00082 
00083         ~CSIBCQuaterniond();
00084 
00092         bool IsPure( double in_dEpsilon = PICO_EPS ) const;
00093 
00099         double GetLength() const;
00100 
00106         double GetSquaredLength() const;
00107 
00113         CSIBCQuaterniond& SetIdentity();
00114 
00121         bool IsIdentity();
00122 
00128         CSIBCQuaterniond& Normalize();
00129 
00138         double GetW() const;
00139 
00148         double GetX() const;
00149 
00158         double GetY() const;
00159 
00168         double GetZ() const;
00169 
00179         CSIBCQuaterniond& SetW( const double in_dW );
00180 
00190         CSIBCQuaterniond& SetX( const double in_dX );
00191 
00201         CSIBCQuaterniond& SetY( const double in_dY );
00202 
00212         CSIBCQuaterniond& SetZ( const double in_dZ );
00213 
00220         CSIBCVector4Dd& Get( CSIBCVector4Dd& out_vct ) const;
00221 
00230         void Get(   double& out_dW, double& out_dX,
00231                     double& out_dY, double& out_dZ ) const;
00232 
00242         CSIBCQuaterniond& Set( const double in_dW, const double in_dX,
00243                            const double in_dY, const double in_dZ );
00244 
00251         CSIBCQuaterniond& Set( const CSIBCVector4Dd& in_vct );
00252 
00260         CSIBCQuaterniond& Set( const CSIBCVector3Dd& in_vct );
00261 
00268         CSIBCQuaterniond& Set( const CSIBCQuaterniond& in_quat);
00269 
00281         friend bool AreAlmostEqual( const CSIBCQuaterniond& in_quat1,
00282                                     const CSIBCQuaterniond& in_quat2,
00283                                     const double in_dEpsilon = PICO_EPS );
00284 
00285 
00293         bool operator ==( const CSIBCQuaterniond& in_quat ) const;
00294 
00304         bool operator !=( const CSIBCQuaterniond& in_quat ) const;
00305 
00311         CSIBCQuaterniond& Negate();
00312 
00323         CSIBCQuaterniond& Invert( const CSIBCQuaterniond& in_quat );
00324 
00332         CSIBCQuaterniond& Invert();
00333 
00343         CSIBCQuaterniond& Conjugate( const CSIBCQuaterniond& in_quat );
00344 
00352         CSIBCQuaterniond& Conjugate();
00353 
00360         CSIBCQuaterniond& Add( const CSIBCQuaterniond& in_quat  );
00361 
00369         CSIBCQuaterniond& Add( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00370 
00377         CSIBCQuaterniond& Sub( const CSIBCQuaterniond& in_quat );
00378 
00386         CSIBCQuaterniond& Sub( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 ); 
00387 
00395         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00396 
00403         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat );
00404 
00414         CSIBCQuaterniond& Mul( const CSIBCVector3Dd& in_quatPure, const CSIBCQuaterniond& in_quat );
00415 
00425         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat, const CSIBCVector3Dd& in_quatPure );
00426 
00433         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat, const double in_dFactor );
00434 
00441         CSIBCQuaterniond& Mul( const double in_dFactor, const CSIBCQuaterniond& in_quat );
00442 
00448         CSIBCQuaterniond& Mul( const double in_dFactor );
00449 
00455         friend double GetDot( const CSIBCQuaterniond& in_quat1,
00456                                    const CSIBCQuaterniond& in_quat2 );
00457 
00470         CSIBCQuaterniond& Slerp( const CSIBCQuaterniond& in_quatStart,
00471                       const CSIBCQuaterniond& in_quatEnd,
00472                       const double in_dU );
00473 
00475         // To be implemented later... //
00477 
00478         // BisectSlerp     | Fast slerp for u=0.5
00480         CSIBCQuaterniond& BisectSlerp( const CSIBCQuaterniond& in_quatStart,
00481                             const CSIBCQuaterniond& in_quatEnd );
00482 
00483         // DoubleSlerp     | Fast slerp for u=2.0
00485         CSIBCQuaterniond& DoubleSlerp( const CSIBCQuaterniond& in_quatStart,
00486                             const CSIBCQuaterniond& in_quatEnd );
00487 
00488         // Ln              | Compute ln(q) (for a unit quaternion). Result is a pure quaternion.
00490         bool Ln( CSIBCQuaterniond& out_quat );
00491 
00492         // Exp             | Compute e^q (for a pure quaternion). Result is a unit quaternion.
00494         bool Exp( CSIBCQuaterniond& out_quat );
00495 
00496         // Squad           | Quadrangle interpolation of quaternions, using three spherical 
00497         //                   linear interpolations.
00499         CSIBCQuaterniond& Squad( const CSIBCQuaterniond& in_quatB0,
00500                       const CSIBCQuaterniond& in_quatS1,
00501                       const CSIBCQuaterniond& in_quatS2,
00502                       const CSIBCQuaterniond& in_quatB3,
00503                       const double in_dU,
00504                       const double in_dT );
00505 
00506     // Private members
00507     private:
00508 
00509         //****************************************
00510         // IMPLEMENTATION
00511         //****************************************
00512 
00513         //****************************************
00514         // ATTRIBUTES
00515         //****************************************
00516 
00517         // double | CSIBCQuaterniond | m_dW | W (scalar) component of the quaternion.
00518         // double | CSIBCQuaterniond | m_dX | X component of the quaternion.
00519         // double | CSIBCQuaterniond | m_dY | Y component of the quaternion.
00520         // double | CSIBCQuaterniond | m_dZ | Z component of the quaternion.
00521         double m_dW, m_dX, m_dY, m_dZ;
00522 
00523         // Disable copy constructor and operator =
00524         // CSIBCQuaterniond         | Copy constructor.
00525         CSIBCQuaterniond( const CSIBCQuaterniond& in_quat );
00526         // operator =               | Assignment operator.
00527         CSIBCQuaterniond& operator =( const CSIBCQuaterniond& in_quat );
00528 };
00529 
00530 #endif