CGAL 介绍
CGAL 的全称是 Computational Geometry Algorithms Library,计算几何算法库。
它是使用 C++ 语言编写的开源软件,遵从 GPL & LGPL 双重开源协议。
它被广泛应用于几何计算相关的领域,提供众多计算几何相关的数据结构与算法诸如三角剖分,Voronoi 图,多边形,多面体,曲线整理及其应用,网格生成,几何处理,凸壳算法,搜索结构,插值,形状分析,拟合,距离等。当前版本 5.0。
C++ 编译器需求:要支持 C++ 14 及以上。
+ | - | - |
---|---|---|
Linux | GNU g++ 6.3 及以上 | Clang 8.0.0 |
MS Windows | GNU g++ 6.3 及以上 | MS Visual C++ 14.0/15.9/16.0 |
MacOS X | GNU g++ 6.3 及以上 | Apple Clang 7.0.2/10.0.1 |
直接依赖的软件/库有(针对 CGAL 5.0 版本):
+ | + | - |
---|---|---|
QT | v5.9.0 及以上 | 跨平台应用程序和 UI 框架。 |
CMake | v3.1 及以上 | 一个跨平台编译器 |
STL | - | C++ 标准模板库 |
Boost | v1.57 及以上 | “准”标准库 |
GMP | v4.2 及以上 | 开源多精度数学运算库,GNU Multiple Precision Arithmetic。 |
MPFR | v2.2.1 及以上 | 开源多精度数学运算库,GNU Multiple Precision Floating-Point Reliably。 |
可选的第三方拓展库。非必须,见附录。
安装配置步骤 :
qt-opensource-windows-x86-5.14.0.exe
boost_1_72_0.zip
CGAL-5.0-Setup.exe
cmake-3.16.2-win64-x64.msi
`C:\Users\XLong> gcc -v`
D:\CGAL\boost_1_72_0> bootstrap.bat gcc
D:\CGAL\boost_1_72_0> b2 --build-type=complete toolset=gcc stage
.pro
文件内添加INCLUDEPATH += D:\CGAL\boost_1_72_0\
然后写 main.cpp
,代码如下#include
#include
#include
using namespace boost;
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
timer t;
cout<<"max timespan:"<
得到结果是这样的就OK了max timespan:596.523
min timespan:0.001
now time elapsed:0.001
C:\Users\XLong> cmake -v
假设无法识别命令,手动添加环境变量 D:\CGAL\CMake\bin 。test.cpp
内代码如下// test.cpp
#include
using namespace std;
int main()
{
cout<<"Hello Cmake!"<
CMakeLists.txt
代码如下# CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(test)
set(SOURCE test)
add_executable(${PROJECT_NAME} ${SOURCE})
然后 CMD 进入该目录相继执行执行,注意那个 . 点D:\CGAL\CMake\CmakeTest> cmake -G "MinGW Makefiles" .
D:\CGAL\CMake\CmakeTest> mingw32-make
最后执行,看到该目录下多了一个 test.exe
,点开有 Hello 就对了。打开图形界面 D:\CGAL\CMake\bin\cmake-gui.exe ,填写
然后。
-> Configure ,(弹出创建 /Build 文件夹选确定)
-> 选择 MinGW Makefiles -> Use default native compilers -> Finish
如果出现这种错误,一定是找不到对应点路径。不出错直接看 4
CMake Error at D:/CGAL/CMake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
Could NOT find Boost (missing: Boost_INCLUDE_DIR) (Required is at least version 1.48 )
还可能出现这种错误,一定是找不到对应点路径。不出错直接看 4
CMake Error at D:/CGAL/CMake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
Could NOT find Boost (missing: thread system) (found suitable version "1.72.0", minimum required is "1.48")
D:/CGAL/boost_1_72_0/stage/lib/libboost_atomic-mgw73-mt-sd-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_atomic-mgw73-mt-s-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_chrono-mgw73-mt-sd-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_chrono-mgw73-mt-s-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_date_time-mgw73-mt-sd-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_date_time-mgw73-mt-s-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_system-mgw73-mt-sd-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_system-mgw73-mt-s-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_thread-mgw73-mt-sd-x64-1_72.a
D:/CGAL/boost_1_72_0/stage/lib/libboost_thread-mgw73-mt-s-x64-1_72.a
Genernate 后将会出现下面的提示,查看 *D:\CGAL\CGAL-5.0\Build* 目录看到新生成很多 .cmake
文件。
Configuring done
Generating done
CMD 进 D:/CGAL/CGAL-5.0/Build/ 目录,执行
D:\CGAL\CGAL-5.0\Build> cmake .
D:\CGAL\CGAL-5.0\Build> mingw32-make
D:\CGAL\CGAL-5.0\Build> mingw32-make install
查看 D:/CGAL/CGAL-5.0/CGAL/ 目录生成文件。
测试一下
创建 QT 控制台应用程序,命名为 CGALTest
,然后在 CGALTest.pro
中添加代码如下
INCLUDEPATH += D:/CGAL/CGAL-5.0/include/
INCLUDEPATH += D:/CGAL/boost_1_72_0/
main.cpp
代码如下
#include
#include
#include
typedef CGAL::Simple_cartesian Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
typedef Kernel::Segment_2 Segment_2;
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Point_2 p(1, 1), q(10, 10);
cout << "p = " << p <
编译运行如下就对了
p = 1 1
q = 10 10
sqdist(p,q) = 162
m = 5 9
sqdist(Segment_2(p,q), m) = 8
p, q, and m make a left turn
midpoint(p,q) = 5.5 5.5
Tips: 如果QT编译运行出现错误如下
'enable_if_t' in namespace 'std' does not name a template type
inline std::enable_if_t::value,std::size_t>
^~~~~~~~~~~
D:\CGAL\CGAL-5.0\include\CGAL\Kernel\hash_functions.h:174: error: 'enable_if_t' in namespace 'std' does not name a template type
检查 GCC版本 ,std::enable_if**_t** 是C++14 才支持的写法, C++11 为std::enable_if 打开 CGALTest.pro
。将
CONFIG += c++11
改成
CONFIG += c++14
CMake Error at D:/CGAL/CMake/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
Could NOT find Boost (missing: Boost_INCLUDE_DIR) (Required is at least version "1.48")
.cmake
文件Configuring done
Generating done
D:\CGAL\CGAL-5.0\examples\Triangulation_2\Build> cmake .
D:\CGAL\CGAL-5.0\examples\Triangulation_2\Build> mingw32-make
D:\CGAL\CGAL-5.0\examples\Triangulation_2\Build\draw_triangulation_2.exe
看得到一个控制台和空白的窗口。D:\CGAL\CGAL-5.0\examples\Triangulation_2\Build\ui_ImageInterface.h
D:\CGAL\CGAL-5.0\CGAL\include\CGAL\Qt\ui_ImageInterface.h
D:\CGAL\CGAL-5.0\examples\Triangulation_2\Build\libCGAL_Qt5_moc_and_resources.a
D:\CGAL\CGAL-5.0\CGAL\lib\libCGAL_Qt5_moc_and_resources.a
DrawTriangulation3d
,然后在 DrawTriangulation3d.pro
中添加代码如下QT += widgets
QT += xml
QT += opengl
CONFIG += c++14 console
LIBS += -LD:\CGAL\CGAL-5.0\CGAL\bin\ -lCGAL_Qt5
INCLUDEPATH += D:\CGAL\CGAL-5.0\include
INCLUDEPATH += D:\CGAL\boost_1_72_0
main.cpp
代码如下#include
#define CGAL_USE_BASIC_VIEWER
#include
#include
#include
#include
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_3 DT3;
typedef CGAL::Creator_uniform_3 Creator;
int main()
{
std::vector points;
CGAL::Random_points_in_sphere_3 g(1.0);
std::copy_n(g, 50, std::back_inserter(points));
DT3 dt3(points.begin(), points.end());
CGAL::draw(dt3);
return EXIT_SUCCESS;
}
编译运行成功就对了。非必须,CGAL 的部分 Demos & Examples 会用到。(针对 CGAL 5.0 版本):
+ | + | - |
---|---|---|
Eigen | v3.1 及以上 | 支持线性代数,矩阵和矢量运算,数值分析及其相关的开源算法库。 |
LEDA | v6.2 及以上 | 数据结构和算法的库,提供实数数据类型。 |
MPFI | v1.4 及以上 | 提供任意精度的区间算法,使用Mpfr可靠的浮点数表示区间。 |
RS / RS3 | - | 用于研究具有有限个复根的多项式系统的实根。 |
NLT | v5.1 及以上 | 提供带符号的任意长度整数、整数上的向量、矩阵和多项式以及有限域上的数据结构和算法。 |
ESBTL | - | 用于生物结构研究的库,在CGAL中有构建3D皮肤表面网格的实例。 |
TBB | - | Threading Building Blocks,用于并行计算。 |
LASlib | - | 处理以LAS格式存储的激光雷达数据集。 |
OpenCV | - | 计算机诗句库。 |
TensorFlow | - | 机器学习 & 深度学习。 |
METIS | v5.1 及以上 | 划分图和生成减少填充矩阵排序的库。 |
zlib | - | 数据压缩。 |
Ceres Solver | - | 建模和优化。 |
GLPK | - | 解决线性规划(LP)、混合整数规划(MIP)和其他相关问题。 |
SCIP | - | 混合整数规划(MIP)和混合整数非线性规划(MINLP)。 |
安装 Boost 执行 bootstrap.bat gcc
命令后会在根目录下生成 b2.exe 文件(老版本中还有biam.exe, b2是bjam的升级版)。
build-type
选择构建集合,可选 minimal | complete , 默认为 minimal 。
toolset
指定编译器,可选的如 borland / gcc / msvc-14.0,如果不指定会自动搜索本地可用的编译器。
stage / install
stage 表示只生成库, install 还会生成包含头文件的 include目录. 推荐使用 stage ,因为 install 生成的 include 目录实际就是源码包下的 boost 目录, 需要 include 的时候可以直接使用, 不需要再次生成,这样可以节省大量的编译时间.
with / without
选择不编译/编译哪些库(类似于黑名单/白名单)。with / without 参数可以多次出现,以限定多个库。如果不设置 with / without 参数,默认全部编译。例如,
--with-python
的含义是仅编译 python,其他的都不编译。
--without-python
意思就是除了 python, 其他的都编译。
查看Boost包含的所有库命令 b2.exe --show-libraries
stagedir / prefix
stage 时使用 stagedir,install 时使用 prefix,表示编译生成文件的路径。推荐给不同的编译环境指定不同的目录,如 Visual Studio 2015 的 x86 应用对应的是 bin/lib32-msvc-14.0,x64 应用对应的是 bin/lib64-msvc-14.0。如果都生成到一个目录下,将没有任何益处,徒增管理难度。如果使用了 install 参数,那么还将在上述指定的目录下生成 include 目录,用于保存头文件。
build-dir
编译生成的中间文件的路径,默认是 Boost 根目录下的 bin.v2 目录,一般无需设置。
link
指定生成静态链接库还是动态态链接库,取值为 static | shared。如不指定,默认使用 static 。推荐使用静态库的方式编译 Boost.python,这样发布程序的时候就不用 Boost 的 dll 了,并且也多占用不了太多空间。
runtime-link
指定运行时是动态还是静态链接其他库。同样有 shared 和 static 两种方式。如果不指定,默认是 shared,一般无需设置。
threading
要编译的库是单线程还是多线程,可取值 single | multi。如果不指定,默认是 multi ,一般无需设置。
variant
debug | release,编译 debug 版本还是 release 版本。一般与最终发布的程序是 debug 还是 release 版相对应。如果不指定,默认两个都编译,一般无需设置。
address-model
编译成 32 位版本还是 64 位版本,可取值 32 | 64。如果不指定,默认两个版本都编译。如果是编译 Boost.python,该参数就要与本地安装的 Python 位数相对应,否则编译会出错,因此最好设置一下。
从文件名中看Boost文件信息,例如有文件如下,以 - 分割属性。
libboost_thread-mgw73-mt-d-x64-1_72.dll
[1] https://blog.csdn.net/baidu_41231410/article/details/82806136
[2] https://blog.csdn.net/zhangzq86/article/details/90030094
[3] https://blog.csdn.net/leftwillow/article/details/82793641
[4] https://blog.csdn.net/keneyr/article/details/90033858
[5] https://doc.cgal.org/latest/Manual/index.html
.
.
.
.
.
.
桃花仙人种桃树,又摘桃花换酒钱_