我正在尝试使用 CGAL 4.13 和以下代码片段对多面体的面进行三角测量,该代码片段在标准输入上采用 OFF 格式的多面体定义文件:
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
using namespace std;
int main (void) {
Polyhedron p;
cin >> p;
if (!CGAL::Polygon_mesh_processing::triangulate_faces(p))
cerr << p << endl << "Triangulation failed!" << endl;
}
但是,我观察到以下警告:
CGAL 警告:检查违规!表达式:false 文件:/usr/include/CGAL/Constrained_triangulation_2.h 行:902 说明:您使用的是精确数字类型,使用 Constrained_triangulation_plus_2 类将避免级联交集计算并且效率更高 此消息仅在没有 CGAL_NO_CDT_2_WARNING 时显示定义。
并且三角测量失败。消息Triangulation failed!
和多面体定义一样被打印出来,它清楚地显示了一些具有 5 个甚至 7 个顶点的面。
不幸的是,多面体的 OFF 表示为 8070 行,我未能创建一个更小的示例来重现该问题。所以我把它上传到这里。它在那里只能使用 30 天,如果有人可以建议一个更好的上传位置,我会考虑的。
编译后,例如
g++ -O3 tri.cpp -o tri -lCGAL -lgmp -lmpfr -Wall
该问题可以通过
./tri < poly.off
我不确定三角测量的失败是否与警告有关;我怎么能用这个Constrained_triangulation_plus_2
类CGAL::Polygon_mesh_processing::triangulate_faces()
呢?这可能吗?人脸三角剖分不是什么复杂的事情,这怎么可能一开始就失败呢?