00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00026 #pragma once
00027 #endif
00028
00029
00030
00031
00032 #ifndef _QUATERNION_H_
00033 #define _QUATERNION_H_
00034
00035
00036
00037
00038 #include "SIBCMathLib.h"
00039
00040
00041
00042
00043
00044
00045
00046
00047
00049
00058 class XSICOREEXPORT CSIBCQuaterniond
00059 {
00060
00061 public:
00062
00063
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
00490
00491
00493 CSIBCQuaterniond& BisectSlerp( const CSIBCQuaterniond& in_quatStart,
00494 const CSIBCQuaterniond& in_quatEnd );
00495
00496
00498 CSIBCQuaterniond& DoubleSlerp( const CSIBCQuaterniond& in_quatStart,
00499 const CSIBCQuaterniond& in_quatEnd );
00500
00501
00503 bool Ln( CSIBCQuaterniond& out_quat );
00504
00505
00507 bool Exp( CSIBCQuaterniond& out_quat );
00508
00509
00510
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
00520 private:
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534 double m_dW, m_dX, m_dY, m_dZ;
00535
00536
00537
00538 CSIBCQuaterniond( const CSIBCQuaterniond& in_quat );
00539
00540 CSIBCQuaterniond& operator =( const CSIBCQuaterniond& in_quat );
00541 };
00542
00543 #endif