将多面体对象转换为 Nef_polyhedron 对象

Converting Polyhedron object to Nef_polyhedron object

我想用CGAL库来计算两个多面体的布尔差值。两个多面体都是 .off 文件的形式。我的思路是先把这两个文件读入两个Polyhedron类型变量p1和p2,然后分别用p1和p2初始化Nef_polyhedron类型变量nef1和nef2,最后求nef1和nef2的布尔差值。 我的代码如下:

#include<fstream>

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>

#include <CGAL/Polyhedron_3.h>

#include <CGAL/Nef_polyhedron_3.h>

#include <CGAL/IO/Polyhedron_iostream.h>

#include <CGAL/draw_nef_3.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;

typedef CGAL::Polyhedron_3<Kernel>  Polyhedron;

typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron;

int main() {
    Polyhedron p1, p2, res;
    std::ifstream fin1("blank.off");
    std::ifstream fin2("svreal.off");
    fin1 >> p1;
    fin2 >> p2;
    fin1.close();
    fin2.close();

    Nef_polyhedron nef1(p1);
    Nef_polyhedron nef2(p2);

    Nef_polyhedron nef = nef1 - nef2;

    nef.convert_to_polyhedron(res);
    std::ofstream fout("res2.off");
    fout << res;
    return 0;
}

但是,当代码执行到“Nef_polyhedron nef2(p2);”时,抛出如下异常:boost::wrapexcept<boost::bad_any_cast>。这可能意味着用多面体对象 p2 构造 Nef_polyhedron nef2 时出错。但是我实在想不通为什么会出现这样的错误。多面体 p1 和 p2 都有效。当我打开文件 svreal.off 时它看起来不错,它是多面体对象 p2 的 .off 文件形式。 如果您能帮我解决这个问题,我将不胜感激。

您的输入“svreal.off”包含一些退化的面孔。您可以使用 CGAL/Polygon_mesh_processing/repair_degeneracies.h 中的 CGAL::Polygon_mesh_processing::remove_degenerate_faces() 删除它们,或者直接使用 istream 中的函数 OFF_to_nef_3()