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

算法(11):Convex hull-5.6

凸包的物理来源是:你有一组钉在板上的点(比如图钉),用一个橡皮筋从外部套住它们全部。橡皮筋绷紧后形成的那个多边形轮廓,就是这些点的凸包。

这个问题的计算目标,就是找出这个多边形的顶点(原始点集中的哪些点)以及它们在边界上的顺序。


1. 核心几何观察(这是整个算法的物理依据)

如果沿着凸包的边界逆时针行走,你在每一个顶点处都只会向左转(即逆时针方向)。这个性质是凸性的直接几何结果——凸多边形内部始终在边界路径的左侧。

相反,如果你在某个点处向右转(顺时针),那么这个点一定不在凸包边界上,它位于凸包内部,应该被舍弃。


2. Graham 扫描算法的步骤

PPT 上展示的算法是 Graham 扫描法的一个变体。

第一步:找最低点p
在给定的点集中,找到y坐标最小的点(如果有多个,取x最小的)。这个点必然在凸包上,因为在所有点中最南端的点不可能被任何两个点围住。

第二步:按极角排序
p为原点,计算其他所有点相对于p的极角(从正右方逆时针旋转到该点方向的角度)。按极角从小到大排序。极角越小的点,在从p出发的逆时针方向上越靠前。

第三步:扫描并丢弃右转点
维护一个栈。按排序后的顺序依次处理每个候选点c

  • 如果栈中元素少于 2 个,直接入栈。

  • 如果栈中至少有 2 个点(取栈顶第二个点为a,栈顶点为b),判断从a → b → c的转向:

    • 左转(逆时针)c可能是凸包顶点,保留b,将c入栈。

    • 右转(顺时针)b不可能是凸包顶点,将b弹出栈。然后重复检查新的abc,直到b被保留或栈中少于 2 个点。

扫描结束后,栈中剩余的点按顺序依次连接,就是凸包的逆时针顶点序列。


3. 转向判断的物理计算(叉积)

给定三个点a, b, c,计算向量abbc的叉积(有符号面积的两倍):

area2=(b.x−a.x)×(c.y−a.y)−(b.y−a.y)×(c.x−a.x)area2=(b.x−a.x)×(c.y−a.y)−(b.y−a.y)×(c.x−a.x)
  • area2 > 0:左转(逆时针)→ 保留。

  • area2 < 0:右转(顺时针)→ 弹出栈顶。

  • area2 == 0:三点共线。在凸包算法中,通常删除中间点(保留最远的端点)或根据具体规则处理。


4. 为什么这个算法依赖于排序

排序的作用是:保证扫描过程是按照围绕最低点p的逆时针方向进行的。

你可以把p想象成橡皮筋的一个固定端点。从p出发,按极角从小到大处理其他点,相当于一圈一圈地往外“包裹”这些点。如果处理顺序是乱的,你就无法判断何时该丢弃内部点。排序将二维的几何问题降维成了一个一维的扫描序列问题。整个算法的复杂度瓶颈在排序这一步,为O(N log N)。扫描本身是线性的O(N)

http://www.cnnetsun.cn/news/3713303.html

相关文章:

  • Mentor PADS差分走线设计与信号完整性优化指南
  • 文件加密软件有哪些?6 款全格式办公文件加密软件,2026 必备
  • AI 基础设施建设中的决策陷阱:技术选型、团队能力与时间约束的博弈分析
  • AI副业从0到1实战手册:3类无需编程的AI工具+4步冷启动流程+2024最新平台入驻清单
  • LeetCode gas-station
  • WPF控件游标与十字线设计及交互优化
  • 早起原来还有这些好处
  • HS2-HF补丁:10分钟打造你的专属Honey Select 2游戏体验
  • Sunshine游戏串流服务器终极指南:5分钟搭建家庭云游戏系统
  • 数据结构实验(C语言):顺序串
  • 进程互斥和进程同步
  • 逃离塔科夫终极离线训练器:30+功能解锁游戏新维度
  • 软件外包报价为什么差很多?先拆需求、工期和交付范围
  • ES6常用语法
  • 告别命令行踩坑!Hermes Windows 一键整合包,3 步搭建本地桌面 AI 自动化智能体
  • VMware Workstation 17 Pro安装Slackware 15.0完整指南
  • 计算机JAVA毕设实战-基于SpringBoot+Vue的校园流浪动物信息登记与救助管理平台 智慧校园流浪动物投喂救助与公示系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 洛谷P3709 大爷的字符串题 莫队
  • 编写程序,程序设定年度试错额度,额度内可以自由开展无收益的创新尝试,不用过度担忧成本。
  • 10分钟掌握vJoy:将键盘鼠标变成专业游戏手柄的完整指南
  • 【Matlab】量子力学波函数演化仿真程序
  • 【AI大模型进阶】Autograd 自动求导:别怕,你不用自己算微积分!
  • 3 连接mysql 数据库 进行数据的存储和读取
  • Agentic AI时代数据库架构演进:从数据仓库到智能决策引擎
  • 1. 准备工作
  • 服务计算--配置云桌面遇到的坑
  • 前端打包体积优化:Tree Shaking、代码分割与按需加载的深度实践
  • Q-learning在无人机三维路径规划中的MATLAB实现
  • 三菱FX5u PLC控制4轴伺服定位系统实战解析
  • RBAC表设计