凸包(convex hull)简述
创作时间:
作者:
@小白创作中心
凸包(convex hull)简述
引用
CSDN
1.
https://m.blog.csdn.net/mrbaolong/article/details/144912973
凸包(convex hull)是计算几何中的一个基本概念,广泛应用于计算机图形学、模式识别等领域。本文将重点介绍二维凸包的定义及其两种主要算法:Andrew算法和Graham扫描法。
凸包的基本概念
二维凸多边形是指所有内角都在[0, π]范围内的简单多边形。凸包是指在平面上包含所有给定点的最小凸多边形。从数学定义的角度来看,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。
凸包算法
Andrew算法求凸包
Andrew算法(也叫单调链算法)用于求解平面上一组点集的凸包。其基本思想是先将点集按照横坐标(若横坐标相同则按照纵坐标)进行排序,然后通过遍历排序后的点依次构建凸包的上链和下链,最终合并得到完整的凸包。该算法的时间复杂度为O(n log n),其中n为待求凸包点集的大小。
算法过程:
- 将点集P按照横坐标升序排序,若横坐标相同则按照纵坐标升序排序。
- 构建凸包的下链,从左到右遍历排序后的点集,利用一个栈(可以用数组模拟)来维护凸包的下链。对于每个点,不断检查栈顶的两个点与当前点所构成的向量是否满足“左转”条件(通过叉积判断),若不满足则弹出栈顶元素,直到满足条件或者栈中元素个数小于2,然后将当前点压入栈中。
- 构建凸包的上链,从右到左遍历排序后的点集(不包括已经在凸包下链中的点),同样利用栈来维护凸包的上链,执行和构建下链类似的操作,不断检查栈顶的两个点与当前点所构成的向量是否满足“左转”条件,若不满足则弹出栈顶元素,直到满足条件或者栈中元素个数小于2,然后将当前点压入栈中。
- 将凸包的下链(除了最后一个点,因为它和上链的第一个点重复)和凸包的上链合并起来,得到最终的凸包。
上图为排序好的点集
上图为从左到右构建下凸包的过程
上图为从右到左构建上凸包的过程,最后红色实线和黑色实线组成凸包
Graham扫描法
与Andrew算法相同,Graham扫描法的时间复杂度也为O(n log n),复杂度瓶颈也在于对所有点排序。
算法过程:
- 找到基点(最左下角的点):遍历点集,找出纵坐标最小的点,如果有多个纵坐标最小的点,则选择其中横坐标最小的那个点作为基点。这个基点是后续极角排序以及构建凸包的重要参考点。
- 极角排序:计算除基点外其他各点相对于基点的极角,按照极角从小到大对这些点进行排序(若极角相同,则按照距离基点的距离从小到大排序)。通过极角排序能确定点集的一种相对顺序,方便后续扫描构建凸包。
- 扫描构建凸包:利用一个栈来维护凸包的点。先将基点和排序后的第一个点压入栈中,然后从第二个点开始依次遍历排序后的点集,对于每个点,检查栈顶两点与当前点所构成的向量是否满足“左转”条件(通过叉积判断),若不满足则弹出栈顶元素,直到满足左转条件或者栈中元素个数小于2,之后将当前点压入栈中。最终栈中存储的点就是凸包的顶点。
参考资料
热门推荐
“机器学习”、“深度学习”、“强化学习”傻傻分不清楚?一文帮你搞懂
“机器学习”、“深度学习”、“强化学习”傻傻分不清楚?一文帮你搞懂
外力、内力和应力:工程力学中的基本概念
羽毛球初学者应该如何练习羽毛球,初学者怎样打羽毛球进步快
肚子疼会引起发烧吗
金庸笔下倚天屠龙记中的明教与历史上真实的明教
地热打压多少钱 地暖打压有哪些注意事项
降血糖的食物及蔬菜和水果有哪些
沁园春雪全诗及赏析
猪蹄可以用微波炉加热吗 如何用微波炉热猪蹄
公正公义审判案例分析:维护社会公平正义的典范
上海的车位彻底卖不动了
中国神经外科重症患者气道管理
肾病和运动有关?医生斥责:若不想患肾衰竭,运动牢记“3不要”
故宫牌匾的秘密,看完这3点你就明白了!
目标导向:设定合理目标的策略与方法
西安3月份周边赏花攻略,好玩的地方这么多,你最想去哪一个?
糙米有哪些种类 糙米的正确选购方法
总胆固醇高对身体的影响
如何选择汽车,有哪些注意事项?
钥匙锁在屋里了怎么办?有哪些应急开锁的方法和注意事项?
3·15专题丨网贷都结清了,注销授信额度咋那么难?
大众甲壳虫为啥不生产了,大众甲壳虫还能买到吗
四合院风水布局及四合院民居要讲究那些风水?
美国在二战中的作用
Nature子刊:喝咖啡会改变你的肠道细菌,从而影响代谢
香茅草的5种实用方法:从烹饪到保健全方位指南
如何在Word文档中插入代码?
沧州到昆明旅行预算攻略:如何以更低成本安排行程
徐州游玩必去六个景点,看看你去过几个,收藏备用吧!