郭震 AI公众号:郭震AI

10 几何算法之凸包算法

发布日期:

最近更新:

分类: 计算几何

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点6 个
图文要点6 张
正文规模1.4k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 6 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

几何算法之凸包算法结构图查看大图
几何算法之凸包算法结构图

计算几何适合用图来理解,关键是把几何对象、关系判断和算法边界放在一起看。阅读时可以按「什么是凸包? -> 凸包的性质 -> 常见的凸包算法 -> Graham 扫描法」建立结构,再回到正文里的代码、案例或指标做验证。

几何算法之凸包算法核对图查看大图
几何算法之凸包算法核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「什么是凸包?」,再查「凸包的性质」。

在上一篇中,我们探讨了几何算法中的最近点对问题,并了解了如何高效地寻找平面上两个最近的点。在本篇中,我们将深入研究凸包算法。这是计算几何中一个重要的基础问题,广泛应用于图形学、计算机视觉和模式识别等领域。

什么是凸包?

凸包 是给定点集的最小凸多边形。换句话说,如果你有一组点,凸包就是包围这些点的最小范围。如同在一组钉子上拉紧一根橡皮带,橡皮带的形状就代表了这些点的凸包。

凸包算法判断卡查看大图
凸包算法判断卡

学习凸包算法时,先看点集外边界、叉积转向、排序策略和共线点处理。

凸包的性质

  • 最小性:凸包是所有包含给定点集的凸多边形中,面积最小的一个。
  • 凸性:凸包内部的任意两点之间的连线都位于凸包的内部。
  • 包含性:凸包包含所有给定的点。

常见的凸包算法

在计算几何中,有几种经典的凸包算法。以下几种是最常用的:

计算几何阅读地图卡查看大图
计算几何阅读地图卡

读《几何算法之凸包算法》时,可以把配图当成路线卡:先看整体顺序,再看每一步为什么这样做,最后再检查边界条件。

  1. 贪心算法:如 Graham 扫描法。
  2. 分治法:如 Chan's 算法。
  3. 旋转卡壳:通过将点在极坐标中排序并处理。

在此,我们主要关注现代应用中使用最广泛的 Graham 扫描法

Graham 扫描法

Graham 扫描法的核心思想是将所有点绕着一个极小的“锚点”进行排序,从而构造出凸包。

算法步骤:

  1. 选择锚点:选择一个点作为起始点,通常选择y值最小的点(如有相同y值则选择x值最小的)。
  2. 极角排序:将其他点按锚点的极角进行排序。
  3. 构建凸包:使用栈来构建凸包。遍历排序后的点,如果形成右转,则弹出栈顶元素,直到形成左转为止。

代码实现

以下是一个使用 Python 实现的 Graham 扫描法的示例:

import matplotlib.pyplot as plt

def orientation(p, q, r):
    # 计算点p, q, r的方向
    val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1])
    if val == 0:
        return 0  # collinear
    return 1 if val > 0 else 2  # clock or counterclock wise

def graham_scan(points):
    # 找到最底部的点
    start = min(points, key=lambda p: (p[1], p[0]))
    
    # 按极角排序
    sorted_points = sorted(points, key=lambda p: (atan2(p[1] - start[1], p[0] - start[0])))
    
    # 构建凸包
    hull = []
    for point in sorted_points:
        while len(hull) >= 2 and orientation(hull[-2], hull[-1], point) != 2:
            hull.pop()
        hull.append(point)
    
    return hull

# 示例
points = [(0, 3), (1, 1), (2, 2), (4, 4), (0, 0), (1, 2), (3, 1), (3, 3)]
hull = graham_scan(points)

# 绘制结果
plt.figure()
plt.scatter(*zip(*points), color='blue')
plt.scatter(*zip(*hull), color='red')
plt.plot(*zip(*hull, hull[0]), color='red')  # 连接所有点闭合凸包
plt.title("Graham Scan Convex Hull")
plt.show()

在这个代码中,我们定义了一个 graham_scan 函数,该函数接收一组点并返回构建的凸包顶点。我们还通过 matplotlib 库可视化了凸包结果。

应用实例

凸包在实际应用中发挥着至关重要的作用,尤其是在计算机图形学中。例如,许多 2D 游戏需要进行碰撞检测时,通常会先计算对象的凸包,然后使用它们进行更简化的碰撞检测,以提高性能。

几何算法之凸包算法应用检查卡查看大图
几何算法之凸包算法应用检查卡

如果想把《几何算法之凸包算法》用到自己的任务里,可以先缩小场景,只验证一个最关键的判断点。

几何算法之凸包算法应用复盘卡查看大图
几何算法之凸包算法应用复盘卡

学完《几何算法之凸包算法》后,不妨换一个自己的场景试一次,重点观察输入、处理和输出是否能对应起来。

在图像处理领域,凸包可以用来识别和提取形状。在一个物体的外边界提取过程中,通过凸包算法,我们能获得物体的外轮廓。

案例:计算几何在图形学中的应用

在下一篇中,我们将探讨计算几何在图形学中的应用,特别是在物体识别、碰撞检测等方面的重要性,进一步理解凸包算法在实际场景中的重要角色。

通过对凸包的理解,我们不仅能够打下一个坚实的基础,也能在后续的应用中游刃有余。希望这篇教程能为你的学习之旅提供帮助。

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

几何算法之凸包算法适合谁读?

这是 计算几何入门 系列第 10 / 18 篇,适合正在学习计算几何入门,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇计算几何入门教程要多久?

按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...