凸包问题的Graham-Scan算法及python实现


基于 Graham-Scan 的凸包求解算法是在枚举三角形时,采用了更精细的方式,将P_0作为极点,通过极角大小定位最右下侧的三角形∆P_0 P_1 P_2,然后让三角形绕P_0点旋转,扫描所有输入点,直到到最左下侧为止。


首先要对点集S进行预处理,选纵坐标最小的点作为P_0,其余点在以P_0为极点、水平方向为极轴的极坐标系下按极角从小到大排序。


Graham-Scan 算法的伪代码如下:


Graham-Scan(S):
输入:平面n个点的集合S,经预处理后存储于P[0:m]
输出:S的凸包Q
If m<=1 
Then 返回“凸包为空”
将P[0]、P[1]、P[2]依次压入栈Q
For i=3 To n-1 Do
   While Top(Q) ∈∆P[0]P[i]NextToTop(Q) Do
      Pop(Q)
   Push(Q,P[i])

随机点集S生成部分与蛮力算法相同


对点集S的预处理中,使用冒泡排序来比较两点极角大小,并将极角由小到大排序,在两点的极角相等时,保留距离P_0最远的点,删除另一个点。实现代码如下所示:


#冒泡排序来比较极角大小,将极角由小到大排序
def bubble_sort(array,p0,temp):
    for i in range(len(array)-1):
        #current_status是用来判断冒泡是否结束
        current_status = 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值