# 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