环境配置
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
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
};
3.将输入的多面体数据转化为CGAL的多面体结构CGAL::Polyhedron_3
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
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
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();
多面体布尔运算结果
输入数据
运算结果输出
|
输入:圆锥 |
输入:立方体 |
运算结果:并 |
运算结果:交 |
运算结果:差 |
点集 |
1282 |
6146 |
189 |
502 |
510 |
面集 |
2560 |
6144 |
374 |
1000 |
1016 |
运行时间 |
\ |
\ |
3s |
4s |
4s |
1.在CGAL中点的坐标值类型为double,可以表示双精度的坐标点。
2.在进行布尔运算时,两个原始多面体的包含空间必须有交集。
3.CGAL::Polyhedron_3
4.多面体模型经过平移和旋转,只要两个多面体仍然坐标统一并有空间交集,就可以进行二元的布尔预算。
利用CGAL进行多面体的布尔运算可以保持很高的精度要求,无论是空间范围,还是坐标值的精度都可以满足常规的计算要求,但时间效率一般。
代码资源下载:https://download.csdn.net/download/hanfeidyx/10792922