56 PONCA_MULTIARCH_STD_MATH(sqrt);
57 PONCA_MULTIARCH_STD_MATH(numeric_limits);
63 VectorType barycenter = Base::barycenterLocal();
64 VectorArray dBarycenter = Base::barycenterDerivatives();
67 Scalar epsilon =
Scalar(2) * Eigen::NumTraits<Scalar>::epsilon();
68 Scalar consider_as_zero =
Scalar(2) * numeric_limits<Scalar>::denorm_min();
72 Eigen::Matrix<Scalar,2,1> shifted_eivals = Base::m_solver.eigenvalues().template tail<2>().array() - Base::m_solver.eigenvalues()(0);
73 if(shifted_eivals(0) < consider_as_zero || shifted_eivals(0) < epsilon * shifted_eivals(1)) shifted_eivals(0) = 0;
74 if(shifted_eivals(1) < consider_as_zero) shifted_eivals(1) = 0;
77 for(
int k=0; k<Base::NbDerivatives; ++k)
88 Eigen::Matrix<Scalar,2,1> z = - Base::m_solver.eigenvectors().template rightCols<2>().transpose() * (Base::m_dCov[k] * normal);
89 if(shifted_eivals(0)>0) z(0) /= shifted_eivals(0);
90 if(shifted_eivals(1)>0) z(1) /= shifted_eivals(1);
91 m_dNormal.col(k) = Base::m_solver.eigenvectors().template rightCols<2>() * z;
94 if(k>0 || !Base::isScaleDer())
95 dDiff(Base::isScaleDer() ? k-1 : k) += 1;
96 m_dDist(k) = m_dNormal.col(k).dot(barycenter) + normal.dot(dDiff);
103 return Base::m_eCurrentState;