我正在尝试使用CGAL进行一些3D布尔操作。我已成功将我的多面体转换为nef多面体。但是,当我尝试做一个简单的联合时,我在SM_overlayer.h的第286行得到一个断言失败:
CGAL error: assertion violation!
Expression : G.mark(v1,0)==G.mark(v2,0)&& G.mark(v1,1)==G.mark(v2,1)
File : ./CGAL/include/CGAL/Nef_S2/SM_overlayer.h
Line : 287
我尝试在文档中搜索“mark”。显然它是Nef_polyhedron_3上的一个模板参数,默认为bool
。但是文档也说它没有实现,你不应该搞乱它。我有点困惑为什么甚至有一个断言一些未实现的功能。我试着简单地说出断言,但它只会在稍后失败。
我正在使用以下内核和typedef,因为它是我能找到的唯一一个允许双重构建网格的例子。
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
我使用了与exe安装程序一起安装的CGAL 4.6.3。我也试过了4.7测试版,我得到了同样的例外(尽管在第300行)。
相关github问题:https://github.com/CGAL/cgal/issues/353
编辑:问题原来是网格。我使用的网格有自交。因此,即使is_valid,is_closed和is_triangular返回true,网格也可以转换为nef多面体。来自CGAL 4.7。引入了多边形网格处理包,其中包含this,可用于检查自交叉。