凸包gydF4y2Ba
内容gydF4y2Ba
凸包gydF4y2Ba
凸包是计算几何中普遍存在的结构。尽管它本身是一个有用的工具,但它也有助于构造其他结构,如Voronoi图,以及在无监督图像分析等应用程序中。gydF4y2Ba
我们可以通过思想实验来想象凸包的样子。想象这些点是伸出平面的钉子,拿一根橡皮筋,在钉子周围拉伸,然后松开。它会在指甲周围折断,并呈现出最小长度的形状。橡胶带所包围的区域称为的凸包gydF4y2Ba .这导致了有限集凸包的另一种定义gydF4y2Ba 平面上的点:它是唯一的凸多边形,其顶点是点gydF4y2Ba 它包含所有的点gydF4y2Ba .gydF4y2Ba
绿色钉的集合是点集合的凸包。gydF4y2Ba
应用程序gydF4y2Ba
凸包的一些应用是:gydF4y2Ba
避碰gydF4y2Ba:如果汽车的凸包避免了与障碍物的碰撞,那么汽车也避免了与障碍物的碰撞。由于凸车更容易计算避免碰撞的路径,因此常用于规划路径。gydF4y2Ba
最小的盒子gydF4y2Ba:包含多边形的最小面积矩形至少有一面与多边形的凸包平齐,因此凸包在最小矩形算法的第一步进行计算。类似地,寻找物体周围最小的三维盒子取决于3d -凸包。gydF4y2Ba
形状分析gydF4y2Ba:形状可以根据它们的“凸缺陷树”进行分类,这些结构依赖于凸包的计算。gydF4y2Ba
凸性和凸包的正式定义gydF4y2Ba
凸性gydF4y2Ba一组gydF4y2Ba 如果是凸的gydF4y2Ba 而且gydF4y2Ba 这意味着线段gydF4y2Ba .这可以作为凸性的主要定义。注意,这个定义没有为点指定任何特定的维度gydF4y2Ba 是连通的,有界的,无界的,闭的还是开的。gydF4y2Ba
我们现在已经给出了凸包的直观定义。现在让我们看一下凸包的更精确的定义。gydF4y2Ba
凸包gydF4y2Ba
一组点的凸包gydF4y2Ba 所有半空间的交点是否包含gydF4y2Ba .二维空间中的半空间是一条直线上或直线一侧的点的集合。这个概念可以推广到更高的维度。一个gydF4y2Ba半空格gydF4y2Ba是平面上或平面一侧的点的集合,等等。gydF4y2Ba
请注意,集合的凸包是一个封闭的“固体”区域,其中包括其内部的所有点。通常,这个术语在计算几何中更松散地用于表示这个区域的边界,因为它是我们计算的边界,它意味着这个区域。gydF4y2Ba
格雷厄姆的算法gydF4y2Ba
Graham扫描算法是一种计算平面上具有时间复杂度的有限点集的凸包的方法gydF4y2Ba .算法找到凸包沿边界排列的所有顶点。gydF4y2Ba
Graham的扫描过程如下:gydF4y2Ba
找到最低点gydF4y2Ba 坐标。如果有两点相同gydF4y2Ba 值,则考虑x坐标值较小的点。把最底部的点放在第一个位置。gydF4y2Ba
考虑剩下的gydF4y2Ba 点,并围绕点按逆时针方向按极角排序gydF4y2Ba .如果两点的极角相等,则把最近的点放在前面。gydF4y2Ba
创建一个空堆栈gydF4y2Ba 还有推点gydF4y2Ba 指出,gydF4y2Ba 并指出gydF4y2Ba 来gydF4y2Ba .gydF4y2Ba
剩下的过程gydF4y2Ba 一个一个点。做以下每一分的分gydF4y2Ba ”gydF4y2Ba
继续从堆栈中删除点,同时定位如下gydF4y2Ba 点不是逆时针的(或者它们不左转弯)。gydF4y2Ba
- 指向堆栈顶部旁边gydF4y2Ba
- 指向堆栈的顶部gydF4y2Ba
- 点gydF4y2Ba
将点[i]推到SgydF4y2Ba
上述过程的伪代码实现如下:gydF4y2Ba
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18gydF4y2Ba |
|
格雷厄姆扫描的运行时间gydF4y2Ba
•第一步:gydF4y2Ba +gydF4y2Ba 用于设置和分类gydF4y2Ba
•第二步:gydF4y2Ba 将项推入堆栈的常量时间gydF4y2Ba
•第三步:gydF4y2Ba 每个点在for循环中被推一次gydF4y2Ba
•步骤4gydF4y2Ba 对于在循环中弹出,每个点最多弹出一次gydF4y2Ba
•总运行时间:gydF4y2Ba
该算法的瓶颈是按极坐标角对点进行排序。我们所看到的这项行动需要gydF4y2Ba 时间。gydF4y2Ba
极端的边缘gydF4y2Ba
识别凸包的极端边有点容易。如果每个点都在,那么一条边就是极端的gydF4y2Ba 是在线的一边还是在线的一边,由边决定。似乎最容易检测到这一点的方法是将边缘视为有方向的,并指定两个可能的方向之一来确定“边”。让有向边的左边在里面。消极地说,有向边不是极端的,如果有一个点不在它的左边或在它上面。这是我们在下面的伪代码中使用的公式。gydF4y2Ba
1 2 3 4 5 6gydF4y2Ba |
|
这个算法显然是适用的gydF4y2Ba 时间,因为有三个嵌套循环,每一个成本gydF4y2Ba .gydF4y2Ba
礼物包装gydF4y2Ba
极端边缘算法的一个小变化将改善它的一个因素gydF4y2Ba 并按它们在船体边界周围出现的顺序输出点。这个想法是利用一个极端的边缘作为一个锚来寻找下一个。这是可行的,因为我们知道极端边被弯曲成一个凸多边形。因为这个多边形可以拥有的顶点最多是gydF4y2Ba ,则极端边数为gydF4y2Ba .锚定搜索只会进行探索gydF4y2Ba 候选人,而不是gydF4y2Ba 候选在我们上面的极端边缘算法。gydF4y2Ba