凸包问题的Graham扫描算法实现

凸包定义:

 

   平面点集S的凸包定义为包含S中的所有点的最小凸多边形。

凸包问题:

  1. 给出点集S,求出S的凸包的顶点(极点)。
  2. 以顺(逆)时针方向输出求得的凸包的顶点。                                                                                         

算法:

  1. Graham扫描算法 (  O( n*logn) )
  2. QuickHull算法(  O( n*logn) )

算法预备知识:

  • 考虑从点p1=(x1,y1)到另一个点p2=(x2,y2)的有向线段<p1,p2>. 如果q=(x3,y3)是另外一个点。定义:q在<p1,p2>的左(右)边,若向量<p1,p2>与<p2,q>的外积大(小)于0 

算法基本思想:

  • Graham扫描算法 : 大体思路是将不是凸包顶点的点从点集中去掉。
  1. 找出S中具有最小y坐标的点p(通过选取最左边的点打破平局)
  2. 根据点和p的连线 与 x轴正方向所成的角度,对S中的点进行排序(由小到大),并将p放在最前面。
  3. 从p点开始扫描排序后的S集合。如果这些点都在凸包上,则每三个相继的点p1,p2,p3满足以下性质:p3在向量<p1,p2>的左边.如果出现相继的三个点p1,p2,p3不满足上述性质,则p2点一定不是凸包的顶点,应立即去除。        

以下是Graham扫描算法具体实现:实现过程中使用了链表。实际上,使用双向链表会使得代码更加简洁,但同时会增加空间。  该算法实现面向过程。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值