如何从 3D 曲面网格中删除自相交三角形?
How do I remove self-intersecting triangles from a 3D surface mesh?
我有一个三角形的CGAL surface_mesh,上面有一些自相交的三角形,我试图将其删除以创建一个连续的2流形壳,最终用于打印。
我试图从这个答案中使用remove_self_intersection((和autorefine_and_remove_self_intersections((。第一个只删除了一些自相交点,而第二个完全删除了我的网格。
所以,我正在尝试自己的方法 - 我找到自交集,然后尝试删除它们。我尝试使用低级remove_face但之后无法检测到边界,因此我无法填充生成的孔。这个答案指的是使用更高级别的欧拉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;
}
我删除自相交三角形的方法是积极删除相交面以及附近的面并填充生成的孔。多亏了@sloriot的评论,我意识到欧拉::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 函数可用于生成没有自相交的最终曲面的结果。
相关文章:
- 如何在自删除后将对象设置为nullptr
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何使用 C 指针的自定义删除器创建unique_ptr?
- 如何从 3D 曲面网格中删除自相交三角形?
- 在地图中使用自定义删除器存储unique_ptr
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 在unique_ptr<>中使用自定义删除程序 (curl_formfree())
- C++自定义删除运算符不能正常工作?
- 从自定义数据类型向量中删除重复元素
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 如何删除Qt设计器中自定义插件的QString属性的"translatable"复选框?
- 如何在我的类unique_ptr中提供自定义删除器?
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 无法删除自定义类的堆实例 (C++)
- 无法从 QVBoxLayout 中删除自定义 QWidget
- 删除自定义双链表
- 如何在gtkmm中删除自定义TreeModel中的user_data