【C++】CGAL学习笔记

article/2025/9/21 13:04:51

一、HELLO WORLD

1. 官方文档:CGAL-TUTORIALS

2. 所有`CGAL`头文件都在子目录中。所有`CGAL`类和函数都在命名空间中。类以大写字母开头,全局函数以小写字母开头,常量全部大写

3. 几何图元,如点、线等都定义在内核`Kernel`

#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
/*
- `Point_2()`:一个2d的点
- `Segment_2`:一个2d的扇形,若只有两点,则为直线
- `CGAL::squared_distance(p, q)`:两点距离or点到直线的距离
- `CGAL::orientation(p, q, m)`:三点是否共线,若不共线,则m在p,q哪一侧
- `CGAL::midpoint(p, q)`:中点坐标
*/
int main()
{Point_2 p(1, 1), q(10, 10);std::cout << "p = " << p << std::endl;// p = 1 1std::cout << "q = " << q.x() << " " << q.y() << std::endl;// q = 10 10std::cout << "sqdist(p,q) = "<< CGAL::squared_distance(p, q) << std::endl;// sqdist(p,q) = 162Segment_2 s(p, q);Point_2 m(5, 9);std::cout << "m = " << m << std::endl;// m = 5 9std::cout << "sqdist(Segment_2(p,q), m) = "<< CGAL::squared_distance(s, m) << std::endl;// sqdist(Segment_2(p,q), m) = 8std::cout << "p, q, and m ";switch (CGAL::orientation(p, q, m)) {case CGAL::COLLINEAR:std::cout << "are collinear\n";break;case CGAL::LEFT_TURN:std::cout << "make a left turn\n";break;case CGAL::RIGHT_TURN:std::cout << "make a right turn\n";break;} // p, q, and m make a left turnstd::cout << " midpoint(p,q) = " << CGAL::midpoint(p, q) << std::endl;// midpoint(p,q) = 5.5 5.5return 0;
}

4. 对于浮点数而言,会出现结果不精确的问题,这时采用如下内核:

#include <iostream>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;

5. 凸包:在高维空间中有一群散布各处的点,凸包是包覆这群点的所有外壳当中,表面积or容积最小的一个外壳,而最小的外壳一定是凸的。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
#include <vector>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef std::vector<Point_2> Points;
int main()
{Points points, result;points.push_back(Point_2(0, 0));points.push_back(Point_2(10, 0));points.push_back(Point_2(10, 10));points.push_back(Point_2(5, 6));points.push_back(Point_2(4, 1));CGAL::convex_hull_2(points.begin(), points.end(), std::back_inserter(result));std::cout << result.size() << " points on the convex hull" << std::endl;for (int i = 0; i < result.size(); i++) {std::cout << result[i] << std::endl;}return 0;
}
/*
4 points on the convex hull
0 0
10 0
10 10
5 6
*/

二、在GIS上的应用(未完)

1. 数据结构

   - TIN:三角化不规则网络,一种 2D 三角结构,可根据 3D 点在水平面上的投影连接 3D 点。

   - DSM:数字表面模型,整个扫描表面的模型,包括建筑物和植被。我们使用 TIN 来存储 DSM。

   - DTM:数字地形模型,裸露地面的模型,没有建筑物或植被等物体。我们都使用 TIN 和栅格来存储 DTM。

   - DEM:数字高程模型,一个更通用的术语,包括 DSM 和 DTM。

2. delaunay三角剖分

一个小demo:(源码位置->CGALlearn(github))

#include<vector>
#include<algorithm>
#include<CGAL/point_generators_2.h>
#include<CGAL/algorithm.h>
#include<CGAL/random_selection.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include<CGAL/Delaunay_triangulation_2.h>
#include <CGAL/draw_triangulation_2.h>using namespace CGAL;typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point;
typedef Creator_uniform_2<double, Point> Creator;
typedef std::vector<Point> Vector;
typedef CGAL::Delaunay_triangulation_2<Kernel> Delaunay;
typedef Delaunay::Vertex_handle Vertex_handle;int main() {Vector points;points.reserve(10);Random_points_in_disc_2<Point, Creator> g(150.0);CGAL::cpp11::copy_n(g, 10, std::back_inserter(points));Delaunay dt;dt.insert(points.begin(), points.end());CGAL::draw(dt);system("pause");return EXIT_SUCCESS;
}

在QT5中编译出来的效果为:

 三、配置VS 2022+vcpkg+cmake 3.24.0+Qt 5.15.2

1. 前言

这一部分是记录本人在配置环境时遇到一些坑以及查询到的诸多资料,在此作为一个记录,以便日后查阅。

2. 关于vcpkg

vcpkg是微软推出的一款C++的包管理器,便与相关工作者安装与卸载库。

具体安装方法见下文:vcpkg安装指南

常用的命令有:

集成到全局:vcpkg integrate install
移除全局:vcpkg integrate remove
集成到工程:vcpkg integrate project
查看库目录:vcpkg search xxxx
查看支持的架构:vcpkg help triplet
指定编译某种架构的程序库:vcpkg install xxxx:x64-windows(x86-windows)
卸载已安装库:vcpkg remove xxxx
指定卸载平台:vcpkg remove xxxx:x64-windows
移除所有旧版本库:vcpkg remove --outdated
查看已经安装的库:vcpkg list
更新已经安装的库:vcpkg update xxx
导出已经安装的库:vcpkg export xxxx --7zip(–7zip –raw –nuget –ifw –zip)

 需要注意的一点是,如果下库出现时间过长,或者下载报错,一般通过科学上网可以解决。

3. 关于Qt 5.15.2

如果只使用CGAL+VS 2022,代码能跑,但是如果涉及到图形时,会报如下错误:

Impossible to draw, CGAL_USE_BASIC_VIEWER is not defined.

在官方文档里也指出:

 在下Qt的时候需要注意一点,Qt5.15版本只能通过在线下载的方式下载,而在2022/8/1日的版本中,一般的latest和preview是没有5.15的,只有6.2及以上版本,这时通过点击Archieve即可获取旧版本的下载,勾选MSVC 2019 64-bit即可(32-bit以防有x86的程序)

4. 关于CMake 3.24.0

一言简之,CMake的使用方法:

建立CMakeLists.txt -> CMake(GUI)configure+generate -> VS 2022 生成 ALL BUILD

我的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.24.0) #最低版本cmake#设置vcpkg路径
set(VCPKG_ROOT "L:/cpplib/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE PATH "")
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT})
# 项目名
project(main)
# 找包
find_package(CGAL REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Qt5)
# 如果没找到就加路径
if(CGAL_Qt5_FOUND)add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS)
endif()
# 编译cpp
create_single_source_cgal_program("random_point_2d_delaunay.cpp")# Qt5配置
if(CGAL_Qt5_FOUND)# 连接仓库,第一个参数(random_point_2d_delaunay)是我们的目标cpp文件,这里放你的cpp即可target_link_libraries (random_point_2d_delaunay PUBLIC CGAL::CGAL_Qt5)target_link_libraries (random_point_2d_delaunay PUBLIC CGAL::CGAL_Basic_viewer)
else()message(STATUS"NOTICE: The example main requires Qt and drawing will be disabled.")
endif()

需要修改的地方:cmake的最低版本、vcpkg的路径、cpp的名称(三处)

然后再打开cmake(GUI),先点击configure,若无报错,再点击generate即可。

 找到sln文件,双击打开,右键ALL BUILD生成即可:

 5. 可能遇到的报错

 5.1 CGAL NOT FOUND

因为使用vcpkg下库,所以诸如cgal的路径未直接添加至环境变量当中,因此只需CMakeLists.txtfind_package前添加如下代码即可:

set(VCPKG_ROOT "L:/cpplib/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE PATH "")
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT})

前提是要确定自己vcpkg.cmake的路径。

5.2 “QT”:不明确的符号

右键对应的cpp -> 属性 -> 配置属性 -> 常规 -> c++语言标准 

改为C++20即可。

 


http://chatgpt.dhexx.cn/article/YMt0vmbS.shtml

相关文章

自动化测试方案设计和实现

编辑推荐: 本文主要介绍了几种测试类型需求&#xff0c;以及自动化测试方案设计和实现&#xff0c;希望对您的学习有所帮助。 本文来自于知乎&#xff0c;由火龙果软件Alice编辑、推荐。 如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以8101198…

测试方案模板

&#xff08;iwebshop项目&#xff09;测试方案 &#xff08;仅供参考&#xff09; 文档版本控制 文档版本号 日期 作者 审核人 说明 V1.0 2017/11/24 陈.. 创建文档 1. 概述 【软件的错误是不可避免的&#xff0c;所以必须经过严格的测试。通过对…

测试方案/测试计划/测试报告,经常弄混要怎么区分?

目录 前言 1、测试方案和测试计划的区别 2、测试方案和测试计划什么时候编写 3、测试方案 4、测试计划 5、测试报告 前言 测试方案和测试计划&#xff0c;测试报告几乎都是每个测试人员都必须掌握的。但有时经常搞混&#xff0c;特别是测试方案和测试计划。 1、测试方案…

自动化测试方案

自动化测试体系方案 方案1全编写代码流程 UI自动化&#xff1a; 使用python或java&#xff0c;配合selenium库及pytest框架做UI自动化测试。&#xff08;通过selenium的webdriver驱动&#xff0c;驱使浏览器&#xff09; 1. WebDriver API&#xff08;基于Java、Python&…

SpringBoot - 应用程序测试方案

文章目录 PreSpring Boot 中的测试解决方案测试 Spring Boot 应用程序初始化测试环境SpringBootTestSpringBootTest - webEnvironment RunWith 注解与 SpringRunner 执行测试用例使用 DataJpaTest 注解测试数据访问组件Service层和Controller的测试使用 Environment 测试配置信…

测试计划和测试方案有什么区别?

一、测试计划 1、测试计划是什么&#xff1f; 测试计划是组织管理层面的文件&#xff0c;从组织管理的角度对一次测试活动进行规划。对测试全过程的测试范围、组织、资源、原则等进行规定和约束&#xff0c;并制定测试全过程各个阶段的任务分配以及时间进度安排&#xff0c;并…

测试方案的设计及模板

测试方案设计及模板 测试方案设计概括xx测试方案_模板1.引言2.测试策略3.测试设计4.测试资源5.输出文档6.修订记录推荐书籍 测试方案设计概括 xx测试方案_模板 1.引言 1.1目的 根据需要实现的需求与软件的设计架构&#xff0c;设计满足测试目标的方案&#xff0c;用来指导测试…

软件测试方案设计

文章目录 1、软件框架2、测试方案设计2.1、测试覆盖2.2、功能测试和压力测试2.3、自动化测试2.4、持续集成 1、软件框架 站在软件的角度&#xff0c;一个系统通常可以分为以下四个层次&#xff1a; 应用软件层(app layer)。用户重点自己开发的应用代码&#xff0c;例如我们的运…

又发现个新的全网资源搜索神器

平常用谷歌百度搜资源一个个翻很费劲&#xff0c;这里分享几个最新可用的全网网盘资源搜索神器&#xff0c;在公众号苏生不惑后台回复神器 获取软件下载地址。 混合盘 这个app聚合搜索多个网盘资源&#xff0c;可从数十个网盘搜索网站中检索出你需要的资源&#xff0c;app非常简…

magnetX,资源搜索神器!老司机快上车!

magnetX 中文版是一款非常好用的资源搜索神器&#xff0c;界面干净简洁并且不会有弹窗。而且可以通过关键字搜索&#xff0c;或者网址过滤这两种方式快速找到你想要的资源&#xff0c;并且还能配合WebTorrent在线播放&#xff0c;还可以配合下载工具进行一键下载资源&#xff0…

【森林SOU】小巧绿色版搜索神器

种子搜索神器是一款基于P2P技术的资源搜索软件&#xff0c;搜索神器有很多&#xff0c;其实下面为大家带来的这个搜索工具就很不错&#xff0c;小巧功能强大无需安装&#xff0c;这里有着十分全面的资源可以自由搜索&#xff0c;下载也没有什么速度限制&#xff0c;十分便捷&am…

2014 三款强大搜片神器 | 各种视频资源 | 电影电视剧搜索

您还在百度上搜索电影吗&#xff0c;即浪费时间有累眼睛&#xff0c;并且还经常找到的不是自己想要的资源(某位仁兄下来了几个G的葫芦娃~~)。 亲们的福音来了。三款超强大的搜索下载看片软件很适合你。 只要有了他们&#xff0c;找神马资源都会变的轻松&#xff0c;So Easy~~ 下…

分享几个好用的百度网盘搜索引擎

与大家分享几个好用的网盘搜索神器&#xff0c;方便大家搜索百度云网盘分享的资源文件。&#xff08;已测试&#xff0c;目前都可用&#xff09; 一、 盘搜 http://www.pansou.com/ 网站简洁&#xff0c;搜索即可出来结果&#xff0c;点击搜索结果就能跳转。 二、 飞鱼盘搜 h…

吊打本地搜索神器everthing,最快 最强的电脑本地搜索神器!

Windows的小伙伴应该都对Windows资源管理器 自带的『文件搜索功能』说一句“垃圾” 全盘搜索一个文件居然需要几十秒 而为了解决Windows搜索慢的问题 不少小伙伴应该都用过或者听说过『Everything』这个软件 不论磁盘空间多大、存有多少文件 Everything都能以毫秒级的速度搜…

推荐一些非常好用的网盘搜索神器

网盘工具的兴起&#xff0c;大多数的用户会在网盘上分享自己的资源。那么如何快速的在网盘上找到你想要的资源呢 ? 而今天推荐的就是一些网盘搜索引擎&#xff0c;它可以使我们快速搜搜索到自己想要的资源&#xff0c;从而提高了整体的搜索效率。下面将介绍一些搜索引擎&#…

easySearch:一款聚合资源搜索神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 大家好&#xff0c;我是免费哥。 今天给大家带来的资源是&#xff1a;资源聚合搜索神器easySearch 资料简介 这是一款Chrome浏览器插件&#xff0c;支持主流链接…

资源搜索引擎

1.DogeDoge搜索引擎&#xff1a;https://www.dogedoge.com/ 不追踪&#xff0c;不误导。 2.秘迹搜索&#xff1a;https://mijisou.com/ 这是一个 不追踪 你的搜索引擎 3.小白盘&#xff1a;https://www.xiaobaipan.com/ 4.云盘精灵&#xff08;资源搜索&#xff09;&#xf…

各大网盘搜索资源神器免费送!!!

文章目录 百度网盘资源搜索神器系列1、盘多多&#xff1a;http://www.panduoduo.net/2、盘搜&#xff1a;http://www.pansou.com/3、盘搜搜&#xff1a;http://www.pansoso.com/ 百度网盘资源搜索神器系列 给经常玩百度网盘的玩家推荐微信公众号&#xff1a;性感的小君君 提供…

黑科技丨资源搜索神器

黑科技丨资源搜索神器 黑科技丨资源搜索神器 资源整合网站 网盘搜索学术搜索数据搜索 影视资源 前言&#xff1a;本文向读者推荐各种好用的资源搜索神器。 资源整合网站 网盘搜索 资源搜索&#xff1a;一款集合各大搜索于一身的搜索网站&#xff0c;如一网打尽、56网盘、水滴等…

网盘资源搜索神器,只有你想不到没有你搜不到的,老司机必备!

1. 盘搜搜 http://www.pansoso.com/ 非常老牌的一个搜索网站&#xff0c;搜出来的资源大部分都能用。而且资源也比较全&#xff0c;很多想要的都能快速找到。 2. 胖次 https://www.panc.cc/ 专业的网盘资源搜索工具&#xff0c;涵盖了视频、音乐、图片、小说以及APP等不同类…