【C++】开源:CGAL计算几何库配置使用
😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍CGAL计算几何库配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
- :smirk:1. 项目介绍
- :blush:2. 环境配置
- :satisfied:3. 使用说明
😏1. 项目介绍
项目Github地址:https://github.com/CGAL/cgal
CGAL(Computational Geometry Algorithms Library)是一个开源的计算几何算法库,它提供了一套丰富的数据结构和算法来解决各种计算几何问题。它是一个功能强大、可靠、高效且易于使用的库。
CGAL 提供了广泛的计算几何算法和数据结构,包括但不限于以下领域:
1.2D 和 3D 几何:CGAL 提供了各种数据结构和算法,用于处理二维和三维的点、线段、多边形、曲线、曲面等几何对象。它支持凸包计算、点定位、包围盒计算、空间分割等操作。
2.2D 和 3D 三角剖分:CGAL 实现了多种高质量的、高效的三角剖分算法。它支持 Delaunay 三角剖分、Voronoi 图计算、网格重构、约束三角剖分等操作。
3.2D 和 3D 网格生成与处理:CGAL 提供了用于生成和处理网格的算法和数据结构。它支持网格生成、网格布尔运算、网格修复、网格优化、封闭表面重构等操作。
4.几何优化:CGAL 实现了多个几何优化算法,用于求解几何优化问题,如最小凸包、最小旋转包、最长空间线段等。
5.多边形和非封闭曲线处理:CGAL 支持进行多边形布尔运算、多边形修复、多边形拟合、轮廓计算等操作。它还提供了对非封闭曲线的操作和处理。
6.曲面重建:CGAL 提供了多个用于重建曲面的算法,包括点云重建、隐函数重建、流形重建等。这些算法可用于从离散的点集生成平滑的曲面模型。
7.拓扑关系和空间搜索:CGAL 支持计算几何对象之间的拓扑关系,如相交、包含、相交点等。它还提供了用于空间搜索的数据结构和算法,如 kd-树、R 树等。
CGAL 使用 C++ 编写,具有良好的可扩展性和可移植性。它还与其他库和工具集成,在计算机图形学、计算机辅助设计、计算机辅助制造、机器人学、仿真和科学计算等领域得到了广泛应用。
😊2. 环境配置
下面进行环境配置:
apt安装的是老版本4.x,建议源码安装,这里我选的5.1.1.
# apt安装
sudo apt install libcgal-dev
# 源码安装
# 依赖
sudo apt install build-essential libboost-all-dev libgmp-dev libmpfr-dev libopencv-dev
从 `https://github.com/CGAL/cgal/releases/tag/v5.1.1` 下载zip
mkdir build
cd build
cmake -DCGAL_HEADER_ONLY=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALLED_PREFIX=../install ..
make
sudo make install
编译运行:
g++ -o main main.cpp -lCGAL -lgmp
./main
😆3. 使用说明
下面进行使用分析:
计算点集的凸包算法示例:
#include <iostream>
#include <vector>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
typedef std::vector<Point> PointVector;int main()
{// 创建点向量PointVector points, result;// 添加一些二维点到点向量中points.push_back(Point(1, 1));points.push_back(Point(2, 3));points.push_back(Point(4, 2));points.push_back(Point(3, 1));points.push_back(Point(2, 2));points.push_back(Point(3, 3));points.push_back(Point(3, 2));points.push_back(Point(5, 4));points.push_back(Point(5, 1));points.push_back(Point(4, 3));points.push_back(Point(4, 4));// 输出点向量std::cout << "点集 Points:" << std::endl;for (const auto &p : points){std::cout << "(" << p.x() << ", " << p.y() << ")" << std::endl;}// 计算点集的凸包CGAL::convex_hull_2(points.begin(), points.end(), std::back_inserter(result));// 确定绘制区域的边界框double min_x = result[0].x(); double max_x = result[0].x();double min_y = result[0].y();double max_y = result[0].y();// 输出凸包的点坐标std::cout << "凸包点 Convex Hull Points:" << std::endl;for (const auto &p : result){std::cout << "(" << p.x() << ", " << p.y() << ")" << std::endl;min_x = std::min(min_x, p.x());max_x = std::max(max_x, p.x());min_y = std::min(min_y, p.y());max_y = std::max(max_y, p.y());}// 在终端用ASCII字符简单绘制int width = static_cast<int>(max_x - min_x) + 1;int height = static_cast<int>(max_y - min_y) + 1;// 创建并初始化绘制区域std::vector<std::vector<char>> canvas(height, std::vector<char>(width, '.'));// 在绘制区域上绘制点for (const auto& p : result){int x = static_cast<int>(p.x() - min_x);int y = static_cast<int>(p.y() - min_y);canvas[y][x] = '#';}// 输出绘制结果std::cout << "绘制结果 #为凸包点: " << std::endl;for (int y = height - 1; y >= 0; --y){for (int x = 0; x < width; ++x){std::cout << canvas[y][x];}std::cout << std::endl;}return 0;
}
结果:
点集 Points:
(1, 1)
(2, 3)
(4, 2)
(3, 1)
(2, 2)
(3, 3)
(3, 2)
(5, 4)
(5, 1)
(4, 3)
(4, 4)
凸包点 Convex Hull Points:
(1, 1)
(5, 1)
(5, 4)
(4, 4)
(2, 3)
绘制结果 #为凸包点:
...##
.#...
.....
#...#

以上。
相关文章:
【C++】开源:CGAL计算几何库配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...
Redis分布式锁相关
Redis分布式锁实现Redisson 15问 分布式锁:Redisson源码解析-MultiLock、RedLock 看懂Redisson分布式锁源码,其实并不难...
Nginx环境搭建以及Docker环境部署
目录 Nginx环境搭建 1.首先创建Nginx的目录并进入 2.下载Nginx的安装包 可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包 没有wget命令的可通过yum命令安装 3.解压Nginx的压缩包 4.下载并安装Nginx所需的依赖库和包 安装方式一 安装方式二 --- 也…...
2023牛客暑期多校训练营7(C/I/M)
目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。 首先,由题…...
阿里云服务器手动搭建FTP教程(Windows操作系统)
阿里云百科介绍使用阿里云服务器搭建FTP教程,云服务器为Windows操作系统,当需要远程连接Windows实例进行文件传输时,可以通过搭建FTP站点实现。本文将介绍如何在Windows实例中搭建FTP站点。 目录 准备工作 步骤一:添加IIS以及F…...
idea+gradle阅读spring5.2.9源码之源码构建报错解决方案
注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8(gradle和jdk都要先安装好,gradle还要配置好本地资源文件路径) 2、原来项目乱了的话,先重新导入下载的源码项目 3、进入源码所在根目录&…...
一文详解Git
一. Git 概述 1.1 什么是 Git Git 是一个免费的、开源的分布式版本控制工具, 主要用于管理开发过程中的源代码文件,在软件开发过程中被广泛使用。通过Git仓库来存储和管理这些文件,Git仓库分为二种: 本地仓库:开发人…...
【单片机】DS2431英文手册,中文手册,翻译
DS2431是一款1024位的1-Wire EEPROM芯片,以每个256位的四个内存页面组织。数据被写入8字节的暂存区,经过验证,然后复制到EEPROM存储器中。作为一个特殊功能,四个内存页面可以单独地被写保护,或者被置于EPROM仿真模式&a…...
centos7部署openldap开启memberof并接入jumpserver
文章目录 前言1.yum安装openldap2.配置密码3.导入配置4.定义域5.配置memberof6.配置base dn7.安装phpldapadmin管理8.调整httpd的配置9.调整php的配置10.登陆php管理页面11.同步旧ldapsever用户数据(可省略)12.客户端配置13.对接jumpserver 前言 介绍如何在centos7上部署openl…...
Unity游戏源码分享-仿开心消消乐Match3Jewel
Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址: https://download.csdn.net/download/Highning0007/88198762...
知识图谱基本工具Neo4j使用笔记 四 :使用csv文件批量导入图谱数据
文章目录 一、系统说明二、说明三、简单介绍1. 相关代码以及参数2. 简单示例 四、实际数据实践1. 前期准备(1) 创建一个用于测试的neo4j数据库(2)启动neo4j 查看数据库 2. 实践(1) OK 上面完成后࿰…...
[bug修复]状态数据在useEffect初始化时更新无效
(bug修复类型的博客还是用汉语写捏) 前两天在做一个管理页面前端的时候,出现了这样的问题 function Son(props){const [a,seta]useState(0)useEffect(()>{seta(props.name)},[])return(<div>{a}</div>) } 这是当时情况的一…...
使用 API Gateway Integrator 在 Quarkus 中实施适用于 AWS Lambda 的 OpenAPI
AWS API Gateway 集成使得使用符合 OpenAPI 标准的 Lambda Function 轻松实现 REST API。 关于开放API 它是一个 允许以标准方式描述 REST API 的规范。 OpenAPI规范 (OAS) 为 REST API 定义了与编程语言无关的标准接口描述。这使得人类和计算机都可以发现和理解服务的功能&am…...
【JVM】JVM中的分代回收
文章目录 分代收集算法什么是分代分代收集算法-工作机制MinorGC、 Mixed GC 、 FullGC的区别是什么 分代收集算法 什么是分代 在java8时,堆被分为了两份: 新生代和老年代【1:2】 其中: 对于新生代,内部又被分为了三…...
C# Linq源码分析之Take方法
概要 Take方法作为IEnumerable的扩展方法,具体对应两个重载方法。本文主要分析第一个接收整数参数的重载方法。 源码解析 Take方法的基本定义 public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source…...
从后往前读取列表的方法
从后往前读取列表的方法 方法1:使用for循环遍历列表时,可以使用reverse()函数将列表反转,然后再遍历。 # 列表 num [0, 1, 2, 3]# 反向遍历 for i in reversed(num):print(i)输出结果: 3 2 1 0方法2:先计算列表长度…...
数据库--数据类型
数据库相关链接: 数据库基础操作--增删改查:http://t.csdn.cn/189CF 数据库--三大范式、多表查询、函数sql:http://t.csdn.cn/udJSG 数据类型 创建表的时候,我们在类型这里给出了不同的选项,比如有int ,…...
小型双轮差速底盘机器人实现红外跟随功能
1. 功能说明 本文示例将实现R023样机小型双轮差速底盘跟随人移动的功能。在小型双轮差速底盘前方按下图所示安装3个 近红外传感器,制作一个红外线发射源,实现当红外发射源在机器人的检测范围内任意放置或移动时,机器人能追踪该发射源。 2. 电…...
TCP协议网络编程 回显服务器,客户端实现
回显服务器表示客户端传来的请求是什么,服务器就回应什么,客户端不用对传来的数据进行处理,主要是为了熟悉TCP协议提供的API的使用 对于代码的解释全作为注释写在了代码上,推荐复制到编程软件中查看 UDP协议实现回显服务器可以看…...
3.4 Spring MVC注解
注解名称 注解说明 RequestMapping 用来处理请求地址映射的注解,可以在接口、类和方法上使用 value属性 表示请求地址,与path属性一致 method属性 表示接收HTTP请求方法,默认接收所有请求方法,请求包括GET、POST、PUT、DEL…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
