17 #ifndef ROOT_Math_GenVector_AxisAngle
18 #define ROOT_Math_GenVector_AxisAngle 1
45 typedef double Scalar;
50 typedef DisplacementVector3D<Cartesian3D<Scalar> > AxisVector;
56 AxisAngle() : fAxis(0,0,1), fAngle(0) { }
62 template<
class AnyVector>
63 AxisAngle(
const AnyVector & v, Scalar angle) :
64 fAxis(v.unit()), fAngle(angle) { }
77 AxisAngle(IT begin, IT end) { SetComponents(begin,end); }
92 template <
class OtherRotation>
93 explicit AxisAngle(
const OtherRotation & r) {gv_detail::convert(r,*
this);}
99 template <
class OtherRotation>
100 AxisAngle & operator=( OtherRotation
const & r ) {
101 gv_detail::convert(r,*
this);
117 void SetComponents(IT begin, IT end) {
119 void SetComponents(IT begin, IT ) {
121 IT a = begin; IT b = ++begin; IT c = ++begin;
122 fAxis.SetCoordinates(*a,*b,*c);
124 assert (++begin==end);
126 double tot = fAxis.R();
127 if (tot > 0) fAxis /= tot;
136 void GetComponents(IT begin, IT end)
const {
138 void GetComponents(IT begin, IT )
const {
140 IT a = begin; IT b = ++begin; IT c = ++begin;
141 fAxis.GetCoordinates(*a,*b,*c);
143 assert (++begin==end);
150 void GetComponents(IT begin)
const {
152 fAxis.GetCoordinates(ax,ay,az);
163 template<
class AnyVector>
164 void SetComponents(
const AnyVector & v, Scalar angle) {
174 template<
class AnyVector>
175 void GetComponents(AnyVector & axis, Scalar & angle)
const {
183 AxisVector Axis()
const {
return fAxis; }
188 Scalar Angle()
const {
return fAngle; }
195 typedef DisplacementVector3D<Cartesian3D<double>, DefaultCoordinateSystemTag > XYZVector;
196 XYZVector operator() (
const XYZVector & v)
const;
201 template <
class CoordSystem,
class Tag>
202 DisplacementVector3D<CoordSystem, Tag>
203 operator() (
const DisplacementVector3D<CoordSystem, Tag> & v)
const {
204 DisplacementVector3D< Cartesian3D<double> > xyz(v.X(), v.Y(), v.Z());
205 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
206 DisplacementVector3D< CoordSystem, Tag > vNew;
207 vNew.SetXYZ( rxyz.X(), rxyz.Y(), rxyz.Z() );
214 template <
class CoordSystem,
class Tag>
215 PositionVector3D<CoordSystem, Tag>
216 operator() (
const PositionVector3D<CoordSystem,Tag> & p)
const {
217 DisplacementVector3D< Cartesian3D<double>,Tag > xyz(p);
218 DisplacementVector3D< Cartesian3D<double>,Tag > rxyz = operator()(xyz);
219 return PositionVector3D<CoordSystem,Tag> ( rxyz );
225 template <
class CoordSystem>
226 LorentzVector<CoordSystem>
227 operator() (
const LorentzVector<CoordSystem> & v)
const {
228 DisplacementVector3D< Cartesian3D<double> > xyz(v.Vect());
229 xyz = operator()(xyz);
230 LorentzVector< PxPyPzE4D<double> > xyzt (xyz.X(), xyz.Y(), xyz.Z(), v.E());
231 return LorentzVector<CoordSystem> ( xyzt );
240 template <
class ForeignVector>
242 operator() (
const ForeignVector & v)
const {
243 DisplacementVector3D< Cartesian3D<double> > xyz(v);
244 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
245 return ForeignVector ( rxyz.X(), rxyz.Y(), rxyz.Z() );
251 template <
class AVector>
253 AVector operator* (
const AVector & v)
const
255 return operator()(v);
261 void Invert() { fAngle = -fAngle; }
266 AxisAngle Inverse()
const { AxisAngle result(*
this); result.Invert();
return result; }
273 AxisAngle operator * (
const Rotation3D & r)
const;
274 AxisAngle operator * (
const AxisAngle & a)
const;
275 AxisAngle operator * (
const EulerAngles & e)
const;
276 AxisAngle operator * (
const Quaternion & q)
const;
277 AxisAngle operator * (
const RotationZYX & r)
const;
278 AxisAngle operator * (
const RotationX & rx)
const;
279 AxisAngle operator * (
const RotationY & ry)
const;
280 AxisAngle operator * (
const RotationZ & rz)
const;
286 AxisAngle & operator *= (
const R & r) {
return *
this = (*this)*r; }
293 Scalar Distance (
const R & r )
const {
return gv_detail::dist(*
this,r);}
298 bool operator == (
const AxisAngle & rhs)
const {
299 if( fAxis != rhs.fAxis )
return false;
300 if( fAngle != rhs.fAngle )
return false;
303 bool operator != (
const AxisAngle & rhs)
const {
304 return ! operator==(rhs);
314 static double Pi() {
return 3.14159265358979323; }
325 typename AxisAngle::Scalar
326 Distance (
const AxisAngle& r1,
const R & r2) {
return gv_detail::dist(r1,r2);}
331 AxisAngle operator* (RotationX
const & r1, AxisAngle
const & r2);
332 AxisAngle operator* (RotationY
const & r1, AxisAngle
const & r2);
333 AxisAngle operator* (RotationZ
const & r1, AxisAngle
const & r2);
340 std::ostream & operator<< (std::ostream & os,
const AxisAngle & a);