27 #ifndef _RL_MATH_TRANSFORM_H_
28 #define _RL_MATH_TRANSFORM_H_
30 #define EIGEN_MATRIXBASE_PLUGIN <rl/math/MatrixBaseAddons.h>
31 #define EIGEN_QUATERNIONBASE_PLUGIN <rl/math/QuaternionBaseAddons.h>
33 #include <Eigen/Geometry>
42 typedef ::Eigen::Transform< Real, 3, ::Eigen::Affine >
Transform;
48 template<
typename Matrix1,
typename Matrix2,
typename Real >
51 distance(
const Matrix1& t1,
const Matrix2& t2,
const Real& weight = 1.0)
57 ::std::pow(t2(0, 3) - t1(0, 3), 2) +
58 ::std::pow(t2(1, 3) - t1(1, 3), 2) +
59 ::std::pow(t2(2, 3) - t1(2, 3), 2) +
60 weight * ::std::pow(q1.angularDistance(q2), 2)
64 template<
typename Matrix1,
typename Real,
typename Matrix2 >
74 t2(0, 0) = t1(0, 0) - c * t1(1, 0) + b * t1(2, 0);
75 t2(0, 1) = t1(0, 1) - c * t1(1, 1) + b * t1(2, 1);
76 t2(0, 2) = t1(0, 2) - c * t1(1, 2) + b * t1(2, 2);
77 t2(0, 3) = t1(0, 3) + x;
78 t2(1, 0) = t1(1, 0) + c * t1(0, 0) - a * t1(2, 0);
79 t2(1, 1) = t1(1, 1) + c * t1(0, 1) - a * t1(2, 1);
80 t2(1, 2) = t1(1, 2) + c * t1(0, 2) - a * t1(2, 2);
81 t2(1, 3) = t1(1, 3) + y;
82 t2(2, 0) = t1(2, 0) - b * t1(0, 0) + a * t1(1, 0);
83 t2(2, 1) = t1(2, 1) - b * t1(0, 1) + a * t1(1, 1);
84 t2(2, 2) = t1(2, 2) - b * t1(0, 2) + a * t1(1, 2);
85 t2(2, 3) = t1(2, 3) + z;
92 template<
typename Matrix1,
typename Vector,
typename Matrix2 >
99 fromDelta(t1, xyzabc(0), xyzabc(1), xyzabc(2), xyzabc(3), xyzabc(4), xyzabc(5), t2);
102 template<
typename Matrix,
typename Real >
113 a = (t(2, 1) - t(1, 2)) / 2.0f;
114 b = (t(0, 2) - t(2, 0)) / 2.0f;
115 c = (t(1, 0) - t(0, 1)) / 2.0f;
118 template<
typename Matrix,
typename Vector >
125 getDelta(t, xyzabc(0), xyzabc(1), xyzabc(2), xyzabc(3), xyzabc(4), xyzabc(5));
128 template<
typename Matrix,
typename Real >
136 assert(::std::abs(t(2, 0)) <= ::std::numeric_limits<Real>::epsilon());
140 theta = ::std::atan2(t(1, 0), t(0, 0));
142 if (::std::abs(t(0, 0)) <= ::std::numeric_limits<Real>::epsilon())
144 a = t(1, 3) / t(1, 0);
148 a = t(0, 3) / t(0, 0);
151 alpha = ::std::atan2(t(2, 1), t(2, 2));
154 template<
typename Real,
typename Matrix >
180 template<
typename Vector,
typename Matrix >
187 setDelta(xyzabc(0), xyzabc(1), xyzabc(2), xyzabc(3), xyzabc(4), xyzabc(5), t);
190 template<
typename Real,
typename Matrix >
198 Real cosAlpha = ::std::cos(alpha);
199 Real cosTheta = ::std::cos(theta);
200 Real sinAlpha = ::std::sin(alpha);
201 Real sinTheta = ::std::sin(theta);
207 t(0, 1) = -cosAlpha * sinTheta;
208 t(1, 1) = cosAlpha * cosTheta;
211 t(0, 2) = sinAlpha * sinTheta;
212 t(1, 2) = -sinAlpha * cosTheta;
215 t(0, 3) = a * cosTheta;
216 t(1, 3) = a * sinTheta;
221 template<
typename Matrix1,
typename Matrix2,
typename Real >
231 x = t2(0, 3) - t1(0, 3);
232 y = t2(1, 3) - t1(1, 3);
233 z = t2(2, 3) - t1(2, 3);
234 a = (t1(1, 0) * t2(2, 0) - t1(2, 0) * t2(1, 0) + t1(1, 1) * t2(2, 1) - t1(2, 1) * t2(1, 1) + t1(1, 2) * t2(2, 2) - t1(2, 2) * t2(1, 2)) / 2.0f;
235 b = (t1(2, 0) * t2(0, 0) - t1(0, 0) * t2(2, 0) + t1(2, 1) * t2(0, 1) - t1(0, 1) * t2(2, 1) + t1(2, 2) * t2(0, 2) - t1(0, 2) * t2(2, 2)) / 2.0f;
236 c = (t1(0, 0) * t2(1, 0) - t1(1, 0) * t2(0, 0) + t1(0, 1) * t2(1, 1) - t1(1, 1) * t2(0, 1) + t1(0, 2) * t2(1, 2) - t1(1, 2) * t2(0, 2)) / 2.0f;
239 template<
typename Matrix1,
typename Matrix2,
typename Vector >
246 toDelta(t1, t2, xyzabc(0), xyzabc(1), xyzabc(2), xyzabc(3), xyzabc(4), xyzabc(5));
252 #endif // _RL_MATH_TRANSFORM_H_