SIBCQuaterniond.h

Go to the documentation of this file.
00001 //***************************************************************************************
00002 // File supervisor: Crosswalk team
00012 //***************************************************************************************
00013 
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017 
00018 //******************************************************************************
00019 // Defines
00020 //******************************************************************************
00021 #ifndef _QUATERNION_H_
00022 #define _QUATERNION_H_
00023 
00024 //******************************************************************************
00025 // Includes
00026 //******************************************************************************
00027 #include "SIBCMathLib.h"
00028 
00029 //******************************************************************************
00030 // Typedefs
00031 //******************************************************************************
00032 
00033 //******************************************************************************
00034 // CSIBCQuaterniond | Implementation of a quaternion q=W+Xi+Yj+Zk.
00035 //******************************************************************************
00036 
00048 class XSICOREEXPORT CSIBCQuaterniond
00049 {
00050     // Public members
00051     public:
00052         //****************************************
00053         // IMPLEMENTATION
00054         //****************************************
00055 
00060         CSIBCQuaterniond();
00061 
00069         CSIBCQuaterniond( const double in_dW, const double in_dX,
00070                const double in_dY, const double in_dZ );
00071 
00072 
00078         CSIBCQuaterniond( const CSIBCVector3Dd& in_vct );
00079 
00084         CSIBCQuaterniond( const CSIBCVector4Dd& in_vct );
00085 
00086         ~CSIBCQuaterniond();
00087 
00096         bool IsPure( double in_dEpsilon = PICO_EPS ) const;
00097 
00103         double GetLength() const;
00104 
00110         double GetSquaredLength() const;
00111 
00117         CSIBCQuaterniond& SetIdentity();
00118 
00126         bool IsIdentity();
00127 
00133         CSIBCQuaterniond& Normalize();
00134 
00143         double GetW() const;
00144 
00153         double GetX() const;
00154 
00163         double GetY() const;
00164 
00173         double GetZ() const;
00174 
00184         CSIBCQuaterniond& SetW( const double in_dW );
00185 
00195         CSIBCQuaterniond& SetX( const double in_dX );
00196 
00206         CSIBCQuaterniond& SetY( const double in_dY );
00207 
00217         CSIBCQuaterniond& SetZ( const double in_dZ );
00218 
00225         CSIBCVector4Dd& Get( CSIBCVector4Dd& out_vct ) const;
00226 
00235         void Get(   double& out_dW, double& out_dX,
00236                     double& out_dY, double& out_dZ ) const;
00237 
00247         CSIBCQuaterniond& Set( const double in_dW, const double in_dX,
00248                            const double in_dY, const double in_dZ );
00249 
00256         CSIBCQuaterniond& Set( const CSIBCVector4Dd& in_vct );
00257 
00265         CSIBCQuaterniond& Set( const CSIBCVector3Dd& in_vct );
00266 
00273         CSIBCQuaterniond& Set( const CSIBCQuaterniond& in_quat);
00274 
00287         friend bool AreAlmostEqual( const CSIBCQuaterniond& in_quat1,
00288                                     const CSIBCQuaterniond& in_quat2,
00289                                     const double in_dEpsilon = PICO_EPS );
00290 
00291 
00300         bool operator ==( const CSIBCQuaterniond& in_quat ) const;
00301 
00312         bool operator !=( const CSIBCQuaterniond& in_quat ) const;
00313 
00319         CSIBCQuaterniond& Negate();
00320 
00331         CSIBCQuaterniond& Invert( const CSIBCQuaterniond& in_quat );
00332 
00340         CSIBCQuaterniond& Invert();
00341 
00351         CSIBCQuaterniond& Conjugate( const CSIBCQuaterniond& in_quat );
00352 
00360         CSIBCQuaterniond& Conjugate();
00361 
00368         CSIBCQuaterniond& Add( const CSIBCQuaterniond& in_quat  );
00369 
00377         CSIBCQuaterniond& Add( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00378 
00385         CSIBCQuaterniond& Sub( const CSIBCQuaterniond& in_quat );
00386 
00394         CSIBCQuaterniond& Sub( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00395 
00403         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat1, const CSIBCQuaterniond& in_quat2 );
00404 
00411         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat );
00412 
00422         CSIBCQuaterniond& Mul( const CSIBCVector3Dd& in_quatPure, const CSIBCQuaterniond& in_quat );
00423 
00433         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat, const CSIBCVector3Dd& in_quatPure );
00434 
00441         CSIBCQuaterniond& Mul( const CSIBCQuaterniond& in_quat, const double in_dFactor );
00442 
00449         CSIBCQuaterniond& Mul( const double in_dFactor, const CSIBCQuaterniond& in_quat );
00450 
00456         CSIBCQuaterniond& Mul( const double in_dFactor );
00457 
00463         friend double GetDot( const CSIBCQuaterniond& in_quat1,
00464                                    const CSIBCQuaterniond& in_quat2 );
00465 
00478         CSIBCQuaterniond& Slerp( const CSIBCQuaterniond& in_quatStart,
00479                       const CSIBCQuaterniond& in_quatEnd,
00480                       const double in_dU );
00481 
00483         // To be implemented later... //
00485 
00486         // BisectSlerp     | Fast slerp for u=0.5
00488         CSIBCQuaterniond& BisectSlerp( const CSIBCQuaterniond& in_quatStart,
00489                             const CSIBCQuaterniond& in_quatEnd );
00490 
00491         // DoubleSlerp     | Fast slerp for u=2.0
00493         CSIBCQuaterniond& DoubleSlerp( const CSIBCQuaterniond& in_quatStart,
00494                             const CSIBCQuaterniond& in_quatEnd );
00495 
00496         // Ln              | Compute ln(q) (for a unit quaternion). Result is a pure quaternion.
00498         bool Ln( CSIBCQuaterniond& out_quat );
00499 
00500         // Exp             | Compute e^q (for a pure quaternion). Result is a unit quaternion.
00502         bool Exp( CSIBCQuaterniond& out_quat );
00503 
00504         // Squad           | Quadrangle interpolation of quaternions, using three spherical
00505         //                   linear interpolations.
00507         CSIBCQuaterniond& Squad( const CSIBCQuaterniond& in_quatB0,
00508                       const CSIBCQuaterniond& in_quatS1,
00509                       const CSIBCQuaterniond& in_quatS2,
00510                       const CSIBCQuaterniond& in_quatB3,
00511                       const double in_dU,
00512                       const double in_dT );
00513 
00514     // Private members
00515     private:
00516 
00517         //****************************************
00518         // IMPLEMENTATION
00519         //****************************************
00520 
00521         //****************************************
00522         // ATTRIBUTES
00523         //****************************************
00524 
00525         // double | CSIBCQuaterniond | m_dW | W (scalar) component of the quaternion.
00526         // double | CSIBCQuaterniond | m_dX | X component of the quaternion.
00527         // double | CSIBCQuaterniond | m_dY | Y component of the quaternion.
00528         // double | CSIBCQuaterniond | m_dZ | Z component of the quaternion.
00529         double m_dW, m_dX, m_dY, m_dZ;
00530 
00531         // Disable copy constructor and operator =
00532         // CSIBCQuaterniond         | Copy constructor.
00533         CSIBCQuaterniond( const CSIBCQuaterniond& in_quat );
00534         // operator =               | Assignment operator.
00535         CSIBCQuaterniond& operator =( const CSIBCQuaterniond& in_quat );
00536 };
00537 
00538 #endif