求平面点集凸壳算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

求平面点集凸壳算法

李旭朝

【摘要】在分析传统平面点集凸壳算法的基础上,给出了一种新的平面点集凸壳算法,对算法步骤进行了详细说明,并对此算法可行性进行了验证,最后对算法时间复杂度进行了分析探讨,得到了很好的效果.

【期刊名称】《兰州工业学院学报》

【年(卷),期】2011(018)002

【总页数】3页(P16-18)

【关键词】极值点;夹角;子集;凸壳算法

【作者】李旭朝

【作者单位】兰州交通大学数理与软件工程学院,甘肃730070

【正文语种】中文

【中图分类】TP301.6

0 引言

凸壳即最小凸包,是包含集合D中全部对象的最小凸集,平面点集的凸壳是计算几何学中较重要、较基础的问题.在计算几何学中凸壳自身据有很多特点,也是构造其它较复杂几何形体的工具,也是基本单元.平面点集凸壳作为一种基本的结构不但在计算几何学中有很重要的作用,而且在分析GIS数据等问题时有很重要的作用,在空间分析等诸多问题中也多次用到平面点集的凸壳算法.

包含D中所有点的最小凸多边形即平面点集D的凸壳,其所有顶点均为D中的点.凸壳算法可以将许多问题归纳起来处理和解决,它在计算机图形学中有较为广泛的应用,也在一些实际技术如图像处理、模式识别等中应用较多.

传统求平面点集凸壳的算法较多,主要有卷包裹法、格雷厄姆算法、分治算法、求增量算法、实时算法等.由于在计算几何学中凸壳问题有着基础作用和重要地位,

大家都在不断的研究较快的平面点集凸壳算法.

通过对传统的平面点集凸壳算法的分析,本文给出了一种新的平面点集凸壳算法.经

实验验证求平面海量散乱点集的凸壳应用此算法效果非常好.许多实际应用问题都

可以总结为平面点集的凸壳问题来解决,如地理信息系统中的区域裁剪等实际问题. 该算法的时间复杂度是O(nlogn),无法突破最坏情况下的理论下限,但此算法也

可以向三维或者高维空间进行拓展.

1 平面点集凸壳描述及相关定义

定义1 设多边形P的顶点是给定平面内的点p1(x1,y1),p2(x2,y2),… pn(xn,yn),若线段pipj(i≠j,1≤i≤n,1≤j≤n)在多边形P内或者在多边形P上,则称P

为凸多边形.

定义2 设平面点集S={pi(xi,yi)|1≤i≤n}由平面上的点构成.若凸多边形Q的所有

顶点Qi∈S,并且Q是可以覆盖S中所有点的最小凸多边形,则称凸多边形Q为平面点集的凸壳.

定义3 求给定平面点集S={pi(xi,yi)|1≤i≤n}的平面凸壳的方法和过程称为平面点集凸壳算法.

定义4 凡能生成给定平面点集S={pi(xi,yi)|1≤i≤n, n≥3}的平面凸壳的算法,均

称为平面点集凸壳生成算法.

定义5 平面点集S={pi(xi,yi)|1≤i≤n,

n≥3}中各点的位置分布区域,称为S分布域.

定义6 平面点集S={pi(xi,yi)|1≤i≤n,

n≥3}中Xmax,Ymax,Xmin,Ymin对应的点叫做平面点集S的极值点.

2 平面点集的凸壳生成算法

此算法是研究平面散乱点集最小凸壳的算法,首先找出平面散乱点中的四个极值点(即Xmax,Ymax,Xmin,Ymin)用这四个极值点将平面点集划分为四个相对的子集,其次在这四个子集的范围内从每一个极值点分别查找与基准线的夹角,求出使该夹角最大的点,循环查找,不断的缩小求集区间,直至四个子集都查找完毕,然后顺次连接所查找出的点得到的凸多边形即为平面点集的凸壳,这种求平面点集凸壳的算法即为凸壳算法.

若存在由m个点组成的平面点集P={pi(xi,yi)|1≤i≤m},采用该凸壳算法求平面点集凸壳的算法步骤如下:

Input:m个点所组成的平面点集P={pi(xi,yi)|1≤i≤m};

Output:平面点集S的凸壳P;

step1:求点集S中的点的个数m,如果m≤3 则P=S,即S中的平面点全部为凸壳点.否则,step2;

step2:找出平面点集的所有极值点,即Xmax,Ymax,Xmin,Ymin所对应的点,则这四个极值点肯定是平面凸壳上的点.对Xmax对应的点均按Y轴的升序进行排序,求出其中Y最大的点和最小的点,如果二者相等,则取其一,另一个则舍去;对Xmin对应的点采用相同的办法.对Ymax对应的点均按X轴的升序进行排序,求出其中X最大的点和最小的点,如果二者相等,则取其一,另一个则舍去.对Ymin对应的点采用相同的办法.将这四个结果保存到数组Q中.

step3:分别在所有对应的点中取一个点,记录为Pxmin,Pymax,Pxmin,Pymin,将平面点集划分为四个子区间1,2,3,4.同时定义子区间1中的点

A={αi(xi,yi)| Xmin≤xi≤Pymax.x,Pxmin .y≤yi≤Ymax};子区间2中的点

C={ci(xi,yi)|Pymax .x

M={mi(xi,yi)|Xmin

N={ni(xi,yi)|Pymin.y≤xi≤Xmax,Ymin≤yi≤Pxmax .y}.

step4:删除子区间1中PxminPymax右边的点,记录Pxmin.在剩余的点中求每个点与Pxmin的连线,并找出其与X轴夹角最大的点,这个点将作为新的凸壳点记录.删除新的凸壳点和Pymax连线右边的点,在剩余的点中求每个点与新的凸壳点的连线,并找出其与X轴夹角最大的点,这个点将作为新的凸壳点记录.迭代查找直至子区间1查找完毕.

step5:在子区间2、3、4中分别进行step4,直至这四个子区间全部查找完毕. step6:顺次连接P中的点即生成平面点集的凸壳.

3 算法思想可行性验证

本文所述的思想和求平面点集凸壳的过程和步骤在Visual C++ 6.0编程环境下经过多次求证是可行的,部分程序源代码如下:

//差错函数,查找是否有错误的凸点

function checkerror,points

n=size(points)

istrue=1

for i=0,n[2]-3 do begin

if

mutiply

(points[0,i],points[1,i],points[0,i+1],points[1,i+1],points[0,i+2],points[1,i+2]) It 0 then begin

istrue=0 ;有凹点

break

相关文档
最新文档