00001
00002
00012
00013
00014 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00015 #pragma once
00016 #endif
00017
00018
00019
00020
00021 #ifndef _QUATERNION_H_
00022 #define _QUATERNION_H_
00023
00024
00025
00026
00027 #include "SIBCMathLib.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00048 class XSICOREEXPORT CSIBCQuaterniond
00049 {
00050
00051 public:
00052
00053
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
00485
00486
00488 CSIBCQuaterniond& BisectSlerp( const CSIBCQuaterniond& in_quatStart,
00489 const CSIBCQuaterniond& in_quatEnd );
00490
00491
00493 CSIBCQuaterniond& DoubleSlerp( const CSIBCQuaterniond& in_quatStart,
00494 const CSIBCQuaterniond& in_quatEnd );
00495
00496
00498 bool Ln( CSIBCQuaterniond& out_quat );
00499
00500
00502 bool Exp( CSIBCQuaterniond& out_quat );
00503
00504
00505
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
00515 private:
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529 double m_dW, m_dX, m_dY, m_dZ;
00530
00531
00532
00533 CSIBCQuaterniond( const CSIBCQuaterniond& in_quat );
00534
00535 CSIBCQuaterniond& operator =( const CSIBCQuaterniond& in_quat );
00536 };
00537
00538 #endif