二维平面的凸包构建

关于凸包的定义,可以参见http://zh.wikipedia.org/zh/%E5%87%B8%E5%8C%85http://home.pacific.net.hk/~kfzhou/Hulls.html上面的解释。今天主要讲的内容是二维平面的凸包构建方法,也是读computational geometry in c的总结。

首先定义extreme point:平面上凸包的顶点,并且在那个点上的向内的角度小于180(注意不能等于180)。Definition of extreme points: a set of points in the plane are the vertices of the convex hull at which the interior angle is strictly convex, less than 180.

1.如果只要寻找extreme points的话,其实只需要找出nonextreme point,有一个简单的引理:a point is nonextreme if and only if it is in some triangle whose vertices are points of the set and is not itself a corner of that triangle.于是要寻找extreme points,只要按照上述引理做就可。

2.gift wrapping算法:这个算法的核心思想是使用一个hull上的顶点来预测下一个顶点。计算其他顶点到这个顶点的与x轴的夹角,从中重选择夹角角度最小的那个点,这个点就是hull上的下一个点,依次做完 整个set,直到hull闭合。

3.QuickHull算法:这个算法的核心思想是一个点c是距离ab最远的,那么它在hull上。其中a,b是hull上已经存在的两个顶点,ab是它们之间的边。初始值选a,b为输入点集中的最左边和最右边的两个点,计算ab右边距离ab边最远的点c,于是c是hull上的顶点,然后计算ac,cb(注意顺序)右边距离的ac,cb最远的点,依次递归求解。对于ab的左边使用的同样的方法求解。这里面有一个问题:就是如果同时村很多点到ab最远,这时怎么处理?大家好好想想。

4.GRAHAM算法:这个算法首先计算选定一个hull上的点,计算输入点集中的点与它的角度相对于x轴,进行排序,在一个stack1中保存上述的排序结果,角度大的在下面。当pop stack1第一个点时,这个点由上述的gift wrapping算法知,它也是hull上的点,并将他们保存另一个stack2中。接下来继续pop stack1,当pop出来的点和stack2中前面两个点构成的三角形normal是朝上的话,将这个点push到stack2,然后继续pop stack1。否则将stack2中的第一个点pop,然后继续pop stack1。直到stack1为空。关于第一个点的选择,可以选输入点集中的最右下角的那个点,它肯定在hull上。这个算法同样有多点共线的问题,就是计算的出来的角度是一样的点,这时在入stack1的时候将距离原点近的点放在上面即可。

5.incremental algorithm:这个算法的核心思想是通过添加点到存在的hull来实现的。需要初始化一个使用输入点集中三个点组成的hull,然后开始添加其他点。如果要添加的点p在hull内,直接将它删除,如果不在,这时使用需要将它添到存在的hull上。这时使用原来hull的切线来定位哪两个顶点和p连线。对于每个点i,如果p在i-i-1和i-i+1两直线的不同侧,即p在一直线的左侧,在另一直线的右侧。这时将p和i相连。上述的方法使用到没有顶点可以添加为止。一个问题:how to imporve the algorithm speed using the prsorting points, which is sorted by their x coordinate?

6.divide and conquer算法:这个算法是一个递归的算法。算法的步骤就是1,对所有点排序,使用的同样是x coordinate。2,将点集分为两个子集,根据的是他们的排序。3,对子集进行求hull。4,合并子集的hull。主要是其中的合并,将两个hull合并为一个,使用的方法和上面有点相似,同样引入切线,但是这时需要寻找到两条连接hull(A),hull(B)上点的边,使对于其中一条边,A,B上的点都在左边,在另一条的右边。假设A在左边,B在右边,初始化为A的最右边的点,B的最左边的点。然后通过移动这条直线往上,下,直到A,B上的点都下面的边的左边,A,B上的点都上面的边的右边为止。

 

上述的所有算法可能描述的不是很清楚,具体请看原书,computational geometry in c。

我的mail:fire_fuxm@hotmail.com

转载于:https://www.cnblogs.com/USTC-fuxm/archive/2011/09/08/2171122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值