17 #ifndef ROOT_Math_GenVector_Rotation3D
18 #define ROOT_Math_GenVector_Rotation3D 1
69 typedef double Scalar;
71 enum ERotation3DMatrixIndex {
72 kXX = 0, kXY = 1, kXZ = 2
73 , kYX = 3, kYY = 4, kYZ = 5
74 , kZX = 6, kZY = 7, kZZ = 8
89 Rotation3D(IT begin, IT end) { SetComponents(begin,end); }
94 Rotation3D ( Rotation3D
const & r ) {
101 explicit Rotation3D( AxisAngle
const & a ) { gv_detail::convert(a, *
this); }
106 explicit Rotation3D( EulerAngles
const & e ) { gv_detail::convert(e, *
this); }
111 explicit Rotation3D( RotationZYX
const & e ) { gv_detail::convert(e, *
this); }
116 explicit Rotation3D( Quaternion
const & q ) { gv_detail::convert(q, *
this); }
121 explicit Rotation3D( RotationZ
const & r ) { gv_detail::convert(r, *
this); }
122 explicit Rotation3D( RotationY
const & r ) { gv_detail::convert(r, *
this); }
123 explicit Rotation3D( RotationX
const & r ) { gv_detail::convert(r, *
this); }
131 template<
class ForeignMatrix>
132 explicit Rotation3D(
const ForeignMatrix & m) { SetComponents(m); }
140 template<
class ForeignVector>
141 Rotation3D(
const ForeignVector& v1,
142 const ForeignVector& v2,
143 const ForeignVector& v3 ) { SetComponents(v1, v2, v3); }
150 Rotation3D(Scalar xx, Scalar xy, Scalar xz,
151 Scalar yx, Scalar yy, Scalar yz,
152 Scalar zx, Scalar zy, Scalar zz)
154 SetComponents (xx, xy, xz, yx, yy, yz, zx, zy, zz);
163 operator=( Rotation3D
const & rhs ) {
164 SetComponents( rhs.fM[0], rhs.fM[1], rhs.fM[2],
165 rhs.fM[3], rhs.fM[4], rhs.fM[5],
166 rhs.fM[6], rhs.fM[7], rhs.fM[8] );
174 operator=( AxisAngle
const & a ) {
return operator=(Rotation3D(a)); }
180 operator=( EulerAngles
const & e ) {
return operator=(Rotation3D(e)); }
186 operator=( RotationZYX
const & r ) {
return operator=(Rotation3D(r)); }
192 operator=( Quaternion
const & q ) {
return operator=(Rotation3D(q)); }
198 operator=( RotationZ
const & r ) {
return operator=(Rotation3D(r)); }
200 operator=( RotationY
const & r ) {
return operator=(Rotation3D(r)); }
202 operator=( RotationX
const & r ) {
return operator=(Rotation3D(r)); }
208 template<
class ForeignMatrix>
210 operator=(
const ForeignMatrix & m) {
211 SetComponents( m(0,0), m(0,1), m(0,2),
212 m(1,0), m(1,1), m(1,2),
213 m(2,0), m(2,1), m(2,2) );
231 template<
class ForeignVector>
233 SetComponents (
const ForeignVector& v1,
234 const ForeignVector& v2,
235 const ForeignVector& v3 ) {
236 fM[kXX]=v1.x(); fM[kXY]=v2.x(); fM[kXZ]=v3.x();
237 fM[kYX]=v1.y(); fM[kYY]=v2.y(); fM[kYZ]=v3.y();
238 fM[kZX]=v1.z(); fM[kZY]=v2.z(); fM[kZZ]=v3.z();
247 template<
class ForeignVector>
249 GetComponents ( ForeignVector& v1,
251 ForeignVector& v3 )
const {
252 v1 = ForeignVector ( fM[kXX], fM[kYX], fM[kZX] );
253 v2 = ForeignVector ( fM[kXY], fM[kYY], fM[kZY] );
254 v3 = ForeignVector ( fM[kXZ], fM[kYZ], fM[kZZ] );
263 void SetComponents(IT begin, IT end) {
265 void SetComponents(IT begin, IT ) {
267 for (
int i = 0; i <9; ++i) {
280 void GetComponents(IT begin, IT end)
const {
282 void GetComponents(IT begin, IT )
const {
284 for (
int i = 0; i <9; ++i) {
295 void GetComponents(IT begin)
const {
296 std::copy ( fM, fM+9, begin );
305 template<
class ForeignMatrix>
307 SetRotationMatrix (
const ForeignMatrix & m) {
308 fM[kXX]=m(0,0); fM[kXY]=m(0,1); fM[kXZ]=m(0,2);
309 fM[kYX]=m(1,0); fM[kYY]=m(1,1); fM[kYZ]=m(1,2);
310 fM[kZX]=m(2,0); fM[kZY]=m(2,1); fM[kZZ]=m(2,2);
318 template<
class ForeignMatrix>
320 GetRotationMatrix (ForeignMatrix & m)
const {
321 m(0,0)=fM[kXX]; m(0,1)=fM[kXY]; m(0,2)=fM[kXZ];
322 m(1,0)=fM[kYX]; m(1,1)=fM[kYY]; m(1,2)=fM[kYZ];
323 m(2,0)=fM[kZX]; m(2,1)=fM[kZY]; m(2,2)=fM[kZZ];
330 SetComponents (Scalar xx, Scalar xy, Scalar xz,
331 Scalar yx, Scalar yy, Scalar yz,
332 Scalar zx, Scalar zy, Scalar zz) {
333 fM[kXX]=xx; fM[kXY]=xy; fM[kXZ]=xz;
334 fM[kYX]=yx; fM[kYY]=yy; fM[kYZ]=yz;
335 fM[kZX]=zx; fM[kZY]=zy; fM[kZZ]=zz;
342 GetComponents (Scalar &xx, Scalar &xy, Scalar &xz,
343 Scalar &yx, Scalar &yy, Scalar &yz,
344 Scalar &zx, Scalar &zy, Scalar &zz)
const {
345 xx=fM[kXX]; xy=fM[kXY]; xz=fM[kXZ];
346 yx=fM[kYX]; yy=fM[kYY]; yz=fM[kYZ];
347 zx=fM[kZX]; zy=fM[kZY]; zz=fM[kZZ];
356 template <
class CoordSystem,
class U>
357 DisplacementVector3D<CoordSystem,U>
358 operator() (
const DisplacementVector3D<CoordSystem,U> & v)
const {
359 DisplacementVector3D< Cartesian3D<double>,U > xyz;
360 xyz.SetXYZ( fM[kXX] * v.X() + fM[kXY] * v.Y() + fM[kXZ] * v.Z() ,
361 fM[kYX] * v.X() + fM[kYY] * v.Y() + fM[kYZ] * v.Z() ,
362 fM[kZX] * v.X() + fM[kZY] * v.Y() + fM[kZZ] * v.Z() );
363 return DisplacementVector3D<CoordSystem,U>( xyz );
369 template <
class CoordSystem,
class U>
370 PositionVector3D<CoordSystem,U>
371 operator() (
const PositionVector3D<CoordSystem,U> & v)
const {
372 DisplacementVector3D< Cartesian3D<double>,U > xyz(v);
373 DisplacementVector3D< Cartesian3D<double>,U > rxyz = operator()(xyz);
374 return PositionVector3D<CoordSystem,U> ( rxyz );
380 template <
class CoordSystem>
381 LorentzVector<CoordSystem>
382 operator() (
const LorentzVector<CoordSystem> & v)
const {
383 DisplacementVector3D< Cartesian3D<double> > xyz(v.Vect());
384 xyz = operator()(xyz);
385 LorentzVector< PxPyPzE4D<double> > xyzt (xyz.X(), xyz.Y(), xyz.Z(), v.E());
386 return LorentzVector<CoordSystem> ( xyzt );
394 template <
class ForeignVector>
396 operator() (
const ForeignVector & v)
const {
397 DisplacementVector3D< Cartesian3D<double> > xyz(v);
398 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
399 return ForeignVector ( rxyz.X(), rxyz.Y(), rxyz.Z() );
405 template <
class AVector>
407 AVector operator* (
const AVector & v)
const
409 return operator()(v);
420 Rotation3D Inverse()
const { Rotation3D t(*
this); t.Invert();
return t; }
427 Rotation3D operator * (
const Rotation3D & r)
const {
429 ( fM[kXX]*r.fM[kXX] + fM[kXY]*r.fM[kYX] + fM[kXZ]*r.fM[kZX]
430 , fM[kXX]*r.fM[kXY] + fM[kXY]*r.fM[kYY] + fM[kXZ]*r.fM[kZY]
431 , fM[kXX]*r.fM[kXZ] + fM[kXY]*r.fM[kYZ] + fM[kXZ]*r.fM[kZZ]
433 , fM[kYX]*r.fM[kXX] + fM[kYY]*r.fM[kYX] + fM[kYZ]*r.fM[kZX]
434 , fM[kYX]*r.fM[kXY] + fM[kYY]*r.fM[kYY] + fM[kYZ]*r.fM[kZY]
435 , fM[kYX]*r.fM[kXZ] + fM[kYY]*r.fM[kYZ] + fM[kYZ]*r.fM[kZZ]
437 , fM[kZX]*r.fM[kXX] + fM[kZY]*r.fM[kYX] + fM[kZZ]*r.fM[kZX]
438 , fM[kZX]*r.fM[kXY] + fM[kZY]*r.fM[kYY] + fM[kZZ]*r.fM[kZY]
439 , fM[kZX]*r.fM[kXZ] + fM[kZY]*r.fM[kYZ] + fM[kZZ]*r.fM[kZZ] );
449 Rotation3D operator * (
const AxisAngle & a)
const;
450 Rotation3D operator * (
const EulerAngles & e)
const;
451 Rotation3D operator * (
const Quaternion & q)
const;
452 Rotation3D operator * (
const RotationZYX & r)
const;
453 Rotation3D operator * (
const RotationX & rx)
const;
454 Rotation3D operator * (
const RotationY & ry)
const;
455 Rotation3D operator * (
const RotationZ & rz)
const;
461 Rotation3D & operator *= (
const R & r) {
return *
this = (*this)*r; }
466 bool operator == (
const Rotation3D & rhs)
const {
467 if( fM[0] != rhs.fM[0] )
return false;
468 if( fM[1] != rhs.fM[1] )
return false;
469 if( fM[2] != rhs.fM[2] )
return false;
470 if( fM[3] != rhs.fM[3] )
return false;
471 if( fM[4] != rhs.fM[4] )
return false;
472 if( fM[5] != rhs.fM[5] )
return false;
473 if( fM[6] != rhs.fM[6] )
return false;
474 if( fM[7] != rhs.fM[7] )
return false;
475 if( fM[8] != rhs.fM[8] )
return false;
478 bool operator != (
const Rotation3D & rhs)
const {
479 return ! operator==(rhs);
495 typename Rotation3D::Scalar
496 Distance (
const Rotation3D& r1,
const R & r2) {
return gv_detail::dist(r1,r2);}
501 Rotation3D operator* (RotationX
const & r1, Rotation3D
const & r2);
502 Rotation3D operator* (RotationY
const & r1, Rotation3D
const & r2);
503 Rotation3D operator* (RotationZ
const & r1, Rotation3D
const & r2);
508 Rotation3D operator* (RotationX
const & r1, RotationY
const & r2);
509 Rotation3D operator* (RotationX
const & r1, RotationZ
const & r2);
511 Rotation3D operator* (RotationY
const & r1, RotationX
const & r2);
512 Rotation3D operator* (RotationY
const & r1, RotationZ
const & r2);
514 Rotation3D operator* (RotationZ
const & r1, RotationX
const & r2);
515 Rotation3D operator* (RotationZ
const & r1, RotationY
const & r2);
522 std::ostream & operator<< (std::ostream & os,
const Rotation3D & r);
527 #endif // ROOT_Math_GenVector_Rotation3D