00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00013 #pragma once
00014 #endif
00015
00016
00017
00018
00019 #ifndef _QUATERNION_H_
00020 #define _QUATERNION_H_
00021
00022
00023
00024
00025 #include "SIBCMathLib.h"
00026
00027
00028
00029
00030
00031
00032
00033
00034
00036
00045 class XSICOREEXPORT CSIBCQuaterniond
00046 {
00047
00048 public:
00049
00050
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
00477
00478
00480 CSIBCQuaterniond& BisectSlerp( const CSIBCQuaterniond& in_quatStart,
00481 const CSIBCQuaterniond& in_quatEnd );
00482
00483
00485 CSIBCQuaterniond& DoubleSlerp( const CSIBCQuaterniond& in_quatStart,
00486 const CSIBCQuaterniond& in_quatEnd );
00487
00488
00490 bool Ln( CSIBCQuaterniond& out_quat );
00491
00492
00494 bool Exp( CSIBCQuaterniond& out_quat );
00495
00496
00497
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
00507 private:
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521 double m_dW, m_dX, m_dY, m_dZ;
00522
00523
00524
00525 CSIBCQuaterniond( const CSIBCQuaterniond& in_quat );
00526
00527 CSIBCQuaterniond& operator =( const CSIBCQuaterniond& in_quat );
00528 };
00529
00530 #endif