8#ifndef model_RationalOrthogonalApproximation_cpp_
9#define model_RationalOrthogonalApproximation_cpp_
25 std::pair<Eigen::Matrix<long int, 3, 3>,
long int> RationalOrthogonalApproximation::compute(
const double &
angle,
26 const Eigen::Matrix<double, 3, 1> &
axis,
29 const Eigen::AngleAxisd
aa(
angle,
axis.normalized());
30 const Eigen::Quaterniond
q(
aa);
32 const double root(sqrt(fabs(maxDen)));
34 Eigen::Quaterniond q1(std::round(
q.w() * root),
35 std::round(
q.x() * root),
36 std::round(
q.y() * root),
37 std::round(
q.z() * root));
39 const double n2(q1.squaredNorm());
42 Eigen::Matrix<double, 3, 3> R(q1.toRotationMatrix());
43 Eigen::Matrix<long int, 3, 3>
Q;
44 for (
int i = 0;
i < 3; ++
i)
46 for (
int j = 0;
j < 3; ++
j)
48 if (std::fabs(R(
i,
j) * n2 - std::round(R(
i,
j) * n2)) > FLT_EPSILON)
50 std::cout <<
i <<
" " <<
j << std::endl;
51 std::cout << R(
i,
j) * n2 << std::endl;
52 std::cout << std::round(R(
i,
j) * n2) << std::endl;
53 std::cout << R * n2 << std::endl;
54 assert(0 &&
"RationalOrthogonalApproximation failed.");
58 Q(
i,
j) = std::round(R(
i,
j) * n2);
63 return std::make_pair(
Q, n2);
69 const Eigen::Matrix<double,3,1>&
axis,
70 const long int& maxDen) :
73 den(resultPair.second)
const Eigen::Matrix< long int, 3, 3 > & m
RationalOrthogonalApproximation(const double &angle, const Eigen::Matrix< double, 3, 1 > &axis, const long int &maxDen)
the magnitude of the R vector q