多面体连续减去多个多面体



我想从多面体中减去多个(可能是数百个)多面体的结果。我发现CGAL库的"Nef多面体上的3D布尔运算";包支持多面体之间的布尔运算。我想用这个包来解决我的问题,但我遇到了很多麻烦。虽然我知道CGAL库很强大,但我对它完全陌生,不知道如何最有效地使用它来解决我的问题。我的目标是使用CGAL库实现一个多面体减去多个多面体,我将更详细地讨论这个问题以及我的方法和程序产生的错误。如果你能告诉我为什么程序会产生这些错误,以及我如何有效地使用CGAL库来实现一个多面体减去多个多面体,我将不胜感激。

我想用CGAL解决的问题:我用MATLAB得到一些多面体:A,B1,B2,...,Bi,..., Bn(n可能几百)。我想要得到A-B1-B2-...-Bn的结果

我用CGAL库解决这个问题的方法:事实上,只有A是二维流形,而Bi都是有边界的三维曲面。为了在Nef多面体上使用CGAL库的"三维布尔运算";包,我把这些表面变成封闭的多面体。我把A存为"。off "格式文件名为"blank.off"。它被转换为"。off"格式,所有Bi都保存在一个名为"sv.off"的文件中。每个Bi由换行符分隔。我用CGAL::OFF_to_nef_3()读取文件"blank.off&;转换为nef_多面体对象nef1。然后我写了一个循环语句,其中我使用CGAL::OFF_to_nef_3()读取文件"sv.off"插入nef_多面体对象nef2,并执行nef1-=nef2。

代码如下:

#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>
#include <CGAL/OFF_to_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;
#include<fstream>
#include<ctime>
int main() {
Polyhedron p1, p2, res;
int n = 0;
std::ifstream fin1("blank.off");
std::ifstream fin2("sv.off");
std::cout << "how many polyhedra in sv.offn";
std::cin >> n;
//load nef2 and do bool operations
Nef_polyhedron nef1(p1);
Nef_polyhedron nef2(p2);
CGAL::OFF_to_nef_3(fin1, nef1);
fin1.close();
for (int i = 0; i < n;i++) {
nef2.clear();
CGAL::OFF_to_nef_3(fin2, nef2);
fin2.get();
nef1 -= nef2;
std::cout << "A-B" << i+1 << " have been calculated" << std::endl;
}
//convert nef2 to res.off
nef1.convert_to_polyhedron(res);
std::ofstream fout("res.off");
fout << res;
//draw
//CGAL::draw(nef1);
fin2.close();
return 0;
}

您可以下载空白。走开,走开。从Github中删除文件。下载链接:空白。Off和v. Off

程序运行时出现的问题

  1. 在程序的第五次迭代(i==4)时,有时IDE将停止运行或崩溃,而不会抛出任何异常。为什么会出现这个问题?是因为内存使用率太高吗?
  2. 经过12个周期(i==11),我想将nef1转换为。off文件以保存当前结果。但是当程序到达句子"nef1.convert_to_polyhedron(res)"时失败,因为nef1.is_simple()返回false。我看了一下手册,我意识到这意味着nef1不再是一个2歧管。但是是什么导致nef1不再是2流形呢?在CGAL中是否有一个函数可以修改nef1使其再次成为2流形?
  3. 这不是错误,但是计算速度太慢了。有其他更快的方法吗?

其他问题:事实上,我最初使用MATLAB得到的是点集合对于无边界的多面体A和有边界的曲面B。为了对A和B进行布尔运算,我用MATLAB编写了一些程序对A和B进行三角化,并将B转化为闭多面体。我知道程序生成的三角网质量不高,这可能是出现这么多错误的主要原因。这些是否可以完全用CGAL库完成?怎么做呢?最重要的问题是CGAL库是否适合在三维几何上执行数百个连续布尔运算?

非常感谢你阅读这个问题,如果你能帮助我,我会很感激的。

在处理了您的输入之后,我可以说您的所有问题最合理的原因是您的输入不是很干净。如果你设法从sv中移除退化的面孔。关闭,一切应该运行正常。现在,有一种方法可以让一切变得更快:corefine_and_compute_difference。如果我调整你的代码来使用它,它看起来像:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Polygon_mesh_processing/corefinement.h>
#include <CGAL/draw_surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic;
typedef CGAL::Surface_mesh<Epic::Point_3>  Surface_mesh;
int main() {
std::cout << "how many polyhedra in sv.offn";
std::cin >> n;
std::ifstream fin1("data/blank.off");
std::ifstream fin2("data/sv.off");
//load nef2 and do bool operations
Surface_mesh s1, s2, out;
CGAL::IO::read_OFF(fin1, s1);
fin1.close();
for (int i = 0; i < n;i++) {
s2.clear();
CGAL::IO::read_OFF(fin2, s2);
fin2.get();
std::ofstream fout("s2.off");
fout << s2;
fout.close();
CGAL::Polygon_mesh_processing::corefine_and_compute_difference(s1, s2, s1);
std::cout << "A-B" << i+1 << " have been calculated" << std::endl;
}
//convert nef2 to res.off
std::ofstream fout("res.off");
fout << s1;
fout.close();
//draw
CGAL::draw(s1);
fin2.close();
return 0;
}

但是你必须确保你的sv网格是"干净的",例如,它们不能有退化的面。从第一个sv网格的形状来看,我想说你可以使用CGAL的推进前表面重建(这里的例子)从你的点集中得到你的网格,它们应该足够干净。(我试了第一个,效果很好)。

相关内容

  • 没有找到相关文章

最新更新