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 

#include 

#include 

#include 

#include 

#include 

#include 

typedef CGAL::Exact_predicates_inexact_constructions_kernel  Kernel;

typedef CGAL::Polyhedron_3<Kernel>  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::vectorvector<int>> facelist;//面,保存面的点的索引;

};

 

3.在进行凸包运算的时候使用的函数是

void CGAL::convex_hull_3(InputIterator first,  //点数组的头部

                     InputIterator last,  //点数组的尾部

                     PolygonMesh & pm,   //存放计算出的凸包结果

                     const Traits & ch_traits = Default_traits

)

VFMesh mesh; //存放模型的几何数据

Polyhedron poly; //存放凸包结果数据

//凸包计算

CGAL::convex_hull_3(mesh.pointlist.begin(), mesh.pointlist.end(), poly);

最后得到的凸包结果保存在poly多面体结构中。

 

4.通过接口函数 polyhedron2mesh将CGAL::Polyhedron_3转换为mesh。得到布尔运算的mesh结果:

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

 

5.CGAL中有独立的模型输入输出文件系统,模型文件的类型是.off文件。通过.off文件可以直接初始化CGAL::Polyhedron_3(重载了输出输入运算符)。

//生成 .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();

 

模型凸包运算结果

CGAL模型凸包运算_第1张图片 兔子模型的凸包计算结果
CGAL模型凸包运算_第2张图片 妖怪模型的凸包计算结果

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

2.CGAL::Polyhedron_3类型的多面体的每个面可以是多边形的结构,但是进行凸包运算时会自动三角化,所以最后的运算结果是三角面片构成的多面体。

 

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

你可能感兴趣的:(CGAL,CGAL,3D模型凸包计算,几何算法库,计算机图形,CGAL环境搭建)