CGAL多面体布尔运算

环境配置

BOOST下载boost_1_68_0x64

CGAL下载CGAL4.7x64

CMake下载x64 64位

VS2015 x64

 

1.编译boost

(1)打开命令行窗口;

(2)输入cmd.exe,回车;

(3)将boost根目录下面的booststrap.bat文件直接拖到cmd.exe打开的界面并回车,

     运行结束后会产生b2.exe和bjam.exe,这里b2.exe是bjam.exe的新版本;

(4)运行b2.exe;

(5)编译完成。

环境变量:

BOOST_LIBRARYDIR =...\boost_1_68_0x64\lib64-msvc-14.0

BOOST_ROOT = ...\boost_1_68_0x64

 

2.编译CGAL

(1)运行下载好的CGAL.exe。

(2)安装cmake,运行cmake-gui,进行设置:

     其中"where is the source code"输入的就是下载的CGAL文件的根目录,

     “Where to build the binaries”,自己新建一个一个文件夹。

(3)在cmake-gui界面点击左下角:Configure;

     选择visual studio 14 2015 Win64;

     再次Configure,然后Generate.

 

3.VS2015生成

(1) 打开CGAL.sln,在Debug和Release模式下都运行一遍。

(2) VS项目测试,新建控制台项目。添加x64配置。

      ①在工程目录下新建include文件夹,include包含:

      放入...\boost_1_68_0x64\boost文件夹

      放入...\devx64\include\CGAL文件夹,

      并将...\devx64\build\include\CGAL的compiler_config.h文件放入CGAL文件夹。

      再将...\devx64\auxiliary\gmp\include下的gmp.h mpf2mpfr.h 和 mpfr.h 放入到include中

      在VS项目属性中添加库目录include

      ② 在工程目录下新建lib文件夹,lib包含:

      ...\boost_1_68_0x64\stage\lib 文件夹下的

      libboost_system-vc140-mt-gd-x64-1_68.lib

      libboost_system-vc140-mt-x64-1_68.lib

      libboost_thread-vc140-mt-gd-x64-1_68.lib

      libboost_thread-vc140-mt-x64-1_68.lib

      ...\devx64\build\lib 文件夹下的所有.lib 文件放入lib文件夹。

      ...\devx64\auxiliary\gmp\lib 文件夹下所有的.lib 和 .dll 文件放入到lib文件夹。

      ③...\boost_1_68_0x64\lib64-msvc-14.0 文件夹下的

      libboost_system-vc140-mt-gd-x64-1_68.dll

      libboost_system-vc140-mt-x64-1_68.dll

      libboost_thread-vc140-mt-gd-x64-1_68.dll

      libboost_thread-vc140-mt-x64-1_68.dll 放入到工程目录下(不是解决方案目录)。

      ...\devx64\build\bin 文件夹下的

      CGAL-vc140-mt-4.7.dll 和 CGAL-vc140-mt-gd-4.7.dll 放入到工程目录下。

 

多面体布尔运算流程

1.包含头文件,声明变量别名。

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>

#include <CGAL/Polyhedron_3.h>

#include <CGAL/Nef_polyhedron_3.h>

#include <CGAL/Polyhedron_incremental_builder_3.h>

#include <CGAL/IO/Polyhedron_iostream.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;

typedef CGAL::Polyhedron_3<Kernel>  Polyhedron;

typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron;

typedef Polyhedron::HalfedgeDS HalfedgeDS;

typedef HalfedgeDS::Vertex   CGALVertex;

typedef CGALVertex::Point CGALPoint;

typedef Polyhedron::Point_iterator Point_iterator;

typedef Polyhedron::Facet_iterator Facet_iterator;

typedef Polyhedron::Halfedge_around_facet_circulator Halfedge_facet_circulator;

 

2.输入数据,mesh结构的多面体数据,包含一个顶点数组和一个多边形顶点索引的二维数组,该数组的一个存储单元表示一个简单多边形。

struct VFMesh {

std::vector<CGALPoint> pointlist;//点;

std::vector<std::vector<int>> facelist;//面,保存面的点的索引;

};

 

3.将输入的多面体数据转化为CGAL的多面体结构CGAL::Polyhedron_3<Kernel>(半边结构),Polyhedron的实现用到了灵活性很高的半边数据结构,要求多边形表面是二维可定向流形(orientable 2-manifolds)。按照CGAL的官方教程,可以新建一个模板类,实现数据的转换。

template <class HDS>

class CgalPolyhedron : public CGAL::Modifier_base<HDS>

{

public:

CgalPolyhedron(VFMesh &mesh) : m_mesh(mesh) {}

void operator()(HDS& hds);

private:

VFMesh m_mesh;

};

最终的实现转换的函数接口为:(输入为mesh,输出为CGAL::Polyhedron

void mesh2polyhedron(VFMesh &mesh, Polyhedron &P);

 

4.CGAL中的Polyhedron并不能直接进行多面体的布尔运算,真正实现布尔运算的结构是CGAL::Nef_polyhedron_3<Kernel>(包含用于二元布尔运算所需要的结构信息),按照CGAL的官方教程,用Polyhedron来构造Nef_Polyhedron;Nef_Polyhedron重载了+,*,-运算符,分别表示并,交,差。

Polyhedron polyhedron1, polyhedron2, result;

Nef_polyhedron nef1(polyhedron1);

Nef_polyhedron nef2(polyhedron2);

Nef_polyhedron out = (nef2 + nef1);

布尔运算的结果仍为Nef_Polyhedron类型,调用Nef_Polyhedron的convert_to_polyhedron(Polyhedron)函数可以将Nef_Polyhedron转化回为Polyhedron。

out.convert_to_polyhedron(result);

然后通过接口函数 polyhedron2mesh将CGAL::Polyhedron_3<Kernel>转换为mesh。得到布尔运算的mesh结果:

void polyhedron2mesh(VFMesh &mesh, Polyhedron &P);

 

5.CGAL中有独立的模型输入输出文件系统,模型文件的类型是.off文件。通过.off文件可以直接初始化CGAL::Polyhedron_3<Kernel>(重载了输出输入运算符),不再需要mesh结构进行初始化。

//生成 .off 文件

Polyhedron polyhedron

std::ifstream fin2("data\\input.off", std::ios::in);

fin2 >> polyhedron;

fin2.close();

//生成 .off 文件

std::ofstream fout("data\\result.off", std::ios::out);

fout << polyhedron;

fout.close();

 

多面体布尔运算结果

输入数据

输入数据:圆锥
输入数据:立方体

运算结果输出

 

运算结果:并
运算结果:交
运算结果:差

 

 

 

输入:圆锥 

输入:立方体

运算结果:并 

运算结果:交

 运算结果:差

点集

1282

6146

189

502

510

面集

2560

6144

374

1000

1016

运行时间

\

\

3s

4s

4s

1.在CGAL中点的坐标值类型为double,可以表示双精度的坐标点。

2.在进行布尔运算时,两个原始多面体的包含空间必须有交集。

3.CGAL::Polyhedron_3<Kernel>类型的多面体的每个面可以是多边形的结构,但是转换为CGAL::Nef_polyhedron_3<Kernel>时会自动三角化,所以最后的运算结果是三角面片构成的多面体。

4.多面体模型经过平移和旋转,只要两个多面体仍然坐标统一并有空间交集,就可以进行二元的布尔预算。

两个原始多面体存在空间交集                                                                                      “并”运算的结果            

 

利用CGAL进行多面体的布尔运算可以保持很高的精度要求,无论是空间范围,还是坐标值的精度都可以满足常规的计算要求,但时间效率一般。

代码资源下载:https://download.csdn.net/download/hanfeidyx/10792922

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 布尔运算计算机图形学中一种常用的运算方式,可以对图形进行合并、交集、差集等操作。通过布尔运算,可以方便地对图形进行编辑、处理和分析,提高了图形处理的效率和灵活性。 孔洞是指一个封闭的几何图形中的空白区域,没有实际的几何形状。在计算机图形学中,处理孔洞是一项重要的任务。它可以用来处理有孔洞的图形,例如在二维图形中隧道、窗户等,以及在三维图形中的洞穴、空洞等。 CGAL(计算几何算法)是一个强大的计算几何算法,提供了大量的几何算法和数据结构,用于处理几何图形的建模和计算。CGAL包含了许多常用的布尔运算和孔洞处理算法,可以方便地对几何图形进行合并、分割、填补孔洞等操作。 在CGAL中,可以使用布尔运算来将多个几何图形合并为一个新的几何图形,或者计算两个几何图形的交集、差集等。此外,CGAL还提供了用于检测和处理孔洞的算法,可以准确地找到图形中的孔洞并进行填补或删除。 总之,布尔运算和孔洞处理在计算机图形学中具有重要的应用,而CGAL作为一个强大的计算几何算法,提供了丰富的算法和工具,可以方便地进行布尔运算和孔洞处理,从而实现对几何图形的灵活编辑和处理。 ### 回答2: 布尔运算是指将两个或多个图形形状进行逻辑运算的方法。这些图形形状可以是线段、多边形、曲线等,在进行布尔运算之后会得到新的图形形状。常见的布尔运算有并运算、交运算和差运算。 孔洞是指图形中的一个或多个区域被另一个图形包围,形成的空洞。在布尔运算中,我们可以使用孔洞来创建复杂的图形形状。例如,在几何计算CGAL中,可以通过使用布尔运算来创建凹多边形,其中包含一个或多个孔洞。 CGAL是计算几何算法的缩写,是一个功能强大的开源,提供了丰富的几何计算功能。它支持多种几何对象的表示和处理,包括点、线段、多边形等。CGAL中提供了各种布尔运算算法,可以进行复杂的几何操作,比如计算两个多边形的交集、并集和差集等。 通过使用CGAL中的布尔运算算法,我们可以方便地对图形进行编辑和处理。例如,我们可以使用CGAL来合并多个几何图形,删除或添加孔洞,从而生成所需的最终图形。这在各种领域中都有广泛的应用,如计算机图形学、地理信息系统、CAD等。 总之,布尔运算是一种用于逻辑处理图形形状的方法,而孔洞是指图形中被包围而形成的空洞。CGAL是一个功能强大的计算几何算法,提供了丰富的几何计算功能,可以进行各种布尔运算操作,包括孔洞的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值