二维平面的凸包构建

关于凸包的定义,可以参见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

posted on 2011-09-08 11:15  fire_fuxm_USTC  阅读(558)  评论(0编辑  收藏  举报