16 #ifndef ROOT_Math_GenVector_Transform3D
17 #define ROOT_Math_GenVector_Transform3D 1
39 #include <type_traits>
77 template <
typename T =
double>
83 typedef DisplacementVector3D<Cartesian3D<T>, DefaultCoordinateSystemTag> Vector;
84 typedef PositionVector3D<Cartesian3D<T>, DefaultCoordinateSystemTag> Point;
86 enum ETransform3DMatrixIndex {
87 kXX = 0, kXY = 1, kXZ = 2, kDX = 3,
88 kYX = 4, kYY = 5, kYZ = 6, kDY = 7,
89 kZX = 8, kZY = 9, kZZ =10, kDZ = 11
107 Transform3D(IT begin, IT end)
109 SetComponents(begin,end);
115 Transform3D(
const Rotation3D & r,
const Vector & v)
122 Transform3D(
const Rotation3D &r,
const Translation3D<T> &t) { AssignFrom(r, t.Vect()); }
130 template <
class ARotation,
class CoordSystem,
class Tag>
131 Transform3D(
const ARotation & r,
const DisplacementVector3D<CoordSystem,Tag> & v)
133 AssignFrom( Rotation3D(r), Vector (v.X(),v.Y(),v.Z()) );
142 template <
class ARotation>
143 Transform3D(
const ARotation &r,
const Translation3D<T> &t)
145 AssignFrom( Rotation3D(r), t.Vect() );
153 Transform3D(
const Vector & v,
const Rotation3D & r)
156 AssignFrom( r, r(v) );
163 explicit Transform3D(
const Rotation3D & r) {
170 explicit Transform3D(
const AxisAngle & r) {
171 AssignFrom(Rotation3D(r));
173 explicit Transform3D(
const EulerAngles & r) {
174 AssignFrom(Rotation3D(r));
176 explicit Transform3D(
const Quaternion & r) {
177 AssignFrom(Rotation3D(r));
179 explicit Transform3D(
const RotationZYX & r) {
180 AssignFrom(Rotation3D(r));
185 explicit Transform3D(
const RotationX & r) {
186 AssignFrom(Rotation3D(r));
188 explicit Transform3D(
const RotationY & r) {
189 AssignFrom(Rotation3D(r));
191 explicit Transform3D(
const RotationZ & r) {
192 AssignFrom(Rotation3D(r));
199 template<
class CoordSystem,
class Tag>
200 explicit Transform3D(
const DisplacementVector3D<CoordSystem,Tag> & v) {
201 AssignFrom(Vector(v.X(),v.Y(),v.Z()));
207 explicit Transform3D(
const Vector & v) {
214 explicit Transform3D(
const Translation3D<T> &t) { AssignFrom(t.Vect()); }
226 template <
class ARotation,
class CoordSystem,
class Tag>
227 Transform3D(
const DisplacementVector3D<CoordSystem,Tag> & v ,
const ARotation & r)
231 AssignFrom( r3d, r3d( Vector(v.X(),v.Y(),v.Z()) ) );
248 template <typename SCALAR = T, typename std::enable_if<std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
249 Transform3D(
const Point &fr0,
const Point &fr1,
const Point &fr2,
const Point &to0,
const Point &to1,
254 Vector x1 = (fr1 - fr0).Unit();
255 Vector y1 = (fr2 - fr0).Unit();
256 Vector x2 = (to1 - to0).Unit();
257 Vector y2 = (to2 - to0).Unit();
261 const T cos1 = x1.Dot(y1);
262 const T cos2 = x2.Dot(y2);
264 if (std::fabs(T(1) - cos1) <= T(0.000001) || std::fabs(T(1) - cos2) <= T(0.000001)) {
265 std::cerr <<
"Transform3D: Error : zero angle between axes" << std::endl;
268 if (std::fabs(cos1 - cos2) > T(0.000001)) {
269 std::cerr <<
"Transform3D: Warning: angles between axes are not equal" << std::endl;
274 Vector z1 = (x1.Cross(y1)).Unit();
277 Vector z2 = (x2.Cross(y2)).Unit();
300 T detxx = (y1y * z1z - z1y * y1z);
301 T detxy = -(y1x * z1z - z1x * y1z);
302 T detxz = (y1x * z1y - z1x * y1y);
303 T detyx = -(x1y * z1z - z1y * x1z);
304 T detyy = (x1x * z1z - z1x * x1z);
305 T detyz = -(x1x * z1y - z1x * x1y);
306 T detzx = (x1y * y1z - y1y * x1z);
307 T detzy = -(x1x * y1z - y1x * x1z);
308 T detzz = (x1x * y1y - y1x * x1y);
310 T txx = x2x * detxx + y2x * detyx + z2x * detzx;
311 T txy = x2x * detxy + y2x * detyy + z2x * detzy;
312 T txz = x2x * detxz + y2x * detyz + z2x * detzz;
313 T tyx = x2y * detxx + y2y * detyx + z2y * detzx;
314 T tyy = x2y * detxy + y2y * detyy + z2y * detzy;
315 T tyz = x2y * detxz + y2y * detyz + z2y * detzz;
316 T tzx = x2z * detxx + y2z * detyx + z2z * detzx;
317 T tzy = x2z * detxy + y2z * detyy + z2z * detzy;
318 T tzz = x2z * detxz + y2z * detyz + z2z * detzz;
322 T dx1 = fr0.x(), dy1 = fr0.y(), dz1 = fr0.z();
323 T dx2 = to0.x(), dy2 = to0.y(), dz2 = to0.z();
325 SetComponents(txx, txy, txz, dx2 - txx * dx1 - txy * dy1 - txz * dz1, tyx, tyy, tyz,
326 dy2 - tyx * dx1 - tyy * dy1 - tyz * dz1, tzx, tzy, tzz, dz2 - tzx * dx1 - tzy * dy1 - tzz * dz1);
342 template <typename SCALAR = T, typename std::enable_if<!std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
343 Transform3D(
const Point &fr0,
const Point &fr1,
const Point &fr2,
const Point &to0,
const Point &to1,
348 Vector x1 = (fr1 - fr0).Unit();
349 Vector y1 = (fr2 - fr0).Unit();
350 Vector x2 = (to1 - to0).Unit();
351 Vector y2 = (to2 - to0).Unit();
355 const T cos1 = x1.Dot(y1);
356 const T cos2 = x2.Dot(y2);
358 const auto m1 = (abs(T(1) - cos1) <= T(0.000001) || abs(T(1) - cos2) <= T(0.000001));
360 const auto m2 = (abs(cos1 - cos2) > T(0.000001));
362 std::cerr <<
"Transform3D: Warning: angles between axes are not equal" << std::endl;
367 Vector z1 = (x1.Cross(y1)).Unit();
370 Vector z2 = (x2.Cross(y2)).Unit();
393 T detxx = (y1y * z1z - z1y * y1z);
394 T detxy = -(y1x * z1z - z1x * y1z);
395 T detxz = (y1x * z1y - z1x * y1y);
396 T detyx = -(x1y * z1z - z1y * x1z);
397 T detyy = (x1x * z1z - z1x * x1z);
398 T detyz = -(x1x * z1y - z1x * x1y);
399 T detzx = (x1y * y1z - y1y * x1z);
400 T detzy = -(x1x * y1z - y1x * x1z);
401 T detzz = (x1x * y1y - y1x * x1y);
403 T txx = x2x * detxx + y2x * detyx + z2x * detzx;
404 T txy = x2x * detxy + y2x * detyy + z2x * detzy;
405 T txz = x2x * detxz + y2x * detyz + z2x * detzz;
406 T tyx = x2y * detxx + y2y * detyx + z2y * detzx;
407 T tyy = x2y * detxy + y2y * detyy + z2y * detzy;
408 T tyz = x2y * detxz + y2y * detyz + z2y * detzz;
409 T tzx = x2z * detxx + y2z * detyx + z2z * detzx;
410 T tzy = x2z * detxy + y2z * detyy + z2z * detzy;
411 T tzz = x2z * detxz + y2z * detyz + z2z * detzz;
415 T dx1 = fr0.x(), dy1 = fr0.y(), dz1 = fr0.z();
416 T dx2 = to0.x(), dy2 = to0.y(), dz2 = to0.z();
418 SetComponents(txx, txy, txz, dx2 - txx * dx1 - txy * dy1 - txz * dz1, tyx, tyy, tyz,
419 dy2 - tyx * dx1 - tyy * dy1 - tyz * dz1, tzx, tzy, tzz, dz2 - tzx * dx1 - tzy * dy1 - tzz * dz1);
422 std::cerr <<
"Transform3D: Error : zero angle between axes" << std::endl;
435 template<
class ForeignMatrix>
436 explicit Transform3D(
const ForeignMatrix & m) {
443 Transform3D(T xx, T xy, T xz, T dx, T yx, T yy, T yz, T dy, T zx, T zy, T zz, T dz)
445 SetComponents (xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
455 template <
class ForeignMatrix>
456 Transform3D<T> &operator=(
const ForeignMatrix &m)
472 void SetComponents(IT begin, IT end) {
474 void SetComponents(IT begin, IT ) {
476 for (
int i = 0; i <12; ++i) {
489 void GetComponents(IT begin, IT end)
const {
491 void GetComponents(IT begin, IT )
const {
493 for (
int i = 0; i <12; ++i) {
504 void GetComponents(IT begin)
const {
505 std::copy(fM, fM + 12, begin);
514 template<
class ForeignMatrix>
516 SetTransformMatrix (
const ForeignMatrix & m) {
517 fM[kXX]=m(0,0); fM[kXY]=m(0,1); fM[kXZ]=m(0,2); fM[kDX]=m(0,3);
518 fM[kYX]=m(1,0); fM[kYY]=m(1,1); fM[kYZ]=m(1,2); fM[kDY]=m(1,3);
519 fM[kZX]=m(2,0); fM[kZY]=m(2,1); fM[kZZ]=m(2,2); fM[kDZ]=m(2,3);
527 template<
class ForeignMatrix>
529 GetTransformMatrix (ForeignMatrix & m)
const {
530 m(0,0)=fM[kXX]; m(0,1)=fM[kXY]; m(0,2)=fM[kXZ]; m(0,3)=fM[kDX];
531 m(1,0)=fM[kYX]; m(1,1)=fM[kYY]; m(1,2)=fM[kYZ]; m(1,3)=fM[kDY];
532 m(2,0)=fM[kZX]; m(2,1)=fM[kZY]; m(2,2)=fM[kZZ]; m(2,3)=fM[kDZ];
539 void SetComponents(T xx, T xy, T xz, T dx, T yx, T yy, T yz, T dy, T zx, T zy, T zz, T dz)
541 fM[kXX]=xx; fM[kXY]=xy; fM[kXZ]=xz; fM[kDX]=dx;
542 fM[kYX]=yx; fM[kYY]=yy; fM[kYZ]=yz; fM[kDY]=dy;
543 fM[kZX]=zx; fM[kZY]=zy; fM[kZZ]=zz; fM[kDZ]=dz;
549 void GetComponents(T &xx, T &xy, T &xz, T &dx, T &yx, T &yy, T &yz, T &dy, T &zx, T &zy, T &zz, T &dz)
const
551 xx=fM[kXX]; xy=fM[kXY]; xz=fM[kXZ]; dx=fM[kDX];
552 yx=fM[kYX]; yy=fM[kYY]; yz=fM[kYZ]; dy=fM[kDY];
553 zx=fM[kZX]; zy=fM[kZY]; zz=fM[kZZ]; dz=fM[kDZ];
561 template<
class AnyRotation,
class V>
562 void GetDecomposition(AnyRotation &r, V &v)
const {
571 void GetDecomposition(Rotation3D &r, Vector &v)
const {
579 Rotation3D Rotation()
const {
580 return Rotation3D( fM[kXX], fM[kXY], fM[kXZ],
581 fM[kYX], fM[kYY], fM[kYZ],
582 fM[kZX], fM[kZY], fM[kZZ] );
588 template <
class AnyRotation>
589 AnyRotation Rotation()
const {
590 return AnyRotation(Rotation3D(fM[kXX], fM[kXY], fM[kXZ], fM[kYX], fM[kYY], fM[kYZ], fM[kZX], fM[kZY], fM[kZZ]));
596 template <
class AnyRotation>
597 void GetRotation(AnyRotation &r)
const {
604 Translation3D<T> Translation()
const {
return Translation3D<T>(fM[kDX], fM[kDY], fM[kDZ]); }
610 template <
class AnyVector>
611 void GetTranslation(AnyVector &v)
const {
612 v.SetXYZ(fM[kDX], fM[kDY], fM[kDZ]);
623 Point operator() (
const Point & p)
const {
624 return Point ( fM[kXX]*p.X() + fM[kXY]*p.Y() + fM[kXZ]*p.Z() + fM[kDX],
625 fM[kYX]*p.X() + fM[kYY]*p.Y() + fM[kYZ]*p.Z() + fM[kDY],
626 fM[kZX]*p.X() + fM[kZY]*p.Y() + fM[kZZ]*p.Z() + fM[kDZ] );
634 Vector operator() (
const Vector & v)
const {
635 return Vector( fM[kXX]*v.X() + fM[kXY]*v.Y() + fM[kXZ]*v.Z() ,
636 fM[kYX]*v.X() + fM[kYY]*v.Y() + fM[kYZ]*v.Z() ,
637 fM[kZX]*v.X() + fM[kZY]*v.Y() + fM[kZZ]*v.Z() );
644 template <
class CoordSystem>
645 PositionVector3D<CoordSystem> operator()(
const PositionVector3D<CoordSystem> &p)
const
647 return PositionVector3D<CoordSystem>(operator()(Point(p)));
652 template <
class CoordSystem>
653 PositionVector3D<CoordSystem> operator*(
const PositionVector3D<CoordSystem> &v)
const
655 return operator()(v);
661 template<
class CoordSystem >
662 DisplacementVector3D<CoordSystem> operator() (
const DisplacementVector3D <CoordSystem> & v)
const {
663 return DisplacementVector3D<CoordSystem>(operator()(Vector(v)));
668 template <
class CoordSystem>
669 DisplacementVector3D<CoordSystem> operator*(
const DisplacementVector3D<CoordSystem> &v)
const
671 return operator()(v);
679 Vector ApplyInverse(
const Vector &v)
const
681 return Vector(fM[kXX] * v.X() + fM[kYX] * v.Y() + fM[kZX] * v.Z(),
682 fM[kXY] * v.X() + fM[kYY] * v.Y() + fM[kZY] * v.Z(),
683 fM[kXZ] * v.X() + fM[kYZ] * v.Y() + fM[kZZ] * v.Z());
692 Point ApplyInverse(
const Point &p)
const
694 Point tmp(p.X() - fM[kDX], p.Y() - fM[kDY], p.Z() - fM[kDZ]);
695 return Point(fM[kXX] * tmp.X() + fM[kYX] * tmp.Y() + fM[kZX] * tmp.Z(),
696 fM[kXY] * tmp.X() + fM[kYY] * tmp.Y() + fM[kZY] * tmp.Z(),
697 fM[kXZ] * tmp.X() + fM[kYZ] * tmp.Y() + fM[kZZ] * tmp.Z());
705 template <
class CoordSystem>
706 PositionVector3D<CoordSystem> ApplyInverse(
const PositionVector3D<CoordSystem> &p)
const
708 return PositionVector3D<CoordSystem>(ApplyInverse(Point(p)));
716 template <
class CoordSystem>
717 DisplacementVector3D<CoordSystem> ApplyInverse(
const DisplacementVector3D<CoordSystem> &p)
const
719 return DisplacementVector3D<CoordSystem>(ApplyInverse(Vector(p)));
725 template <
class CoordSystem,
class Tag1,
class Tag2>
726 void Transform(
const PositionVector3D<CoordSystem, Tag1> &p1, PositionVector3D<CoordSystem, Tag2> &p2)
const
728 const Point xyzNew = operator()(Point(p1.X(), p1.Y(), p1.Z()));
729 p2.SetXYZ( xyzNew.X(), xyzNew.Y(), xyzNew.Z() );
736 template <
class CoordSystem,
class Tag1,
class Tag2>
737 void Transform(
const DisplacementVector3D<CoordSystem, Tag1> &v1, DisplacementVector3D<CoordSystem, Tag2> &v2)
const
739 const Vector xyzNew = operator()(Vector(v1.X(), v1.Y(), v1.Z()));
740 v2.SetXYZ( xyzNew.X(), xyzNew.Y(), xyzNew.Z() );
746 template <
class CoordSystem >
747 LorentzVector<CoordSystem> operator() (
const LorentzVector<CoordSystem> & q)
const {
748 const Vector xyzNew = operator()(Vector(q.Vect()));
749 return LorentzVector<CoordSystem>(xyzNew.X(), xyzNew.Y(), xyzNew.Z(), q.E());
754 template <
class CoordSystem>
755 LorentzVector<CoordSystem> operator*(
const LorentzVector<CoordSystem> &q)
const
757 return operator()(q);
763 template <
typename TYPE>
764 Plane3D<TYPE> operator()(
const Plane3D<TYPE> &plane)
const
767 const auto n = plane.Normal();
770 const auto d = plane.HesseDistance();
771 Point p(-d * n.X(), -d * n.Y(), -d * n.Z());
772 return Plane3D<TYPE>(operator()(n), operator()(p));
776 template <
typename TYPE>
777 Plane3D<TYPE> operator*(
const Plane3D<TYPE> &plane)
const
779 return operator()(plane);
787 inline Transform3D<T> &operator*=(
const Transform3D<T> &t);
792 inline Transform3D<T> operator*(
const Transform3D<T> &t)
const;
797 template <typename SCALAR = T, typename std::enable_if<std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
806 T detxx = fM[kYY] * fM[kZZ] - fM[kYZ] * fM[kZY];
807 T detxy = fM[kYX] * fM[kZZ] - fM[kYZ] * fM[kZX];
808 T detxz = fM[kYX] * fM[kZY] - fM[kYY] * fM[kZX];
809 T det = fM[kXX] * detxx - fM[kXY] * detxy + fM[kXZ] * detxz;
811 std::cerr <<
"Transform3D::inverse error: zero determinant" << std::endl;
818 T detyx = (fM[kXY] * fM[kZZ] - fM[kXZ] * fM[kZY]) * det;
819 T detyy = (fM[kXX] * fM[kZZ] - fM[kXZ] * fM[kZX]) * det;
820 T detyz = (fM[kXX] * fM[kZY] - fM[kXY] * fM[kZX]) * det;
821 T detzx = (fM[kXY] * fM[kYZ] - fM[kXZ] * fM[kYY]) * det;
822 T detzy = (fM[kXX] * fM[kYZ] - fM[kXZ] * fM[kYX]) * det;
823 T detzz = (fM[kXX] * fM[kYY] - fM[kXY] * fM[kYX]) * det;
824 SetComponents(detxx, -detyx, detzx, -detxx * fM[kDX] + detyx * fM[kDY] - detzx * fM[kDZ], -detxy, detyy, -detzy,
825 detxy * fM[kDX] - detyy * fM[kDY] + detzy * fM[kDZ], detxz, -detyz, detzz,
826 -detxz * fM[kDX] + detyz * fM[kDY] - detzz * fM[kDZ]);
832 template <typename SCALAR = T, typename std::enable_if<!std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
841 T detxx = fM[kYY] * fM[kZZ] - fM[kYZ] * fM[kZY];
842 T detxy = fM[kYX] * fM[kZZ] - fM[kYZ] * fM[kZX];
843 T detxz = fM[kYX] * fM[kZY] - fM[kYY] * fM[kZX];
844 T det = fM[kXX] * detxx - fM[kXY] * detxy + fM[kXZ] * detxz;
845 const auto detZmask = (det == T(0));
846 if (any_of(detZmask)) {
847 std::cerr <<
"Transform3D::inverse error: zero determinant" << std::endl;
848 det(detZmask) = T(1);
854 T detyx = (fM[kXY] * fM[kZZ] - fM[kXZ] * fM[kZY]) * det;
855 T detyy = (fM[kXX] * fM[kZZ] - fM[kXZ] * fM[kZX]) * det;
856 T detyz = (fM[kXX] * fM[kZY] - fM[kXY] * fM[kZX]) * det;
857 T detzx = (fM[kXY] * fM[kYZ] - fM[kXZ] * fM[kYY]) * det;
858 T detzy = (fM[kXX] * fM[kYZ] - fM[kXZ] * fM[kYX]) * det;
859 T detzz = (fM[kXX] * fM[kYY] - fM[kXY] * fM[kYX]) * det;
861 if (any_of(detZmask)) {
862 detxx(detZmask) = T(0);
863 detxy(detZmask) = T(0);
864 detxz(detZmask) = T(0);
865 detyx(detZmask) = T(0);
866 detyy(detZmask) = T(0);
867 detyz(detZmask) = T(0);
868 detzx(detZmask) = T(0);
869 detzy(detZmask) = T(0);
870 detzz(detZmask) = T(0);
873 SetComponents(detxx, -detyx, detzx, -detxx * fM[kDX] + detyx * fM[kDY] - detzx * fM[kDZ], -detxy, detyy, -detzy,
874 detxy * fM[kDX] - detyy * fM[kDY] + detzy * fM[kDZ], detxz, -detyz, detzz,
875 -detxz * fM[kDX] + detyz * fM[kDY] - detzz * fM[kDZ]);
881 Transform3D<T> Inverse()
const
883 Transform3D<T> t(*
this);
892 bool operator==(
const Transform3D<T> &rhs)
const
894 return (fM[0] == rhs.fM[0] && fM[1] == rhs.fM[1] && fM[2] == rhs.fM[2] && fM[3] == rhs.fM[3] &&
895 fM[4] == rhs.fM[4] && fM[5] == rhs.fM[5] && fM[6] == rhs.fM[6] && fM[7] == rhs.fM[7] &&
896 fM[8] == rhs.fM[8] && fM[9] == rhs.fM[9] && fM[10] == rhs.fM[10] && fM[11] == rhs.fM[11]);
903 bool operator!=(
const Transform3D<T> &rhs)
const {
return !operator==(rhs); }
910 void AssignFrom(
const Rotation3D &r,
const Vector &v)
915 r.GetComponents(rotData, rotData + 9);
917 for (
int i = 0; i < 3; ++i) fM[i] = rotData[i];
919 for (
int i = 0; i < 3; ++i) fM[kYX + i] = rotData[3 + i];
921 for (
int i = 0; i < 3; ++i) fM[kZX + i] = rotData[6 + i];
925 v.GetCoordinates(vecData, vecData + 3);
926 fM[kDX] = vecData[0];
927 fM[kDY] = vecData[1];
928 fM[kDZ] = vecData[2];
934 void AssignFrom(
const Rotation3D &r)
938 r.GetComponents(rotData, rotData + 9);
939 for (
int i = 0; i < 3; ++i) {
940 for (
int j = 0; j < 3; ++j) fM[4 * i + j] = rotData[3 * i + j];
942 fM[4 * i + 3] = T(0);
949 void AssignFrom(
const Vector &v)
990 template <typename SCALAR = T, typename std::enable_if<!std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
991 void SetIdentity(
const typename SCALAR::mask_type m)
1018 inline Transform3D<T> &Transform3D<T>::operator*=(
const Transform3D<T> &t)
1022 SetComponents(fM[kXX]*t.fM[kXX]+fM[kXY]*t.fM[kYX]+fM[kXZ]*t.fM[kZX],
1023 fM[kXX]*t.fM[kXY]+fM[kXY]*t.fM[kYY]+fM[kXZ]*t.fM[kZY],
1024 fM[kXX]*t.fM[kXZ]+fM[kXY]*t.fM[kYZ]+fM[kXZ]*t.fM[kZZ],
1025 fM[kXX]*t.fM[kDX]+fM[kXY]*t.fM[kDY]+fM[kXZ]*t.fM[kDZ]+fM[kDX],
1027 fM[kYX]*t.fM[kXX]+fM[kYY]*t.fM[kYX]+fM[kYZ]*t.fM[kZX],
1028 fM[kYX]*t.fM[kXY]+fM[kYY]*t.fM[kYY]+fM[kYZ]*t.fM[kZY],
1029 fM[kYX]*t.fM[kXZ]+fM[kYY]*t.fM[kYZ]+fM[kYZ]*t.fM[kZZ],
1030 fM[kYX]*t.fM[kDX]+fM[kYY]*t.fM[kDY]+fM[kYZ]*t.fM[kDZ]+fM[kDY],
1032 fM[kZX]*t.fM[kXX]+fM[kZY]*t.fM[kYX]+fM[kZZ]*t.fM[kZX],
1033 fM[kZX]*t.fM[kXY]+fM[kZY]*t.fM[kYY]+fM[kZZ]*t.fM[kZY],
1034 fM[kZX]*t.fM[kXZ]+fM[kZY]*t.fM[kYZ]+fM[kZZ]*t.fM[kZZ],
1035 fM[kZX]*t.fM[kDX]+fM[kZY]*t.fM[kDY]+fM[kZZ]*t.fM[kDZ]+fM[kDZ]);
1041 inline Transform3D<T> Transform3D<T>::operator*(
const Transform3D<T> &t)
const
1045 return Transform3D<T>(fM[kXX] * t.fM[kXX] + fM[kXY] * t.fM[kYX] + fM[kXZ] * t.fM[kZX],
1046 fM[kXX] * t.fM[kXY] + fM[kXY] * t.fM[kYY] + fM[kXZ] * t.fM[kZY],
1047 fM[kXX] * t.fM[kXZ] + fM[kXY] * t.fM[kYZ] + fM[kXZ] * t.fM[kZZ],
1048 fM[kXX] * t.fM[kDX] + fM[kXY] * t.fM[kDY] + fM[kXZ] * t.fM[kDZ] + fM[kDX],
1050 fM[kYX] * t.fM[kXX] + fM[kYY] * t.fM[kYX] + fM[kYZ] * t.fM[kZX],
1051 fM[kYX] * t.fM[kXY] + fM[kYY] * t.fM[kYY] + fM[kYZ] * t.fM[kZY],
1052 fM[kYX] * t.fM[kXZ] + fM[kYY] * t.fM[kYZ] + fM[kYZ] * t.fM[kZZ],
1053 fM[kYX] * t.fM[kDX] + fM[kYY] * t.fM[kDY] + fM[kYZ] * t.fM[kDZ] + fM[kDY],
1055 fM[kZX] * t.fM[kXX] + fM[kZY] * t.fM[kYX] + fM[kZZ] * t.fM[kZX],
1056 fM[kZX] * t.fM[kXY] + fM[kZY] * t.fM[kYY] + fM[kZZ] * t.fM[kZY],
1057 fM[kZX] * t.fM[kXZ] + fM[kZY] * t.fM[kYZ] + fM[kZZ] * t.fM[kZZ],
1058 fM[kZX] * t.fM[kDX] + fM[kZY] * t.fM[kDY] + fM[kZZ] * t.fM[kDZ] + fM[kDZ]);
1075 inline Transform3D<T> operator*(
const Rotation3D &r,
const Translation3D<T> &t)
1077 return Transform3D<T>(r, r(t.Vect()));
1080 inline Transform3D<T> operator*(
const RotationX &r,
const Translation3D<T> &t)
1083 return Transform3D<T>(r3, r3(t.Vect()));
1086 inline Transform3D<T> operator*(
const RotationY &r,
const Translation3D<T> &t)
1089 return Transform3D<T>(r3, r3(t.Vect()));
1092 inline Transform3D<T> operator*(
const RotationZ &r,
const Translation3D<T> &t)
1095 return Transform3D<T>(r3, r3(t.Vect()));
1098 inline Transform3D<T> operator*(
const RotationZYX &r,
const Translation3D<T> &t)
1101 return Transform3D<T>(r3, r3(t.Vect()));
1104 inline Transform3D<T> operator*(
const AxisAngle &r,
const Translation3D<T> &t)
1107 return Transform3D<T>(r3, r3(t.Vect()));
1110 inline Transform3D<T> operator*(
const EulerAngles &r,
const Translation3D<T> &t)
1113 return Transform3D<T>(r3, r3(t.Vect()));
1116 inline Transform3D<T> operator*(
const Quaternion &r,
const Translation3D<T> &t)
1119 return Transform3D<T>(r3, r3(t.Vect()));
1129 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const Rotation3D &r)
1131 return Transform3D<T>(r, t.Vect());
1134 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const RotationX &r)
1136 return Transform3D<T>(Rotation3D(r), t.Vect());
1139 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const RotationY &r)
1141 return Transform3D<T>(Rotation3D(r), t.Vect());
1144 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const RotationZ &r)
1146 return Transform3D<T>(Rotation3D(r), t.Vect());
1149 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const RotationZYX &r)
1151 return Transform3D<T>(Rotation3D(r), t.Vect());
1154 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const EulerAngles &r)
1156 return Transform3D<T>(Rotation3D(r), t.Vect());
1159 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const Quaternion &r)
1161 return Transform3D<T>(Rotation3D(r), t.Vect());
1164 inline Transform3D<T> operator*(
const Translation3D<T> &t,
const AxisAngle &r)
1166 return Transform3D<T>(Rotation3D(r), t.Vect());
1176 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const Translation3D<T> &d)
1178 Rotation3D r = t.Rotation();
1179 return Transform3D<T>(r, r(d.Vect()) + t.Translation().Vect());
1187 inline Transform3D<T> operator*(
const Translation3D<T> &d,
const Transform3D<T> &t)
1189 return Transform3D<T>(t.Rotation(), t.Translation().Vect() + d.Vect());
1200 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const Rotation3D &r)
1202 return Transform3D<T>(t.Rotation() * r, t.Translation());
1205 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const RotationX &r)
1207 return Transform3D<T>(t.Rotation() * r, t.Translation());
1210 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const RotationY &r)
1212 return Transform3D<T>(t.Rotation() * r, t.Translation());
1215 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const RotationZ &r)
1217 return Transform3D<T>(t.Rotation() * r, t.Translation());
1220 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const RotationZYX &r)
1222 return Transform3D<T>(t.Rotation() * r, t.Translation());
1225 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const EulerAngles &r)
1227 return Transform3D<T>(t.Rotation() * r, t.Translation());
1230 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const AxisAngle &r)
1232 return Transform3D<T>(t.Rotation() * r, t.Translation());
1235 inline Transform3D<T> operator*(
const Transform3D<T> &t,
const Quaternion &r)
1237 return Transform3D<T>(t.Rotation() * r, t.Translation());
1247 inline Transform3D<T> operator*(
const Rotation3D &r,
const Transform3D<T> &t)
1249 return Transform3D<T>(r * t.Rotation(), r * t.Translation().Vect());
1252 inline Transform3D<T> operator*(
const RotationX &r,
const Transform3D<T> &t)
1255 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1258 inline Transform3D<T> operator*(
const RotationY &r,
const Transform3D<T> &t)
1261 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1264 inline Transform3D<T> operator*(
const RotationZ &r,
const Transform3D<T> &t)
1267 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1270 inline Transform3D<T> operator*(
const RotationZYX &r,
const Transform3D<T> &t)
1273 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1276 inline Transform3D<T> operator*(
const EulerAngles &r,
const Transform3D<T> &t)
1279 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1282 inline Transform3D<T> operator*(
const AxisAngle &r,
const Transform3D<T> &t)
1285 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1288 inline Transform3D<T> operator*(
const Quaternion &r,
const Transform3D<T> &t)
1291 return Transform3D<T>(r3d * t.Rotation(), r3d * t.Translation().Vect());
1302 std::ostream &operator<<(std::ostream &os, const Transform3D<T> &t)
1308 t.GetComponents(m, m + 12);
1309 os <<
"\n" << m[0] <<
" " << m[1] <<
" " << m[2] <<
" " << m[3];
1310 os <<
"\n" << m[4] <<
" " << m[5] <<
" " << m[6] <<
" " << m[7];
1311 os <<
"\n" << m[8] <<
" " << m[9] <<
" " << m[10] <<
" " << m[11] <<
"\n";
1318 typedef Impl::Transform3D<double> Transform3D;
1319 typedef Impl::Transform3D<float> Transform3DF;