4 #ifndef ROOT_TQuaternion
5 #define ROOT_TQuaternion
11 class TQuaternion :
public TObject {
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 *);
21 TQuaternion(
const TQuaternion &);
24 virtual ~TQuaternion();
27 Double_t operator () (
int)
const;
28 inline Double_t operator [] (
int)
const;
31 Double_t & operator () (
int);
32 inline Double_t & operator [] (
int);
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);
38 TQuaternion& SetAxisQAngle(TVector3& v,Double_t QAngle);
40 Double_t GetQAngle()
const;
41 TQuaternion& SetQAngle(Double_t angle);
44 inline void GetRXYZ(Double_t *carray)
const;
45 inline void GetRXYZ(Float_t *carray)
const;
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;
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;
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;
97 inline Double_t Norm()
const;
98 inline Double_t Norm2()
const;
99 Double_t QMag()
const {
return Norm(); }
100 Double_t QMag2()
const {
return Norm2(); }
101 inline TQuaternion& Normalize();
102 inline TQuaternion operator - ()
const;
103 inline TQuaternion Conjugate()
const;
104 TQuaternion Invert()
const;
105 void Rotate(TVector3& vect)
const;
106 TVector3 Rotation(
const TVector3& vect)
const;
108 void Print(Option_t* option=
"")
const;
111 TVector3 fVectorPart;
113 ClassDef(TQuaternion,1)
119 inline TQuaternion& TQuaternion::SetRXYZ(Double_t r,Double_t x,Double_t y,Double_t z) {
121 fVectorPart.SetXYZ(x,y,z);
125 inline TQuaternion& TQuaternion::SetRV(Double_t r, TVector3& vect) {
131 inline void TQuaternion::GetRXYZ(Double_t *carray)
const {
132 fVectorPart.GetXYZ(carray+1);
133 carray[0] = fRealPart;
136 inline void TQuaternion::GetRXYZ(Float_t *carray)
const {
137 fVectorPart.GetXYZ(carray+1);
138 carray[0] = (Float_t) fRealPart;
141 inline Double_t & TQuaternion::operator[] (
int i) {
return operator()(i); }
142 inline Double_t TQuaternion::operator[] (
int i)
const {
return operator()(i); }
146 inline Bool_t TQuaternion::operator == (Double_t r)
const {
147 return (fVectorPart.Mag2()==0 && fRealPart == r) ? kTRUE : kFALSE;
150 inline Bool_t TQuaternion::operator != (Double_t r)
const {
151 return (fVectorPart.Mag2()!=0 || fRealPart != r) ? kTRUE : kFALSE;
154 inline TQuaternion& TQuaternion::operator=(Double_t r) {
156 fVectorPart.SetXYZ(0,0,0);
160 inline TQuaternion& TQuaternion::operator+=(Double_t real) {
165 inline TQuaternion& TQuaternion::operator-=(Double_t real) {
170 inline TQuaternion& TQuaternion::operator*=(Double_t real) {
176 inline TQuaternion& TQuaternion::operator/=(Double_t real) {
179 fVectorPart.SetX(fVectorPart.x()/real);
180 fVectorPart.SetY(fVectorPart.y()/real);
181 fVectorPart.SetZ(fVectorPart.z()/real);
183 Error(
"operator/=()(Double_t)",
"bad value (%f) ignored",real);
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);
195 inline Bool_t TQuaternion::operator == (
const TVector3& V)
const {
196 return (fVectorPart == V && fRealPart == 0) ? kTRUE : kFALSE;
199 inline Bool_t TQuaternion::operator != (
const TVector3& V)
const {
200 return (fVectorPart != V || fRealPart != 0) ? kTRUE : kFALSE;
203 inline TQuaternion& TQuaternion::operator=(
const TVector3& vect) {
205 fVectorPart.SetXYZ(vect.X(),vect.Y(),vect.Z());
209 inline TQuaternion& TQuaternion::operator+=(
const TVector3 &vect) {
214 inline TQuaternion& TQuaternion::operator-=(
const TVector3 &vect) {
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);
226 inline Bool_t TQuaternion::operator == (
const TQuaternion& Q)
const {
227 return (fVectorPart == Q.fVectorPart && fRealPart == Q.fRealPart) ? kTRUE : kFALSE;
230 inline Bool_t TQuaternion::operator != (
const TQuaternion& Q)
const {
231 return (fVectorPart != Q.fVectorPart || fRealPart != Q.fRealPart) ? kTRUE : kFALSE;
234 inline TQuaternion& TQuaternion::operator=(
const TQuaternion& quat) {
236 fRealPart = quat.fRealPart;
237 fVectorPart.SetXYZ(quat.fVectorPart.X(),quat.fVectorPart.Y(),quat.fVectorPart.Z());
242 inline TQuaternion& TQuaternion::operator+=(
const TQuaternion &quaternion) {
243 fVectorPart += quaternion.fVectorPart;
244 fRealPart += quaternion.fRealPart;
248 inline TQuaternion& TQuaternion::operator-=(
const TQuaternion &quaternion) {
249 fVectorPart -= quaternion.fVectorPart;
250 fRealPart -= quaternion.fRealPart;
254 inline TQuaternion TQuaternion::operator+(
const TQuaternion &quaternion)
const {
256 return TQuaternion(fVectorPart+quaternion.fVectorPart, fRealPart+quaternion.fRealPart);
259 inline TQuaternion TQuaternion::operator-(
const TQuaternion &quaternion)
const {
261 return TQuaternion(fVectorPart-quaternion.fVectorPart, fRealPart-quaternion.fRealPart);
265 inline Double_t TQuaternion::Norm()
const {
266 return TMath::Sqrt(Norm2());
269 inline Double_t TQuaternion::Norm2()
const {
270 return fRealPart*fRealPart + fVectorPart.Mag2();
273 inline TQuaternion& TQuaternion::Normalize() {
279 inline TQuaternion TQuaternion::operator - ()
const {
280 return TQuaternion(-fVectorPart,-fRealPart);
283 inline TQuaternion TQuaternion::Conjugate()
const {
284 return TQuaternion(-fVectorPart,fRealPart);