Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TQuaternion.h
Go to the documentation of this file.
1 // @(#)root/physics:$Id$
2 // Author: Eric Anciant 28/06/2005
3 
4 #ifndef ROOT_TQuaternion
5 #define ROOT_TQuaternion
6 
7 #include "TVector3.h"
8 #include "TMath.h"
9 
10 
11 class TQuaternion : public TObject {
12 
13 public:
14 
15  TQuaternion(Double_t real = 0, Double_t X = 0, Double_t Y = 0, Double_t Z = 0);
16  TQuaternion(const TVector3 & vector, Double_t real = 0);
17  TQuaternion(const Double_t *);
18  TQuaternion(const Float_t *);
19  // Constructors from an array : 0 to 2 = vector part, 3 = real part
20 
21  TQuaternion(const TQuaternion &);
22  // The copy constructor.
23 
24  virtual ~TQuaternion();
25  // Destructor
26 
27  Double_t operator () (int) const;
28  inline Double_t operator [] (int) const;
29  // Get components by index. 0 to 2 = vector part, 3 = real part
30 
31  Double_t & operator () (int);
32  inline Double_t & operator [] (int);
33  // Set components by index. 0 to 2 = vector part, 3 = real part
34 
35  inline TQuaternion& SetRXYZ(Double_t r,Double_t x,Double_t y,Double_t z);
36  inline TQuaternion& SetRV(Double_t r, TVector3& vect);
37  // Sets components
38  TQuaternion& SetAxisQAngle(TVector3& v,Double_t QAngle);
39  // Set from vector direction and quaternion angle
40  Double_t GetQAngle() const;
41  TQuaternion& SetQAngle(Double_t angle);
42  // set and get quaternion angle
43 
44  inline void GetRXYZ(Double_t *carray) const;
45  inline void GetRXYZ(Float_t *carray) const;
46  // Get the components into an array : 0 to 2 vector part, 3 real part
47  // not checked!
48 
49  // --------------- real to quaternion algebra
50  inline TQuaternion& operator=(Double_t r);
51  inline Bool_t operator == (Double_t r) const;
52  inline Bool_t operator != (Double_t r) const;
53  inline TQuaternion& operator+=(Double_t real);
54  inline TQuaternion& operator-=(Double_t real);
55  inline TQuaternion& operator*=(Double_t real);
56  inline TQuaternion& operator/=(Double_t real);
57  TQuaternion operator*(Double_t real) const;
58  TQuaternion operator+(Double_t real) const;
59  TQuaternion operator-(Double_t real) const;
60  TQuaternion operator/(Double_t real) const;
61 
62  // ---------------- vector to quaternion algebra
63  inline TQuaternion& operator=(const TVector3& );
64  inline Bool_t operator == (const TVector3&) const;
65  inline Bool_t operator != (const TVector3&) const;
66  inline TQuaternion& operator+=(const TVector3 &vector);
67  inline TQuaternion& operator-=(const TVector3 &vector);
68  TQuaternion& MultiplyLeft(const TVector3 &vector);
69  TQuaternion& operator*=(const TVector3 &vector);
70  TQuaternion& DivideLeft(const TVector3 &vector);
71  TQuaternion& operator/=(const TVector3 &vector);
72  TQuaternion operator+(const TVector3 &vector) const;
73  TQuaternion operator-(const TVector3 &vector) const;
74  TQuaternion LeftProduct(const TVector3 &vector) const;
75  TQuaternion operator*(const TVector3 &vector) const;
76  TQuaternion LeftQuotient(const TVector3 &vector) const;
77  TQuaternion operator/(const TVector3 &vector) const;
78 
79  // ----------------- quaternion algebra
80  inline TQuaternion& operator=(const TQuaternion& );
81  inline Bool_t operator == (const TQuaternion&) const;
82  inline Bool_t operator != (const TQuaternion&) const;
83  inline TQuaternion& operator+=(const TQuaternion &quaternion);
84  inline TQuaternion& operator-=(const TQuaternion &quaternion);
85  TQuaternion& MultiplyLeft(const TQuaternion &quaternion);
86  TQuaternion& operator*=(const TQuaternion &quaternion);
87  TQuaternion& DivideLeft(const TQuaternion &quaternion);
88  TQuaternion& operator/=(const TQuaternion &quaternion);
89  TQuaternion operator+(const TQuaternion &quaternion) const;
90  TQuaternion operator-(const TQuaternion &quaternion) const;
91  TQuaternion LeftProduct(const TQuaternion &quaternion) const;
92  TQuaternion operator*(const TQuaternion &quaternion) const;
93  TQuaternion LeftQuotient(const TQuaternion &quaternion) const;
94  TQuaternion operator/(const TQuaternion &quaternion) const;
95 
96  // ------------------ general algebra
97  inline Double_t Norm() const; // quaternion magnitude
98  inline Double_t Norm2() const; // quaternion squared magnitude
99  Double_t QMag() const { return Norm(); } // quaternion magnitude
100  Double_t QMag2() const { return Norm2(); } // quaternion squared magnitude
101  inline TQuaternion& Normalize(); // normalize quaternion
102  inline TQuaternion operator - () const; // Unary minus.
103  inline TQuaternion Conjugate() const;
104  TQuaternion Invert() const;
105  void Rotate(TVector3& vect) const;
106  TVector3 Rotation(const TVector3& vect) const;
107 
108  void Print(Option_t* option="") const;
109 
110  Double_t fRealPart; // Real part
111  TVector3 fVectorPart; // vector part
112 
113  ClassDef(TQuaternion,1) // a quaternion class
114 };
115 
116 
117 // getters / setters
118 
119 inline TQuaternion& TQuaternion::SetRXYZ(Double_t r,Double_t x,Double_t y,Double_t z) {
120  fRealPart = r;
121  fVectorPart.SetXYZ(x,y,z);
122  return (*this);
123 }
124 
125 inline TQuaternion& TQuaternion::SetRV(Double_t r, TVector3& vect) {
126  fRealPart = r;
127  fVectorPart= vect;
128  return (*this);
129 }
130 
131 inline void TQuaternion::GetRXYZ(Double_t *carray) const {
132  fVectorPart.GetXYZ(carray+1);
133  carray[0] = fRealPart;
134 }
135 
136 inline void TQuaternion::GetRXYZ(Float_t *carray) const {
137  fVectorPart.GetXYZ(carray+1);
138  carray[0] = (Float_t) fRealPart;
139 }
140 
141 inline Double_t & TQuaternion::operator[] (int i) { return operator()(i); }
142 inline Double_t TQuaternion::operator[] (int i) const { return operator()(i); }
143 
144 // ------------------ real to quaternion algebra
145 
146 inline Bool_t TQuaternion::operator == (Double_t r) const {
147  return (fVectorPart.Mag2()==0 && fRealPart == r) ? kTRUE : kFALSE;
148 }
149 
150 inline Bool_t TQuaternion::operator != (Double_t r) const {
151  return (fVectorPart.Mag2()!=0 || fRealPart != r) ? kTRUE : kFALSE;
152 }
153 
154 inline TQuaternion& TQuaternion::operator=(Double_t r) {
155  fRealPart = r;
156  fVectorPart.SetXYZ(0,0,0);
157  return (*this);
158 }
159 
160 inline TQuaternion& TQuaternion::operator+=(Double_t real) {
161  fRealPart += real;
162  return (*this);
163 }
164 
165 inline TQuaternion& TQuaternion::operator-=(Double_t real) {
166  fRealPart -= real;
167  return (*this);
168 }
169 
170 inline TQuaternion& TQuaternion::operator*=(Double_t real) {
171  fRealPart *= real;
172  fVectorPart *= real;
173  return (*this);
174 }
175 
176 inline TQuaternion& TQuaternion::operator/=(Double_t real) {
177  if (real!=0) {
178  fRealPart /= real;
179  fVectorPart.SetX(fVectorPart.x()/real); // keep numericaly compliant with operator/(Double_t)
180  fVectorPart.SetY(fVectorPart.y()/real);
181  fVectorPart.SetZ(fVectorPart.z()/real);
182  } else {
183  Error("operator/=()(Double_t)", "bad value (%f) ignored",real);
184  }
185  return (*this);
186 }
187 
188 TQuaternion operator + (Double_t r, const TQuaternion & q);
189 TQuaternion operator - (Double_t r, const TQuaternion & q);
190 TQuaternion operator * (Double_t r, const TQuaternion & q);
191 TQuaternion operator / (Double_t r, const TQuaternion & q);
192 
193 // ------------------- vector to quaternion algebra
194 
195 inline Bool_t TQuaternion::operator == (const TVector3& V) const {
196  return (fVectorPart == V && fRealPart == 0) ? kTRUE : kFALSE;
197 }
198 
199 inline Bool_t TQuaternion::operator != (const TVector3& V) const {
200  return (fVectorPart != V || fRealPart != 0) ? kTRUE : kFALSE;
201 }
202 
203 inline TQuaternion& TQuaternion::operator=(const TVector3& vect) {
204  fRealPart = 0;
205  fVectorPart.SetXYZ(vect.X(),vect.Y(),vect.Z());
206  return *this;
207 }
208 
209 inline TQuaternion& TQuaternion::operator+=(const TVector3 &vect) {
210  fVectorPart += vect;
211  return (*this);
212 }
213 
214 inline TQuaternion& TQuaternion::operator-=(const TVector3 &vect) {
215  fVectorPart -= vect;
216  return (*this);
217 }
218 
219 TQuaternion operator + (const TVector3 &V, const TQuaternion &Q);
220 TQuaternion operator - (const TVector3 &V, const TQuaternion &Q);
221 TQuaternion operator * (const TVector3 &V, const TQuaternion &Q);
222 TQuaternion operator / (const TVector3 &V, const TQuaternion &Q);
223 
224 // --------------- quaternion algebra
225 
226 inline Bool_t TQuaternion::operator == (const TQuaternion& Q) const {
227  return (fVectorPart == Q.fVectorPart && fRealPart == Q.fRealPart) ? kTRUE : kFALSE;
228 }
229 
230 inline Bool_t TQuaternion::operator != (const TQuaternion& Q) const {
231  return (fVectorPart != Q.fVectorPart || fRealPart != Q.fRealPart) ? kTRUE : kFALSE;
232 }
233 
234 inline TQuaternion& TQuaternion::operator=(const TQuaternion& quat) {
235  if (&quat != this) {
236  fRealPart = quat.fRealPart;
237  fVectorPart.SetXYZ(quat.fVectorPart.X(),quat.fVectorPart.Y(),quat.fVectorPart.Z());
238  }
239  return (*this);
240 }
241 
242 inline TQuaternion& TQuaternion::operator+=(const TQuaternion &quaternion) {
243  fVectorPart += quaternion.fVectorPart;
244  fRealPart += quaternion.fRealPart;
245  return (*this);
246 }
247 
248 inline TQuaternion& TQuaternion::operator-=(const TQuaternion &quaternion) {
249  fVectorPart -= quaternion.fVectorPart;
250  fRealPart -= quaternion.fRealPart;
251  return (*this);
252 }
253 
254 inline TQuaternion TQuaternion::operator+(const TQuaternion &quaternion) const {
255 
256  return TQuaternion(fVectorPart+quaternion.fVectorPart, fRealPart+quaternion.fRealPart);
257 }
258 
259 inline TQuaternion TQuaternion::operator-(const TQuaternion &quaternion) const {
260 
261  return TQuaternion(fVectorPart-quaternion.fVectorPart, fRealPart-quaternion.fRealPart);
262 }
263 
264 // ---------------- general
265 inline Double_t TQuaternion::Norm() const {
266  return TMath::Sqrt(Norm2());
267 }
268 
269 inline Double_t TQuaternion::Norm2() const {
270  return fRealPart*fRealPart + fVectorPart.Mag2();
271 }
272 
273 inline TQuaternion& TQuaternion::Normalize() {
274 
275  (*this) /= Norm();
276  return (*this);
277 }
278 
279 inline TQuaternion TQuaternion::operator - () const {
280  return TQuaternion(-fVectorPart,-fRealPart);
281 }
282 
283 inline TQuaternion TQuaternion::Conjugate() const {
284  return TQuaternion(-fVectorPart,fRealPart);
285 }
286 
287 #endif
288