凸包

凸多边形

--整个图形在任一条边的一侧

 

凸图形

--任意两个内点在任一内分点也在内部

 

凸包

--对于一个平面点集或者一个多边形,它的凸包指的是包含它的最小凸图形或最小凸区域

 

凸包的求法

  --从最左边的最低点P0开始

  --找到一个点P1,使得P0为起点的水平方向的射线到P0P1的角度最小

  --然后找下一个P2,使得P2P1到P1P0角度最小。

  --。。。。。。

  --则P0P1P2....Pm是凸包上的顶点

 

  --实际比较的时候,不一定要用角度来衡量

  --可以采用叉乘来判断:只要知道相对的方向(顺时针还是逆时针)就可以

    --比如判断AC1和AC2的夹角大小,只要判断AC1在AC2的右边

  --这样每次查找需要O(n)的时间复杂度

  --因此总的时间复杂度为O(n2)

 

卷包裹法的特殊情况

--多点共线的情况

  --输出包括所有共线点

  --输出不包括所有共线点

--解决

  --如果要共线点:则共线的时候,根据与上一个凸包中的点发的距离从近到远选取

  --如果不要共线点,则从远到近选取

Graham-Scan法

--卷包裹法每一步都确定性的求出凸包上的一条边

Graham-Scan算法每一步是得到一个临时的凸包

  --只要当前点在上一条边的左手方向,就加入这个点;否则回溯,直到新的点在左手方向为止

 

极角序:

  --以一个内部点X为中心,点集中的所有点按关于X的极角逆时针排序,就以X点出发向右延伸,平行于X轴的一条射线为排序的起始位置

  --但是不便于计算,不能用叉乘,而需要用到三角函数

  --还要保证起点一定在凸包上,否则会出错

Graham-Scan法序的选取

--选取最低点中最左的一个作为参考点

--用叉乘来排序所有点的相对位置

--时间复杂度

  -排序O(n log n)

  -扫描O(n)

  -总的是O(n log n)

Graham-Scan法的特殊情况

重复点

--删除

共线点

--对于不要求求共线点的情况,可以对叉乘做严格的判定

--对于要求求共线点的情况,没有办法简单而完美的处理:

  -A、B两点没有办法都加入凸包中

 

Graham-Scan法的另外一种序

用水平序

--先按Y坐标排

--Y相同的按X坐标排

2次扫描

--先从第1个点即0开始到最后1个点即9得到右链

--再从最后一个点即9点开始到第1个点即0,不包括已经在右链的点

 

处理特殊情况

--如果不要共线的点,则严格判断叉乘(即只有在左边才可以)

--如果要共线的点,则叉乘等于0即共线也认为可以

直观理解

   

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/yoru/archive/2012/09/27/2706144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值