16 #ifndef ROOT_Math_GenVector_Translation3D
17 #define ROOT_Math_GenVector_Translation3D 1
29 #include <type_traits>
50 template <
typename T =
double>
56 typedef DisplacementVector3D<Cartesian3D<T>, DefaultCoordinateSystemTag> Vector;
68 Translation3D(IT begin, IT end)
70 fVect.SetCoordinates(begin,end);
76 Translation3D(T dx, T dy, T dz) : fVect(Vector(dx, dy, dz)) {}
81 template<
class CoordSystem,
class Tag>
82 explicit Translation3D(
const DisplacementVector3D<CoordSystem,Tag> & v) :
83 fVect(Vector(v.X(),v.Y(),v.Z()))
94 template <
class CoordSystem,
class Tag>
95 Translation3D(
const PositionVector3D<CoordSystem, Tag> &p1,
const PositionVector3D<CoordSystem, Tag> &p2)
108 const Vector & Vect()
const {
return fVect; }
115 void SetComponents(IT begin, IT end) {
116 fVect.SetCoordinates(begin,end);
124 void GetComponents(IT begin, IT end)
const {
125 fVect.GetCoordinates(begin,end);
132 void GetComponents(IT begin)
const {
133 fVect.GetCoordinates(begin);
140 void SetComponents(T dx, T dy, T dz) { fVect.SetCoordinates(dx, dy, dz); }
145 void GetComponents(T &dx, T &dy, T &dz)
const { fVect.GetCoordinates(dx, dy, dz); }
150 void SetXYZ(T dx, T dy, T dz) { fVect.SetXYZ(dx, dy, dz); }
158 template<
class CoordSystem,
class Tag >
159 PositionVector3D<CoordSystem,Tag> operator() (
const PositionVector3D <CoordSystem,Tag> & p)
const {
160 return PositionVector3D<CoordSystem, Tag>(p.X() + fVect.X(), p.Y() + fVect.Y(), p.Z() + fVect.Z());
165 template <
class CoordSystem,
class Tag>
166 PositionVector3D<CoordSystem, Tag> operator*(
const PositionVector3D<CoordSystem, Tag> &v)
const
168 return operator()(v);
175 template<
class CoordSystem,
class Tag >
176 DisplacementVector3D<CoordSystem,Tag> operator() (
const DisplacementVector3D <CoordSystem,Tag> & v)
const {
182 template <
class CoordSystem,
class Tag>
183 DisplacementVector3D<CoordSystem, Tag> operator*(
const DisplacementVector3D<CoordSystem, Tag> &v)
const
185 return operator()(v);
191 template<
class CoordSystem,
class Tag1,
class Tag2 >
192 void Transform (
const PositionVector3D <CoordSystem,Tag1> & p1, PositionVector3D <CoordSystem,Tag2> & p2 )
const {
193 PositionVector3D <CoordSystem,Tag2> tmp;
194 tmp.SetXYZ( p1.X(), p1.Y(), p1.Z() );
195 p2 = operator()(tmp);
201 template <
class CoordSystem,
class Tag1,
class Tag2>
202 void Transform(
const DisplacementVector3D<CoordSystem, Tag1> &v1, DisplacementVector3D<CoordSystem, Tag2> &v2)
const
205 v2.SetXYZ(v1.X(), v1.Y(), v1.Z());
212 template <
class CoordSystem>
213 LorentzVector<CoordSystem> operator()(
const LorentzVector<CoordSystem> &q)
const
220 template <
class CoordSystem>
221 LorentzVector<CoordSystem> operator*(
const LorentzVector<CoordSystem> &q)
const
223 return operator()(q);
229 Plane3D<T> operator()(
const Plane3D<T> &plane)
const
232 const Vector n = plane.Normal();
235 const T d = plane.HesseDistance();
236 PositionVector3D<Cartesian3D<T>> p(-d * n.X(), -d * n.Y(), -d * n.Z());
237 return PLANE(
operator()(n),
operator()(p));
243 Translation3D<T> &operator*=(
const Translation3D<T> &t)
252 Translation3D<T> operator*(
const Translation3D<T> &t)
const {
return Translation3D<T>(fVect + t.Vect()); }
258 SetComponents( -fVect.X(), -fVect.Y(),-fVect.Z() );
264 Translation3D<T> Inverse()
const {
return Translation3D<T>(-fVect.X(), -fVect.Y(), -fVect.Z()); }
269 bool operator==(
const Translation3D<T> &rhs)
const
271 if( fVect != rhs.fVect )
return false;
275 bool operator!=(
const Translation3D<T> &rhs)
const {
return !operator==(rhs); }
292 std::ostream &operator<<(std::ostream &os, const Translation3D<T> &t)
298 t.GetComponents(m, m + 3);
299 return os <<
"\n" << m[0] <<
" " << m[1] <<
" " << m[2] <<
"\n";
307 typedef Impl::Translation3D<double> Translation3D;
308 typedef Impl::Translation3D<float> Translation3DF;