38 #ifndef HPP_FCL_MATH_TOOLS_H 39 #define HPP_FCL_MATH_TOOLS_H 41 #include <Eigen/Dense> 42 #include <Eigen/Geometry> 48 #include <hpp/fcl/deprecated.hh> 49 #include <hpp/fcl/config.hh> 57 template<
typename Derived>
58 static inline typename Derived::Scalar triple(
59 const Eigen::MatrixBase<Derived>& x,
60 const Eigen::MatrixBase<Derived>& y,
61 const Eigen::MatrixBase<Derived>& z)
63 return x.derived().dot(y.derived().cross(z.derived()));
66 template<
typename Derived1,
typename Derived2,
typename Derived3>
68 const Eigen::MatrixBase<Derived1>& _w,
69 const Eigen::MatrixBase<Derived2>& _u,
70 const Eigen::MatrixBase<Derived3>& _v)
72 typedef typename Derived1::Scalar T;
74 Eigen::MatrixBase<Derived1>& w = const_cast < Eigen::MatrixBase<Derived1>& > (_w);
75 Eigen::MatrixBase<Derived2>& u = const_cast < Eigen::MatrixBase<Derived2>& > (_u);
76 Eigen::MatrixBase<Derived3>& v = const_cast < Eigen::MatrixBase<Derived3>& > (_v);
79 if(std::abs(w[0]) >= std::abs(w[1]))
81 inv_length = (T)1.0 / sqrt(w[0] * w[0] + w[2] * w[2]);
82 u[0] = -w[2] * inv_length;
84 u[2] = w[0] * inv_length;
86 v[1] = w[2] * u[0] - w[0] * u[2];
91 inv_length = (T)1.0 / sqrt(w[1] * w[1] + w[2] * w[2]);
93 u[1] = w[2] * inv_length;
94 u[2] = -w[1] * inv_length;
95 v[0] = w[1] * u[2] - w[2] * u[1];
102 template<
typename Derived,
typename OtherDerived>
103 void relativeTransform(
const Eigen::MatrixBase<Derived>& R1,
const Eigen::MatrixBase<OtherDerived>& t1,
104 const Eigen::MatrixBase<Derived>& R2,
const Eigen::MatrixBase<OtherDerived>& t2,
105 const Eigen::MatrixBase<Derived>& R ,
const Eigen::MatrixBase<OtherDerived>& t)
107 const_cast< Eigen::MatrixBase<Derived>&
>(R) = R1.transpose() * R2;
108 const_cast< Eigen::MatrixBase<OtherDerived>&
>(t) = R1.transpose() * (t2 - t1);
112 template<
typename Derived,
typename Vector>
113 void eigen(
const Eigen::MatrixBase<Derived>& m,
typename Derived::Scalar dout[3], Vector* vout)
115 typedef typename Derived::Scalar Scalar;
116 Derived R(m.derived());
119 Scalar tresh, theta, tau, t, sm, s, h, g, c;
123 Scalar v[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
126 for(ip = 0; ip < n; ++ip)
128 b[ip] = d[ip] = R(ip, ip);
134 for(i = 0; i < 50; ++i)
137 for(ip = 0; ip < n; ++ip)
138 for(iq = ip + 1; iq < n; ++iq)
139 sm += std::abs(R(ip, iq));
142 vout[0] << v[0][0], v[0][1], v[0][2];
143 vout[1] << v[1][0], v[1][1], v[1][2];
144 vout[2] << v[2][0], v[2][1], v[2][2];
145 dout[0] = d[0]; dout[1] = d[1]; dout[2] = d[2];
149 if(i < 3) tresh = 0.2 * sm / (n * n);
152 for(ip = 0; ip < n; ++ip)
154 for(iq= ip + 1; iq < n; ++iq)
156 g = 100.0 * std::abs(R(ip, iq));
158 std::abs(d[ip]) + g == std::abs(d[ip]) &&
159 std::abs(d[iq]) + g == std::abs(d[iq]))
161 else if(std::abs(R(ip, iq)) > tresh)
164 if(std::abs(h) + g == std::abs(h)) t = (R(ip, iq)) / h;
167 theta = 0.5 * h / (R(ip, iq));
168 t = 1.0 /(std::abs(theta) + std::sqrt(1.0 + theta * theta));
169 if(theta < 0.0) t = -t;
171 c = 1.0 / std::sqrt(1 + t * t);
180 for(j = 0; j < ip; ++j) { g = R(j, ip); h = R(j, iq); R(j, ip) = g - s * (h + g * tau); R(j, iq) = h + s * (g - h * tau); }
181 for(j = ip + 1; j < iq; ++j) { g = R(ip, j); h = R(j, iq); R(ip, j) = g - s * (h + g * tau); R(j, iq) = h + s * (g - h * tau); }
182 for(j = iq + 1; j < n; ++j) { g = R(ip, j); h = R(iq, j); R(ip, j) = g - s * (h + g * tau); R(iq, j) = h + s * (g - h * tau); }
183 for(j = 0; j < n; ++j) { g = v[j][ip]; h = v[j][iq]; v[j][ip] = g - s * (h + g * tau); v[j][iq] = h + s * (g - h * tau); }
188 for(ip = 0; ip < n; ++ip)
196 std::cerr <<
"eigen: too many iterations in Jacobi transform." << std::endl;
201 template<
typename Derived,
typename OtherDerived>
202 bool isEqual(
const Eigen::MatrixBase<Derived>& lhs,
const Eigen::MatrixBase<OtherDerived>& rhs,
const FCL_REAL tol = std::numeric_limits<FCL_REAL>::epsilon()*100)
204 return ((lhs - rhs).array().abs() < tol).all();
void generateCoordinateSystem(const Eigen::MatrixBase< Derived1 > &_w, const Eigen::MatrixBase< Derived2 > &_u, const Eigen::MatrixBase< Derived3 > &_v)
Definition: tools.h:67
Main namespace.
Definition: AABB.h:43
void eigen(const Eigen::MatrixBase< Derived > &m, typename Derived::Scalar dout[3], Vector *vout)
compute the eigen vector and eigen vector of a matrix. dout is the eigen values, vout is the eigen ve...
Definition: tools.h:113
double FCL_REAL
Definition: data_types.h:68
void relativeTransform(const Eigen::MatrixBase< Derived > &R1, const Eigen::MatrixBase< OtherDerived > &t1, const Eigen::MatrixBase< Derived > &R2, const Eigen::MatrixBase< OtherDerived > &t2, const Eigen::MatrixBase< Derived > &R, const Eigen::MatrixBase< OtherDerived > &t)
Definition: tools.h:103
bool isEqual(const Eigen::MatrixBase< Derived > &lhs, const Eigen::MatrixBase< OtherDerived > &rhs, const FCL_REAL tol=std::numeric_limits< FCL_REAL >::epsilon() *100)
Definition: tools.h:202