46 const Eigen::MatrixBase<PointType>& v0,
47 const Eigen::MatrixBase<PointType>& v1,
48 const Eigen::MatrixBase<PointType>& v2,
49 const Eigen::MatrixBase<PointType>& p) -> Eigen::Matrix<typename PointType::Scalar, 3, 1>
51 using Scalar =
typename PointType::Scalar;
55 constexpr int Dim = PointType::SizeAtCompileTime;
56 constexpr int MaxDim = PointType::MaxSizeAtCompileTime;
58 constexpr int EffectiveMaxDim = (MaxDim != Eigen::Dynamic) ? MaxDim : 3;
59 constexpr int Rows = (Dim != Eigen::Dynamic) ? Dim + 1 : Eigen::Dynamic;
60 constexpr int MaxRows = EffectiveMaxDim + 1;
62 const Eigen::Index dim = p.size();
63 la_debug_assert(dim <= EffectiveMaxDim &&
"Point dimension exceeds maximum supported size.");
73 const auto e1 = (v1 - v0).eval();
74 const auto e2 = (v2 - v0).eval();
75 const auto ep = (p - v0).eval();
77 Eigen::Matrix<Scalar, 2, 2> G;
78 G(0, 0) = e1.squaredNorm();
81 G(1, 1) = e2.squaredNorm();
83 const Scalar det = G.determinant();
84 const Scalar tol = std::numeric_limits<Scalar>::epsilon() * G(0, 0) * G(1, 1);
86 if (std::abs(det) > tol) {
88 const Eigen::Matrix<Scalar, 2, 1> b(ep.dot(e1), ep.dot(e2));
89 const Eigen::Matrix<Scalar, 2, 1> uv = G.inverse() * b;
91 Eigen::Matrix<Scalar, 3, 1> bary;
92 bary(0) =
Scalar(1) - uv(0) - uv(1);
101 Eigen::Matrix<Scalar, Rows, 3, 0, MaxRows, 3> M(dim + 1, 3);
102 M.row(dim).setOnes();
103 for (Eigen::Index d = 0; d < dim; ++d) {
109 Eigen::Matrix<Scalar, Rows, 1, 0, MaxRows, 1> rhs(dim + 1);
110 for (Eigen::Index d = 0; d < dim; ++d) {
115 return M.colPivHouseholderQr().solve(rhs);
auto compute_barycentric_coordinates(const Eigen::MatrixBase< PointType > &v0, const Eigen::MatrixBase< PointType > &v1, const Eigen::MatrixBase< PointType > &v2, const Eigen::MatrixBase< PointType > &p) -> Eigen::Matrix< typename PointType::Scalar, 3, 1 >
Compute the barycentric coordinates of point p with respect to triangle (v0, v1, v2).
Definition compute_barycentric_coordinates.h:45