计算几何中的凸包(Convex Hull in Computational Geometry)
接下来,我将循序渐进地为你讲解“凸包”这个概念。
第一步:直观理解与基本定义
让我们先从最直观的几何层面开始。想象在平面上钉上许多钉子,然后用一根橡皮筋去套住所有钉子,松开手后,橡皮筋会收缩成一个紧绷的多边形。这个多边形就包含了所有的钉子,并且其形状是“凸”的。这个多边形就是我们所说的凸包。
正式定义:对于平面上(或更高维空间中)的一个点集P,其凸包是所有包含P的凸多边形(凸多面体)中,面积(或体积)最小的那一个。换句话说,它是点集P中所有点的凸组合所构成的集合。一个点集的凸组合,是指该点集中某些点以非负系数相加(系数和为1)而得到的点。凸包就是这个集合中所有可能的凸组合点的全体。
一个多边形(或多面体)是“凸”的,当且仅当连接其内部任意两点的线段都完全位于其内部或边界上。凸包必然是凸的。
第二步:凸包的表示与性质
凸包通常表示为一个按顺时针或逆时针方向排序的顶点序列,这些顶点都来自于原始点集P,并且它们是凸包边界上的“拐角”点,也称为极点。
重要性质:
- 包含性:凸包包含了点集P中的所有点。
- 极值性:凸包是包含P的所有凸集中最小的一个。
- 极点的特性:点集P中的一个点p是凸包的顶点(极点),当且仅当存在一条通过p的直线L,使得P中所有其他点都严格地位于L的同一侧。
- 算法不变性:凸包的形状和顶点顺序与坐标系的旋转无关,只与点的相对位置有关。
第三步:经典计算算法——Graham Scan
为了从数学概念过渡到“计算”,我们需要算法来计算凸包。Graham Scan算法是一个经典、高效的平面凸包算法。
算法步骤(以逆时针输出凸包为例):
- 寻找基点:找到点集中y坐标最小的点(如果y相同,则取x最小的点)。这个点(记为P0)一定是凸包的一个顶点。
- 极角排序:将其他所有点按照相对于基点P0的极角(即点与P0连线与x轴正方向的夹角)进行排序。如果极角相同,则距离P0较近的点排在前面。排序后,我们得到一个点序列P0, P1, P2, ..., Pn-1。
- 栈扫描构建凸包:
- 初始化一个栈,将前三个点P0, P1, P2按顺序压入栈。
- 对于后续的每一个点Pi (i从3到n-1):
- 检查栈顶的两个点(设为
top和next_top)与当前点Pi形成的向量(next_top -> top)和(top -> Pi)的叉积(cross product)。 - 叉积的意义:在二维中,叉积
(x1, y1) × (x2, y2) = x1*y2 - y1*x2。其结果的符号指示了转向:- 大于0:表示从第一个向量到第二个向量是逆时针转向(左转)。
- 小于0:表示顺时针转向(右转)。
- 等于0:表示两向量共线。
- 在构建逆时针凸包时,我们需要不断“左转”。因此,当
(next_top -> top) × (top -> Pi) <= 0(即非严格左转,包括共线或右转)时,这意味着当前栈顶的点top使得形状“凹”进去了或者不是必需的顶点,因此将其从栈中弹出。 - 重复弹出操作,直到栈中只剩一个点,或者满足
(next_top -> top) × (top -> Pi) > 0(严格左转)。 - 最后将当前点Pi压入栈。
- 检查栈顶的两个点(设为
- 结束:扫描完所有点后,栈中存储的点序列(从栈底到栈顶)就是凸包的顶点,按逆时针顺序排列。
第四步:算法复杂度与另一种算法简介
-
Graham Scan复杂度:
- 步骤1寻找基点:O(n)。
- 步骤2极角排序:O(n log n),这是算法的主要瓶颈。
- 步骤3栈扫描:每个点最多被压入和弹出栈一次,因此是O(n)。
- 总时间复杂度为O(n log n),这是计算平面凸包问题已知的下界,因此Graham Scan在渐进意义下是最优的。
-
Jarvis March(礼物包裹算法)简介:作为另一种理解凸包构造的思路。它像用一根绳子缠绕点集一样工作:
- 从最左端的点开始(这一定是凸包顶点)。
- 对于当前点
p,寻找下一个点q,使得对于点集中所有其他点r,向量(p -> q)到(p -> r)都是逆时针转向(即q是相对于p的“最左转”点)。 - 将
q设为新的当前点,重复步骤2,直到回到起始点。
其时间复杂度为O(nh),其中h是凸包的顶点数。当h很小(点近似共线)时很快,但当h接近n时(点分布在一个圆上),退化为O(n²)。
第五步:更高维度与应用
- 更高维度:在三维空间中,凸包是一个凸多面体。计算三维凸包的经典算法有“增量法”和“分治法”,最优的期望时间复杂度也是O(n log n)。在更高维度,问题变得更加复杂。
- 应用:凸包是计算几何的基础工具,应用极其广泛:
- 碰撞检测:物体的凸包常用于简化碰撞检测的计算。
- 模式识别:用于形状分析和分类。
- 路径规划:计算移动物体的可见区域或安全区域。
- 地理信息系统:计算一组地理区域的最小凸边界。
- 计算机图形学:用于阴影体生成、快速剔除等。
- 机器学习:支持向量机(SVM)的核心思想与凸包密切相关。
总结来说,凸包从一个直观的几何概念出发,通过精确定义其数学性质,进而发展出高效的计算算法(如Graham Scan),最终成为连接几何、算法设计与众多工程应用领域的一个核心计算工具。