如何从3D曲面网格中删除自相交的三角形?

时间:2018-10-10 00:15:08

标签: c++ mesh cgal surface

我有一个带有一些自相交三角形的CGAL三角形surface_mesh,我试图将其删除以创建一个连续的2流形壳,最终用于打印。

我尝试使用remove_self_intersection()中的autorefine_and_remove_self_intersections()this answer。第一个仅删除一些自交点,而第二个完全删除我的网格。

因此,我正在尝试自己的方法-找到self-intersections,然后尝试删除它们。我尝试使用较低级别的remove_face,但之后无法检测到边框,因此无法填补所产生的漏洞。 This answer指的是使用更高级别的Euler remove_face,但是这种方法和make_hole似乎会完全丢弃我的网格物体。

这里是摘录(我正在使用break来查看是​​否可以去除至少一个三角形,而我只是尝试使用该对中的第一个):

    vector<pair<face_descriptor, face_descriptor> > intersected_tris;
PMP::self_intersections(mesh, back_inserter(intersected_tris));
for (pair<face_descriptor, face_descriptor> &p : intersected_tris) {
    CGAL::Euler::remove_face(mesh.halfedge(get<0>(p)), mesh);
    break;
}

Here是我尝试删除自交点之前的输出示例。

1 个答案:

答案 0 :(得分:0)

我删除自相交三角形的方法是积极删除相交面以及附近的面并填充生成的孔。感谢@sloriot的评论,我意识到Euler :: remove_face函数由于self_intersections和expand_face_selection函数返回的集合中的重复面孔而失败。

从这两个函数的向量结果中删除重复面孔的快速方法是:

std::set<face_descriptor> s(selected_faces.begin(), selected_faces.end());
selected_faces.assign(s.begin(), s.end());

此代码将面部向量转换为集合(集合不包含重复项),然后再次将集合转换回。

一旦删除重复项,Euler :: remove_face函数将正常工作,包括更新边界,以便可以在结果上使用triangulate_hole函数,从而生成没有自相交的最终曲面。