48 m_is_3d = (V.cols() == 3);
51 V_3d.resize(V.rows(), 3);
53 V_3d.block(0, 0, V.rows(), V.cols()) = V;
57 assert(V_3d.rows() == V.rows());
58 assert(V_3d.cols() == 3);
61 std::vector<Vector3i> faces;
62 for (
int i = 0; i < F.rows(); i++) {
63 faces.push_back(F.row(i));
67 if (m_is_3d && T.rows() > 0) {
68 for (
int i = 0; i < T.rows(); i++) {
73 faces.emplace_back(a, c, b);
74 faces.emplace_back(a, b, d);
75 faces.emplace_back(b, c, d);
76 faces.emplace_back(a, d, c);
83 m_tet_aabb_tree.init(m_V_T, m_T_T);
88 MatrixXi F_combo(faces.size(), 3);
89 for (
size_t i = 0; i < faces.size(); i++) {
90 F_combo.row(i) = faces[i];
92 m_tri_bvh.init(V_3d, F_combo, 1e-6);
96 std::vector<Eigen::Vector2i> edges;
97 for (
int i = 0; i < E.rows(); i++) {
98 edges.push_back(E.row(i));
100 for (
int i = 0; i < P.rows(); i++) {
101 edges.emplace_back(P(i), P(i));
104 if (!edges.empty()) {
105 MatrixXi E_combo(edges.size(), 2);
106 for (
size_t i = 0; i < edges.size(); i++) {
107 E_combo.row(i) = edges[i];
109 m_edge_bvh.init(V_3d, E_combo, 1e-6);
136 double min_sq_dist = std::numeric_limits<double>::max();
141 p3 << p(0), p(1), 0.0;
157 m_tri_bvh.nearest_facet(p3, closest_p, min_sq_dist);
161 m_edge_bvh.nearest_facet(p3, closest_p, tmp_sq_dist);
162 if (tmp_sq_dist < min_sq_dist) {
163 min_sq_dist = tmp_sq_dist;