Logo ROOT   6.13/01
Reference Guide
List of all members | Public Member Functions | Public Attributes | List of all members
TQuaternion Class Reference

Quaternion is a 4-component mathematic object quite convenient when dealing with space rotation (or reference frame transformation).

In short, think of quaternion Q as a 3-vector augmented by a real number. \( Q = Q|_r + Q|_V \)

Quaternion multiplication :

Quaternion multiplication is given by :

\[ Q.Q' = (Q|_r + Q|_V )*( Q'|_r + Q'|_V) = [ Q|_r*Q'|_r - Q|_V*Q'|_V ] + [ Q|_r*Q'|_V + Q'|_r*Q|_V + Q|_V X Q'|_V ] \]

where :

Thus, quaternion product is a generalization of real number product and product of a vector by a real number. Product of two pure vectors gives a quaternion whose real part is the opposite of scalar product and the vector part the cross product.

The conjugate of a quaternion \( Q = Q|r + Q|V \) is \( \bar{Q} = Q|r - Q|V \)

The magnitude of a quaternion \( Q \) is given by \( |Q|^2 = Q.\bar{Q} = \bar{Q}.Q = Q^2|r + |Q|V|^2 \)

Therefore, the inverse of a quaternion is \( Q-1 = \bar{Q} /|Q|^2 \)

"unit" quaternion is a quaternion of magnitude 1 : \( |Q|^2 = 1. \) Unit quaternions are a subset of the quaternions set.

Quaternion and rotations :

A rotation of angle \( f \) around a given axis, is represented by a unit quaternion Q :

In other words : \( Q = Q|_r + Q|_V = cos(\frac{f}{2}) + sin(\frac{f}{2}) \). (where u is a unit vector // to the rotation axis, \( cos(\frac{f}{2}) \) is the real part, \( sin(\frac{f}{2}) \) .u is the vector part) Note : The quaternion of identity is \( Q_I = cos(0) + sin(0)*(AnyVector) = 1\) .

The composition of two rotations is described by the product of the two corresponding quaternions. As for 3-space rotations, quaternion multiplication is not commutative !

\( Q = Q_1.Q_2 \) represents the composition of the successive rotation R1 and R2 expressed in the current frame (the axis of rotation hold by \( Q_2 \) is expressed in the frame as it is after R1 rotation). \( Q = Q_2.Q_1 \) represents the composition of the successive rotation R1 and R2 expressed in the initial reference frame.

The inverse of a rotation is a rotation about the same axis but of opposite angle, thus if Q is a unit quaternion, \( Q = cos(\frac{f}{2}) + sin(\frac{f}{2}).u = Q|_r + Q|_V\) , then : \( Q^{-1} =cos(-\frac{f}{2}) + sin(-\frac{f}{2}).u = cos(\frac{f}{2}) - sin(\frac{f}{2}).u = Q|_r -Q|_V \) is its inverse quaternion.

One verifies that : \( Q.Q^{-1} = Q^{-1}.Q = Q|_r*Q|_r + Q|_V*Q|_V + Q|_r*Q|_V -Q|_r*Q|_V + Q|_VXQ|_V = Q\leq|_r + Q\leq|_V = 1 \)

The rotation of a vector V by the rotation described by a unit quaternion Q is obtained by the following operation : \( V' = Q*V*Q^{-1} \), considering V as a quaternion whose real part is null.

Numeric computation considerations :

Numerically, the quaternion multiplication involves 12 additions and 16 multiplications. It is therefore faster than 3x3 matrixes multiplication involving 18 additions and 27 multiplications.

On the contrary, rotation of a vector by the above formula ( \( Q*V*Q^{-1} \) ) involves 18 additions and 24 multiplications, whereas multiplication of a 3-vector by a 3x3 matrix involves only 6 additions and 9 multiplications.

When dealing with numerous composition of space rotation, it is therefore faster to use quaternion product. On the other hand if a huge set of vectors must be rotated by a given quaternion, it is more optimized to convert the quaternion into a rotation matrix once, and then use that later to rotate the set of vectors.

More information :

http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

http://en.wikipedia.org/wiki/Quaternion

This Class represents all quaternions (unit or non-unit) It possesses a Normalize() method to make a given quaternion unit The Rotate(TVector3&) and Rotation(TVector3&) methods can be used even for a non-unit quaternion, in that case, the proper normalization is applied to perform the rotation.

A TRotation constructor exists than takes a quaternion for parameter (even non-unit), in that cas the proper normalisation is applied.

Definition at line 11 of file TQuaternion.h.

Public Member Functions

 TQuaternion (Double_t real=0, Double_t X=0, Double_t Y=0, Double_t Z=0)
 
 TQuaternion (const TVector3 &vector, Double_t real=0)
 
 TQuaternion (const Double_t *)
 
 TQuaternion (const Float_t *)
 
 TQuaternion (const TQuaternion &)
 
virtual ~TQuaternion ()
 
TQuaternion Conjugate () const
 
TQuaternionDivideLeft (const TVector3 &vector)
 left division More...
 
TQuaternionDivideLeft (const TQuaternion &quaternion)
 left division More...
 
Double_t GetQAngle () const
 Get angle of quaternion (rad) N.B : this angle is half of the corresponding rotation angle. More...
 
void GetRXYZ (Double_t *carray) const
 
void GetRXYZ (Float_t *carray) const
 
TQuaternion Invert () const
 invert More...
 
TQuaternion LeftProduct (const TVector3 &vector) const
 left product More...
 
TQuaternion LeftProduct (const TQuaternion &quaternion) const
 left product More...
 
TQuaternion LeftQuotient (const TVector3 &vector) const
 left quotient More...
 
TQuaternion LeftQuotient (const TQuaternion &quaternion) const
 left quotient More...
 
TQuaternionMultiplyLeft (const TVector3 &vector)
 left multiplication More...
 
TQuaternionMultiplyLeft (const TQuaternion &quaternion)
 left multiplication More...
 
Double_t Norm () const
 
Double_t Norm2 () const
 
TQuaternionNormalize ()
 
Bool_t operator!= (Double_t r) const
 
Bool_t operator!= (const TVector3 &) const
 
Bool_t operator!= (const TQuaternion &) const
 
Double_t operator() (int) const
 dereferencing operator const More...
 
Double_t & operator() (int)
 dereferencing operator More...
 
TQuaternion operator* (Double_t real) const
 product of quaternion with a real More...
 
TQuaternion operator* (const TVector3 &vector) const
 right product More...
 
TQuaternion operator* (const TQuaternion &quaternion) const
 right product More...
 
TQuaternionoperator*= (Double_t real)
 
TQuaternionoperator*= (const TVector3 &vector)
 right multiplication More...
 
TQuaternionoperator*= (const TQuaternion &quaternion)
 right multiplication More...
 
TQuaternion operator+ (Double_t real) const
 sum of quaternion with a real More...
 
TQuaternion operator+ (const TVector3 &vector) const
 sum of quaternion with a real More...
 
TQuaternion operator+ (const TQuaternion &quaternion) const
 
TQuaternionoperator+= (Double_t real)
 
TQuaternionoperator+= (const TVector3 &vector)
 
TQuaternionoperator+= (const TQuaternion &quaternion)
 
TQuaternion operator- (Double_t real) const
 substraction of real to quaternion More...
 
TQuaternion operator- (const TVector3 &vector) const
 substraction of real to quaternion More...
 
TQuaternion operator- (const TQuaternion &quaternion) const
 
TQuaternion operator- () const
 
TQuaternionoperator-= (Double_t real)
 
TQuaternionoperator-= (const TVector3 &vector)
 
TQuaternionoperator-= (const TQuaternion &quaternion)
 
TQuaternion operator/ (Double_t real) const
 division by a real More...
 
TQuaternion operator/ (const TVector3 &vector) const
 right quotient More...
 
TQuaternion operator/ (const TQuaternion &quaternion) const
 right quotient More...
 
TQuaternionoperator/= (Double_t real)
 
TQuaternionoperator/= (const TVector3 &vector)
 right division More...
 
TQuaternionoperator/= (const TQuaternion &quaternion)
 right division More...
 
TQuaternionoperator= (Double_t r)
 
TQuaternionoperator= (const TVector3 &)
 
TQuaternionoperator= (const TQuaternion &)
 
Bool_t operator== (Double_t r) const
 
Bool_t operator== (const TVector3 &) const
 
Bool_t operator== (const TQuaternion &) const
 
Double_t operator[] (int) const
 
Double_t & operator[] (int)
 
void Print (Option_t *option="") const
 Print Quaternion parameters. More...
 
Double_t QMag () const
 
Double_t QMag2 () const
 
void Rotate (TVector3 &vect) const
 rotate vect by current quaternion More...
 
TVector3 Rotation (const TVector3 &vect) const
 rotation of vect by current quaternion More...
 
TQuaternionSetAxisQAngle (TVector3 &v, Double_t QAngle)
 set quaternion from vector and angle (rad) quaternion is set as unitary N.B : this angle is half of the corresponding rotation angle More...
 
TQuaternionSetQAngle (Double_t angle)
 Set angle of quaternion (rad) - keep quaternion norm N.B : this angle is half of the corresponding rotation angle. More...
 
TQuaternionSetRV (Double_t r, TVector3 &vect)
 
TQuaternionSetRXYZ (Double_t r, Double_t x, Double_t y, Double_t z)
 

Public Attributes

Double_t fRealPart
 
TVector3 fVectorPart
 

#include <TQuaternion.h>

Inheritance diagram for TQuaternion:
[legend]

Constructor & Destructor Documentation

◆ TQuaternion() [1/5]

TQuaternion::TQuaternion ( Double_t  real = 0,
Double_t  X = 0,
Double_t  Y = 0,
Double_t  Z = 0 
)

Definition at line 113 of file TQuaternion.cxx.

◆ TQuaternion() [2/5]

TQuaternion::TQuaternion ( const TVector3 vector,
Double_t  real = 0 
)

Definition at line 104 of file TQuaternion.cxx.

◆ TQuaternion() [3/5]

TQuaternion::TQuaternion ( const Double_t *  x0)

Definition at line 107 of file TQuaternion.cxx.

◆ TQuaternion() [4/5]

TQuaternion::TQuaternion ( const Float_t *  x0)

Definition at line 110 of file TQuaternion.cxx.

◆ TQuaternion() [5/5]

TQuaternion::TQuaternion ( const TQuaternion q)

Definition at line 101 of file TQuaternion.cxx.

◆ ~TQuaternion()

TQuaternion::~TQuaternion ( )
virtual

Definition at line 116 of file TQuaternion.cxx.

Member Function Documentation

◆ Conjugate()

TQuaternion TQuaternion::Conjugate ( ) const
inline

Definition at line 283 of file TQuaternion.h.

◆ DivideLeft() [1/2]

TQuaternion & TQuaternion::DivideLeft ( const TVector3 vector)

left division

Definition at line 288 of file TQuaternion.cxx.

◆ DivideLeft() [2/2]

TQuaternion & TQuaternion::DivideLeft ( const TQuaternion quaternion)

left division

Definition at line 412 of file TQuaternion.cxx.

◆ GetQAngle()

Double_t TQuaternion::GetQAngle ( ) const

Get angle of quaternion (rad) N.B : this angle is half of the corresponding rotation angle.

Definition at line 155 of file TQuaternion.cxx.

◆ GetRXYZ() [1/2]

void TQuaternion::GetRXYZ ( Double_t *  carray) const
inline

Definition at line 131 of file TQuaternion.h.

◆ GetRXYZ() [2/2]

void TQuaternion::GetRXYZ ( Float_t *  carray) const
inline

Definition at line 136 of file TQuaternion.h.

◆ Invert()

TQuaternion TQuaternion::Invert ( ) const

invert

Definition at line 479 of file TQuaternion.cxx.

◆ LeftProduct() [1/2]

TQuaternion TQuaternion::LeftProduct ( const TVector3 vector) const

left product

Definition at line 274 of file TQuaternion.cxx.

◆ LeftProduct() [2/2]

TQuaternion TQuaternion::LeftProduct ( const TQuaternion quaternion) const

left product

Definition at line 394 of file TQuaternion.cxx.

◆ LeftQuotient() [1/2]

TQuaternion TQuaternion::LeftQuotient ( const TVector3 vector) const

left quotient

Definition at line 318 of file TQuaternion.cxx.

◆ LeftQuotient() [2/2]

TQuaternion TQuaternion::LeftQuotient ( const TQuaternion quaternion) const

left quotient

Definition at line 443 of file TQuaternion.cxx.

◆ MultiplyLeft() [1/2]

TQuaternion & TQuaternion::MultiplyLeft ( const TVector3 vector)

left multiplication

Definition at line 250 of file TQuaternion.cxx.

◆ MultiplyLeft() [2/2]

TQuaternion & TQuaternion::MultiplyLeft ( const TQuaternion quaternion)

left multiplication

Definition at line 378 of file TQuaternion.cxx.

◆ Norm()

Double_t TQuaternion::Norm ( ) const
inline

Definition at line 265 of file TQuaternion.h.

◆ Norm2()

Double_t TQuaternion::Norm2 ( ) const
inline

Definition at line 269 of file TQuaternion.h.

◆ Normalize()

TQuaternion & TQuaternion::Normalize ( )
inline

Definition at line 273 of file TQuaternion.h.

◆ operator!=() [1/3]

Bool_t TQuaternion::operator!= ( Double_t  r) const
inline

Definition at line 150 of file TQuaternion.h.

◆ operator!=() [2/3]

Bool_t TQuaternion::operator!= ( const TVector3 V) const
inline

Definition at line 199 of file TQuaternion.h.

◆ operator!=() [3/3]

Bool_t TQuaternion::operator!= ( const TQuaternion Q) const
inline

Definition at line 230 of file TQuaternion.h.

◆ operator()() [1/2]

Double_t TQuaternion::operator() ( int  i) const

dereferencing operator const

Definition at line 121 of file TQuaternion.cxx.

◆ operator()() [2/2]

Double_t & TQuaternion::operator() ( int  i)

dereferencing operator

Definition at line 138 of file TQuaternion.cxx.

◆ operator*() [1/3]

TQuaternion TQuaternion::operator* ( Double_t  real) const

product of quaternion with a real

Definition at line 208 of file TQuaternion.cxx.

◆ operator*() [2/3]

TQuaternion TQuaternion::operator* ( const TVector3 vector) const

right product

Definition at line 281 of file TQuaternion.cxx.

◆ operator*() [3/3]

TQuaternion TQuaternion::operator* ( const TQuaternion quaternion) const

right product

Definition at line 403 of file TQuaternion.cxx.

◆ operator*=() [1/3]

TQuaternion & TQuaternion::operator*= ( Double_t  real)
inline

Definition at line 170 of file TQuaternion.h.

◆ operator*=() [2/3]

TQuaternion & TQuaternion::operator*= ( const TVector3 vector)

right multiplication

Definition at line 262 of file TQuaternion.cxx.

◆ operator*=() [3/3]

TQuaternion & TQuaternion::operator*= ( const TQuaternion quaternion)

right multiplication

Definition at line 363 of file TQuaternion.cxx.

◆ operator+() [1/3]

TQuaternion TQuaternion::operator+ ( Double_t  real) const

sum of quaternion with a real

Definition at line 194 of file TQuaternion.cxx.

◆ operator+() [2/3]

TQuaternion TQuaternion::operator+ ( const TVector3 vector) const

sum of quaternion with a real

Definition at line 236 of file TQuaternion.cxx.

◆ operator+() [3/3]

TQuaternion TQuaternion::operator+ ( const TQuaternion quaternion) const
inline

Definition at line 254 of file TQuaternion.h.

◆ operator+=() [1/3]

TQuaternion & TQuaternion::operator+= ( Double_t  real)
inline

Definition at line 160 of file TQuaternion.h.

◆ operator+=() [2/3]

TQuaternion & TQuaternion::operator+= ( const TVector3 vector)
inline

Definition at line 209 of file TQuaternion.h.

◆ operator+=() [3/3]

TQuaternion & TQuaternion::operator+= ( const TQuaternion quaternion)
inline

Definition at line 242 of file TQuaternion.h.

◆ operator-() [1/4]

TQuaternion TQuaternion::operator- ( Double_t  real) const

substraction of real to quaternion

Definition at line 201 of file TQuaternion.cxx.

◆ operator-() [2/4]

TQuaternion TQuaternion::operator- ( const TVector3 vector) const

substraction of real to quaternion

Definition at line 243 of file TQuaternion.cxx.

◆ operator-() [3/4]

TQuaternion TQuaternion::operator- ( const TQuaternion quaternion) const
inline

Definition at line 259 of file TQuaternion.h.

◆ operator-() [4/4]

TQuaternion TQuaternion::operator- ( ) const
inline

Definition at line 279 of file TQuaternion.h.

◆ operator-=() [1/3]

TQuaternion & TQuaternion::operator-= ( Double_t  real)
inline

Definition at line 165 of file TQuaternion.h.

◆ operator-=() [2/3]

TQuaternion & TQuaternion::operator-= ( const TVector3 vector)
inline

Definition at line 214 of file TQuaternion.h.

◆ operator-=() [3/3]

TQuaternion & TQuaternion::operator-= ( const TQuaternion quaternion)
inline

Definition at line 248 of file TQuaternion.h.

◆ operator/() [1/3]

TQuaternion TQuaternion::operator/ ( Double_t  real) const

division by a real

Definition at line 216 of file TQuaternion.cxx.

◆ operator/() [2/3]

TQuaternion TQuaternion::operator/ ( const TVector3 vector) const

right quotient

Definition at line 334 of file TQuaternion.cxx.

◆ operator/() [3/3]

TQuaternion TQuaternion::operator/ ( const TQuaternion quaternion) const

right quotient

Definition at line 461 of file TQuaternion.cxx.

◆ operator/=() [1/3]

TQuaternion & TQuaternion::operator/= ( Double_t  real)
inline

Definition at line 176 of file TQuaternion.h.

◆ operator/=() [2/3]

TQuaternion & TQuaternion::operator/= ( const TVector3 vector)

right division

Definition at line 303 of file TQuaternion.cxx.

◆ operator/=() [3/3]

TQuaternion & TQuaternion::operator/= ( const TQuaternion quaternion)

right division

Definition at line 427 of file TQuaternion.cxx.

◆ operator=() [1/3]

TQuaternion & TQuaternion::operator= ( Double_t  r)
inline

Definition at line 154 of file TQuaternion.h.

◆ operator=() [2/3]

TQuaternion & TQuaternion::operator= ( const TVector3 vect)
inline

Definition at line 203 of file TQuaternion.h.

◆ operator=() [3/3]

TQuaternion & TQuaternion::operator= ( const TQuaternion quat)
inline

Definition at line 234 of file TQuaternion.h.

◆ operator==() [1/3]

Bool_t TQuaternion::operator== ( Double_t  r) const
inline

Definition at line 146 of file TQuaternion.h.

◆ operator==() [2/3]

Bool_t TQuaternion::operator== ( const TVector3 V) const
inline

Definition at line 195 of file TQuaternion.h.

◆ operator==() [3/3]

Bool_t TQuaternion::operator== ( const TQuaternion Q) const
inline

Definition at line 226 of file TQuaternion.h.

◆ operator[]() [1/2]

Double_t TQuaternion::operator[] ( int  i) const
inline

Definition at line 142 of file TQuaternion.h.

◆ operator[]() [2/2]

Double_t & TQuaternion::operator[] ( int  i)
inline

Definition at line 141 of file TQuaternion.h.

◆ Print()

void TQuaternion::Print ( Option_t *  option = "") const

Print Quaternion parameters.

Definition at line 527 of file TQuaternion.cxx.

◆ QMag()

Double_t TQuaternion::QMag ( ) const
inline

Definition at line 99 of file TQuaternion.h.

◆ QMag2()

Double_t TQuaternion::QMag2 ( ) const
inline

Definition at line 100 of file TQuaternion.h.

◆ Rotate()

void TQuaternion::Rotate ( TVector3 vect) const

rotate vect by current quaternion

Definition at line 493 of file TQuaternion.cxx.

◆ Rotation()

TVector3 TQuaternion::Rotation ( const TVector3 vect) const

rotation of vect by current quaternion

Definition at line 500 of file TQuaternion.cxx.

◆ SetAxisQAngle()

TQuaternion & TQuaternion::SetAxisQAngle ( TVector3 v,
Double_t  QAngle 
)

set quaternion from vector and angle (rad) quaternion is set as unitary N.B : this angle is half of the corresponding rotation angle

Definition at line 179 of file TQuaternion.cxx.

◆ SetQAngle()

TQuaternion & TQuaternion::SetQAngle ( Double_t  angle)

Set angle of quaternion (rad) - keep quaternion norm N.B : this angle is half of the corresponding rotation angle.

Definition at line 165 of file TQuaternion.cxx.

◆ SetRV()

TQuaternion & TQuaternion::SetRV ( Double_t  r,
TVector3 vect 
)
inline

Definition at line 125 of file TQuaternion.h.

◆ SetRXYZ()

TQuaternion & TQuaternion::SetRXYZ ( Double_t  r,
Double_t  x,
Double_t  y,
Double_t  z 
)
inline

Definition at line 119 of file TQuaternion.h.

Member Data Documentation

◆ fRealPart

Double_t TQuaternion::fRealPart

Definition at line 110 of file TQuaternion.h.

◆ fVectorPart

TVector3 TQuaternion::fVectorPart

Definition at line 111 of file TQuaternion.h.

Libraries for TQuaternion:
[legend]

The documentation for this class was generated from the following files: