当前位置: 首页 > news >正文

凸包问题 Graham 扫描算法 MATLAB

算法要解决的问题

Graham 扫描算法要解决的问题是在给定一组二维平面上的点集时,找出能够完全包含这些点的最小凸多边形,这个最小凸多边形就是这些点的凸包。在很多实际场景中,我们可能只关注一个点集的最外层边界,而凸包算法就可以帮助我们高效地确定这个边界。

例如,在计算机图形学里,为了减少碰撞检测的计算量,会用凸包来近似表示一个复杂图形的边界;在地理信息系统中,计算一些地理区域内离散点的凸包,能够快速确定这些区域的大致范围;在机器人路径规划方面,凸包可以用来定义机器人可活动区域的边界。

凸包算法的定义

凸包算法是一类用于计算点集凸包的算法。凸包在二维平面上可以直观地理解为:想象在平面上钉了许多钉子,这些钉子代表给定的点集,然后用一根橡皮筋把所有钉子都套住,当橡皮筋收紧后,它所形成的形状就是这些钉子(点集)的凸包。

从数学定义来讲,对于一个点集 S,其凸包是包含 S 的最小凸集。所谓凸集,是指对于集合内任意两点 A 和 B,连接这两点的线段上的所有点都在该集合内。

凸包算法的目的就是通过特定的计算步骤,从给定的点集中找出那些构成凸包边界的点,并且按照一定的顺序(通常是顺时针或逆时针)将这些点连接起来,形成一个封闭的凸多边形。常见的凸包算法除了 Graham 扫描算法,还有 Jarvis 步进法、QuickHull 算法等,不同算法在时间复杂度、空间复杂度以及适用场景上各有优劣。

% 生成随机点
n = 20; % 点的数量
points = rand(n, 2);% 找到y坐标最小的点作为起始点
[y_min, idx] = min(points(:, 2));
p0 = points(idx, :);% 计算其他点相对于p0的极角
angles = atan2(points(:, 2) - p0(2), points(:, 1) - p0(1));% 根据极角对所有点进行排序
[~, sorted_idx] = sort(angles);
sorted_points = points(sorted_idx, :);% 初始化栈
stack = zeros(n, 2);
stack(1, :) = p0;
stack(2, :) = sorted_points(1, :);
top = 2;% 进行Graham扫描
for i = 2:nwhile top > 1 && orientation(stack(top - 1, :), stack(top, :), sorted_points(i, :)) <= 0top = top - 1;endtop = top + 1;stack(top, :) = sorted_points(i, :);
end% 截取栈中有效的部分
hull = stack(1:top, :);% 可视化
figure;
hold on;
plot(points(:, 1), points(:, 2), 'bo', 'MarkerFaceColor', 'b'); % 绘制所有点
plot(hull(:, 1), hull(:, 2), 'r-', 'LineWidth', 2); % 绘制凸包
plot([hull(top, 1), hull(1, 1)], [hull(top, 2), hull(1, 2)], 'r-', 'LineWidth', 2); % 闭合凸包
title('Graham扫描算法生成的凸包');
xlabel('X');
ylabel('Y');
axis equal;
hold off;function orient = orientation(p, q, r)val = (q(2) - p(2)) * (r(1) - q(1)) - (q(1) - p(1)) * (r(2) - q(2));if val == 0orient = 0; % 共线elseif val > 0orient = 1; % 顺时针elseorient = 2; % 逆时针end
end    

相关文章:

凸包问题 Graham 扫描算法 MATLAB

算法要解决的问题 Graham 扫描算法要解决的问题是在给定一组二维平面上的点集时&#xff0c;找出能够完全包含这些点的最小凸多边形&#xff0c;这个最小凸多边形就是这些点的凸包。在很多实际场景中&#xff0c;我们可能只关注一个点集的最外层边界&#xff0c;而凸包算法就可…...

es+kibana---集群部署

其实一般es要跑3个节点的&#xff0c;这样才能做高可用&#xff0c;处理并发大&#xff0c;但是我这里只是一个pod mkdir -p /stroe/data/es es搭建&#xff1a; #【拉取镜像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【导入镜像】 docker load -i es.…...

定时器的源码介绍与简单实现——多线程编程简单案例[多线程编程篇(5)]

目录 前言 什么是定时器 JAVA标准库中的定时器 而关于sched方法,请看源码: 为什么我们能知道"notify() 唤醒后台线程 TimerThread"? TimerThread 关键逻辑 第一步&#xff1a;加锁 queue&#xff0c;看有没有任务 第二步&#xff1a;取出最近要执行的任务 …...

SQL常用数据清洗语句

数据清洗&#xff1a;发现并纠正数据文件里的数据错误和不一致性&#xff0c;让数据达到分析要求的过程。 运用 SQL 进行数据清洗时&#xff0c;可借助多种语句和函数来处理数据中的缺失值、重复值、异常值以及格式错误等问题。 1. 处理缺失值 数据中某些变量的值为空的情况&…...

《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》

在电商数据处理领域&#xff0c;高效获取并处理海量商品数据是企业实现精准运营、市场分析的重要基础。Go 语言凭借其出色的并发性能&#xff0c;成为开发高并发爬虫的理想选择。本文将介绍如何使用 Go 语言进行淘宝商品 API 实时采集&#xff0c;并构建 ETL&#xff08;Extrac…...

大模型(LLMs)加速篇

当前优化模型最主要技术手段有哪些&#xff1f; 算法层面&#xff1a;蒸馏、量化软件层面&#xff1a;计算图优化、模型编译硬件层面&#xff1a;FP8&#xff08;NVIDIA H系列GPU开始支持FP8&#xff0c;兼有fp16的稳定性和int8的速度&#xff09; 推理加速框架有哪一些&#…...

Linux0.11引导启动程序:简略过程

引言 目标&#xff1a;是重写boot文件夹下面的引导文件&#xff0c;加入一些个人信息。语法&#xff1a;由于使用两个语法风格的汇编需要两个汇编器&#xff0c;有些麻烦&#xff0c;直接全都用GNU的 as(gas)进行编译。使用AT&T 语法的汇编语言程序。接下来先拜读同济大学赵…...

【JAVAFX】controller中反射调用@FXML的点击事件失败

场景 当前有一个controller中定义的事件如 FXMLvoid openZhengjieWindow(ActionEvent event) {System.out.println("zhengjie");}通过反射去调用 public void callMethodByString(String methodSuffix) {try {Method method this.getClass().getMethod("open&…...

人工智能数学基础(二):初等数学

在人工智能领域&#xff0c;初等数学知识是构建复杂模型的基石。本文将从函数、数列、排列组合与二项式定理、集合等方面进行讲解&#xff0c;并结合 Python 编程实现相关案例&#xff0c;帮助大家更好地理解和应用这些数学知识。资源绑定附上完整代码供读者参考学习&#xff0…...

opendds的配置

配置的使用 文档中说明有4种使用配置的方式&#xff1a; 环境变量 命令行参数&#xff08;将覆盖环境变量中的配置&#xff09; 配置文件&#xff08;不会覆盖环境变量或命令行参数中的配置&#xff09; 用户调用的 API&#xff08;将覆盖现有配置&#xff09; 这里对开发…...

mac 基于Docker安装minio

在 macOS 上基于 Docker 安装 MinIO 是一个高效且灵活的方案&#xff0c;尤其适合本地开发或测试环境。以下是详细的安装与配置步骤&#xff0c;结合了最佳实践和常见问题的解决方案&#xff1a; 一、安装 Docker Desktop 下载安装包 访问 Docker 官网&#xff0c;下载适用于 …...

Docker网络架构深度解析与技术实践

目录 第一章 Docker网络架构核心原理 1.1 容器网络模型&#xff08;CNM&#xff09;体系 1.2 网络命名空间隔离机制 1.3 虚拟网络设备对&#xff08;veth&#xff09; 1.4 网桥驱动模型 第二章 Docker网络模式深度剖析 2.1 Bridge模式&#xff08;默认模式&#xff09; …...

如何通过Google Chrome增强网页内容的安全性

在现代互联网环境中&#xff0c;网页安全问题时常困扰着用户。谷歌浏览器作为全球使用最广泛的浏览器之一&#xff0c;提供了多种方式帮助用户增强网页的安全性。以下是一些简单有效的方法&#xff0c;可以帮助用户提高浏览器的安全防护能力。 首先&#xff0c;谷歌浏览器自带了…...

劳动节ppt免费下载,劳动节ppt模板,劳动节课件

劳动节ppt免费下载,劳动节ppt模板&#xff0c;劳动节素材&#xff0c;学生&#xff0c;幼儿园课件:劳动节ppt_模板素材_PPT模板_ppt素材_免抠图片_AiPPTer...

应用在通信网络设备的爱普生晶振SG2016CBN

在数字化浪潮席卷全球的当下&#xff0c;通信网络已成为信息时代的核心基础设施&#xff0c;从 5G 基站的快速部署到数据中心的高效运转&#xff0c;从光纤网络的稳定传输到无线通信的流畅连接&#xff0c;每一个环节都对时钟信号的稳定性和精准性有着极高要求。一个高质量的时…...

STM32 RTC配置

一、什么是RTC&#xff1f; RTC&#xff0c;即实时时钟&#xff0c;是一种能持续运行并保持当前时间信息的电子装置。它常用于在设备断电的情况下依然能保持准确的年、月、日、时、分、秒信息。 与CPU核心时钟不同&#xff0c;RTC通常采用独立的低频晶振&#xff08;如32.768…...

图像保边滤波之BEEPS滤波算法

目录 1 简介 2 算法原理 3 代码实现 4 演示Demo 4.1 开发环境 4.2 功能介绍 4.3 下载地址 参考 1 简介 BEEPS&#xff08;Bias Elimination in Edge-Preserving Smoothing&#xff09; 是一种基于偏微分方程&#xff08;PDE&#xff09;的边缘保留平滑滤波算法。它能够…...

使用OpenCV和dlib库进行人脸关键点定位

文章目录 引言一、环境准备二、代码实现解析1. 导入必要的库2. 加载图像和人脸检测器3. 加载关键点预测模型4. 检测并绘制关键点5. 显示结果 三、68个关键点的含义四、常见问题解决五、总结 引言 人脸关键点定位是计算机视觉中的一项基础任务&#xff0c;它在人脸识别、表情分…...

Transformer数学推导——Q27 证明时序注意力(Temporal Attention)在视频模型中的帧间依赖建模

该问题归类到Transformer架构问题集——注意力机制——跨模态与多模态。请参考LLM数学推导——Transformer架构问题集。 在视频理解任务中&#xff0c;捕捉帧与帧之间的时间依赖关系&#xff08;如动作的连贯性、物体的运动轨迹&#xff09;是核心挑战。时序注意力&#xff08…...

相机-IMU联合标定:相机标定

文章目录 📚简介💡标定方法🚀标定工具kalibr🚀标定数据录制🚀相机标定📚简介 在 VINS(Visual-Inertial Navigation System,视觉惯性导航系统) 中,相机标定 是确保视觉数据准确性和系统鲁棒性的关键步骤,其核心作用可总结为以下方面: 消除镜头畸变,提升特征…...

sevlet API

sevlet API API就是一组类和方法 HttpServlet 这是写servlet代码用到的核心的类,通过继承这个类,并重写其中的方法,让Tomcat去调用这里的逻辑. init:webapp被加载的时候,执行 destroy:webapp被销毁的时候(Tomcat结束)执行,进行一些收尾工作.但是这个方法不保证能够调用到!!…...

python程序设习题答案

第一章 1&#xff0e;在下列领域中&#xff0c;使用 Python 不可能实现的是( C ) A . Web 应用开发 B &#xff0e;科学计算 C &#xff0e;操作系统管理 D &#xff0e;游戏开发 2.Python程序文件的扩展名是&#xff08; D )。 A.python B.pyt C.pt D.py 3&…...

[计算机科学#4]:二进制如何塑造数字世界(0和1的力量)

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a; 二进制是计算机世界的基石&#xff0c;数学是世界的…...

一种在使用Kaggle并遇上会话中断时强行保存数据的方法

问题&#xff1a;kaggle会话结束后&#xff0c;无法保存训练模型时记录的excel文件 解决方法&#xff1a;使用kaggle时&#xff0c;使用下面脚本可将保存到训练数据excel转为链接形式&#xff0c;从而在kaggle会话终止时也可以下载到该excel文件 import base64 import pandas …...

【人工智能agent】--dify搭建智能体和工作流

【人工智能agent】--docker本地部署dify教程-CSDN博客 上期讲到如何部署dify&#xff0c;然后进入页面&#xff1a; docker服务&#xff1a; 目录 1.基础设置 2.创建聊天助手 3.创建知识库应用 4.创建智能体 5.创建工作流 5.1.文档总结规划 5.2.爬取网页新闻 1.基础设…...

[4282]PHP跨境电商源码-多语言商城源码/支持代理+商家入驻+分销+等等众多功能/带详细安装

源码获取&#xff1a;[4282]PHP跨境电商源码-多语言商城源码/支持代理商家入驻分销等等众多功能/带详细安装云溪资源网_源码下载,小程序源码下载,网站源码下载,游戏源码下载云溪资源网_源码下载,小程序源码下载,网站源码下载,游戏源码下载...

MongoDB的增删改查操作

1.文档创建 首先要插入数据前&#xff0c;要先创建数据库&#xff0c;创建完之后建立集合&#xff0c;然后才能进行增删改查的步骤 切换&#xff08;新建&#xff09;数据库&#xff1a; use <db> db是指要创建数据库的名称 新建集合&#xff1a; db.createCollection(…...

TimDbg

晚上随意浏览&#xff0c;发现一个有趣的网站&#xff1a; TimDbg 调试器谎言&#xff1a;堆栈损坏 // TimDbg 2022.11的一篇很有趣&#xff0c;讲如何培养裸眼反汇编的能力&#xff0c;即培训心智模型&#xff0c;模式识别能力。 识别内存中的模式 // TimDbg 我是用edge浏…...

MySQL 表的约束(二)

文章目录 自增长唯一键外键 自增长 auto_increment&#xff1a;当对应的字段&#xff0c;不给值&#xff0c;会自动的被系统触发&#xff0c;系统会从当前字段中已经有的最大值1操作&#xff0c;得到一个新的不同的值。通常和主键搭配使用&#xff0c;作为逻辑主键。 create …...

大数据应用开发和项目实战

Matplotlib的介绍 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Matplotlib 可以用来绘制各种静态&#xff0c;动态&#xff0c;交互式的图表。比如说散点图、柱状图等等。 Matplotlib Pyplot plot(…...

OpenLayers矢量数据可视化高级技巧(进阶二)

1. 高级样式技术 矢量数据的样式直接影响可视化效果的表达能力和美观度。OpenLayers提供了丰富的样式API&#xff0c;通过组合和创新&#xff0c;可以实现各种复杂的视觉效果。 1.1 动态样式 // 根据属性值动态设置样式 const vectorLayer new ol.layer.Vector({source: ne…...

实用的java技术架构组件汇总

1.后端数据校验 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>校验注解 jakarta.validation-api 规范提供如下&#xff1a; size hibern…...

Rmarkdown输出为pdf的方法与问题解决

R 是一种在数据分析与统计计算领域广泛使用的编程语言。其关键优势之一是能够生成高质量的报告和文档&#xff0c;这些报告和文档可以使用 RMarkdown 轻松定制和更新。在本文中&#xff0c;我们将探讨使用 R 从 RMarkdown 文件生成.pdf 文件 1.生成方法 新建Rmarkdown&#xf…...

【超详细讲解】什么是序列化和反序列化?

目录 一、什么是序列化&#xff08;Serialization&#xff09;&#xff1f; 举个直观的例子 二、什么是反序列化&#xff08;Deserialization&#xff09;&#xff1f; 三、为什么需要序列化&#xff1f; 四、常见的序列化格式对比 五、序列化底层是怎么做的&#xff1f;…...

深入浅出JavaScript常见设计模式:从原理到实战(2)

深入浅出JavaScript常见设计模式&#xff1a;从原理到实战(2) 本文是深入浅出JavaScript常见设计模式&#xff1a;从原理到实战(1)的续集 设计模式是一种在特定情境下解决软件设计中常见问题的通用方案或模板。在特定的开发场景中使用特定的设计模式&#xff0c;可以提升代码质…...

MySQL 主从复制

数据的高可用性、读写分离以及数据备份是至关重要的需求。MySQL 作为一款广泛使用的开源关系型数据库&#xff0c;其主从复制功能为解决这些问题提供了有效的方案。本文将详细介绍 MySQL 主从复制的原理、搭建步骤以及实际应用。 一、MySQL 主从复制原理 1.1 基本概念 MySQL…...

小目标检测的集成融合论文阅读

摘要 小目标检测常因图像模糊和分辨率低而受到阻碍,这给小目标的精确检测和定位带来了重大挑战。此外,传统的特征提取方法往往难以捕捉到这些目标的有效表征,因为下采样和卷积操作会导致小目标细节的模糊化。为了解决这些问题,本研究提出了一种基于集成融合的方法,通过利…...

IP SSL证书常见问题:快速实现HTTPS加密

SSL证书作为实现HTTPS加密和身份验证的关键工具&#xff0c;不仅适用于域名&#xff0c;还能直接绑定IP地址&#xff0c;为IP通信提供安全保障。 一、什么是IP SSL证书&#xff1f; IP SSL证书&#xff08;IP HTTPS证书&#xff09;是一种专为IP地址设计的SSL/TLS证书&#xf…...

Scratch——第20课 辗转相除法/绳子算法

辗转相除法是用于求取最大公约数时需要用到的方法&#xff0c;它还有个名字称为绳子算法&#xff0c;这类题目只要理解辗转相处的原理即可拿下。 一、辗转相除法的基本原理 两个整数的最大公约数不变&#xff0c;当较大数减去较小数后&#xff0c;得到的差值与较小数的最大公…...

MYOJ_1349:(洛谷P3951)[NOIP 2017 提高组] 小凯的疑惑(数学公式套用,两步搞定代码)

提示 本题代码纯属数学的结晶&#xff0c;因此肥肠简单&#xff0c;但需要一定理解。 题目描述 小凯手中有两种面值的金币&#xff0c;两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下&#xff0c;仅凭这两种金币&#xff0c;有些物品他是无法准确支付…...

如何免费把PPT的页面输出为透明的图片-快速制作图新说汇报内容

0.序 经常有朋友问想把PPT中的内容输出为图片&#xff0c;但是PPT里面的officePlus还得付费才可以。不付费就带水印还不高清&#xff0c;关键是还不透明&#xff0c;如果需要透明就设置纯底色去PS里面抠图&#xff08;可自动化&#xff09;&#xff0c;或者手动右键挨个输出。…...

操作系统——第四章(文件管理与文件的逻辑结构)

一、文件系统基础 1.文件的属性 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要是为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性。因此标识符只是操作系统用…...

剑指offer经典题目(七)

目录 动态规划 字符串相关 排序思想相关 链表相关 动态规划 题目1&#xff1a;输入一个长度为n的整型数组array&#xff0c;数组中的一个或连续多个整数组成一个子数组&#xff0c;子数组最小长度为1。求所有子数组的和的最大值。OJ地址 图示如下。 题目解析&#xff1a…...

[RoarCTF 2019]Easy Calc 详解

[RoarCTF 2019]Easy Calc 1 ajax 是进行前后端交互的 但是我们发现一个waf 就是他提示的"calc.php?num"encodeURIComponent($("#content").val()) ?num 的值必须是数字审计一下 foreach 发现了num的限制但是eval是rce的标志所以我们首选的就是使用命令…...

AI日报 - 2025年04月29日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; AGI突破 | 巨头CEO预测AGI时间线&#xff0c;5年内或达人类认知水平&#xff1b;Yann LeCun强调多模态训练重要性。 关于AGI定义和实现时间的讨论升温&#xff0c;对超越纯文本训练的需求成为共识。 ▎&#x1f4bc; 商业动向…...

Kubernetes的错误信息处理

报错信息 E0428 13:18:25.531614 3193818 memcache.go:287] couldn’t get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request 以下是处理该 Kubernetes 指标服务报错的系统化解决方案&#xff1a; 错误诊断流程 # 1. 检查 …...

杰理-安卓通过map获取时间的时候,部分手机切换sbc和aac时候单耳无声音

杰理-安卓通过map获取时间的时候&#xff0c;部分手机切换sbc和aac时候单耳无声音 #if USER_SUPPORT_PROFILE_MAPif(tws_api_get_role()0){ //主机才获取&#xff0c;否则切换sbc 和 aac 的时候影响单耳无声音user_send_cmd_prepare(USER_CTRL_MAP_READ_TIME,0,NULL);} #endif…...

基于 Python 的实现:居民用电量数据分析与可视化

基于 Python 的实现:居民用电量数据分析与可视化 本文将介绍如何利用 Python 技术栈(包括 pymysql、pandas、matplotlib 等库)对居民用电量数据进行分析和可视化,以帮助我们更好地理解用电行为模式。 数据准备 在MySQL数据库中创建数据,,数据库表结构如下: date:记录…...

el-transfer穿梭框数据量过大的解决方案

一&#xff1a;背景 我们这个穿梭框获取的是项目的全量数据&#xff0c;在左边大概有5000条&#xff0c;自己测试了一下5000条数据的效果&#xff0c;发现异常的卡顿&#xff0c;本来打算像el-select一样去解决的&#xff08;只显示一部分&#xff0c;在搜索的时候去全量搜索&a…...

【3D基础】深入解析OBJ与MTL文件格式:Blender导出模型示例及3D开发应用

引言 在3D模型开发和3D引擎加载过程中&#xff0c;OBJ格式是最基础、最常见的标准之一。即便在今天流行的GLTF、USDZ格式出现后&#xff0c;OBJ依然是建模软件和渲染引擎普遍支持的基本格式。 本文以Blender导出的立方体模型为例&#xff0c;详细讲解OBJ与MTL文件每一部分的含…...