一种改进的判断点在多边形内外的算法

计 算 机 工 程 第38卷 第12期

2012年6月

索引算法,在判断点在凸多边形内的时间复杂度为(1)O ,但是对于任意简单多边形来讲,梯形化是最快的方法,其时间复杂度为(log )O n 。基于二维空间二分查找树(BSP 树)进行点在多边形内判断就是梯形化思想的一种实际应用。

经典的基于BSP 树的算法思想如下:首先将任意简单多边形进行水平分解,形成一组水平扫描线,并使用BSP 树对这些线进行管理;其次,每两条水平扫描线形成一个条带区域,在每个条带的内部,依据经过多边形的边,构成一棵与多边形边相关的BSP 树。

当进行点在多边形内查询时,首先使用条带BSP 树查找定位点所在的条带;其次,使用边BSP 树确定最终点所在的区域,进而判断出点是否在多边形内部。使用上述算法构造BSP 的树,进行查找的时间复杂度为(log )~()O n O n 。本文研究发现造成最差时间复杂度()O n 的原因是当BSP 树的每个结点同时仅有左子树或者仅有右子树时,整个树就退化成为环非自交,如图1。取任意多边形外环的方向为逆时针方向,内环的方向为顺时针方向。

图1 任意简单多边形基金项目:国家高技术研究发展计划(863)(2006AA06Z114);国家科技支撑计划(2006BAB01A01);中央国家机关基本业务费基金项目 作者简介:李 楠(1980-),男,工程师、博士,主研方向:地图制图学与地理信息工程;肖克炎,二级研究员、博士、博士生导师 收稿日期:2011-0-0 E-mail :Superln1980@https://www.360docs.net/doc/404719118.html,

网络出版时间:2012-04-27 16:10

网络出版地址:https://www.360docs.net/doc/404719118.html,/kcms/detail/31.1289.TP.20120427.1610.025.html

2 计 算 机 工 程 2012年6月20日 定义1-2 二维空间分区二叉树

Fuchs,Kedem 和Naylor [15]首先提出利用二叉树对空间进行分区的方法,这种方法在许多的应用中都非常有效。

考虑平面上一条直线方程0nX c

,显然,这条直线将整个平面分为两个半平面。向量n 所指向的直线的一侧叫做这条直线的正侧;而另一侧叫做直线的负侧。同时,每一个半平面都可以使用平面上的另一条直线来进行分区。得到的正的和负的区域又可以进一步分区。用二叉树来表示得到的分区结果,如图2(a),二叉树的每一个节点都表示一条分区直线。一个节点的左子树表示该节点所表示的分区直线的正侧;右子树表示该节点所表示的分区直线的负侧。二叉树的叶子节点表示分区得到的凸区域。如图2(b)显示了表示的方法。其中P 代表分区直线,C 代表凸区域。

T L 和T R 分别是其左子树和右子树,那么当T 满足以下条件时,T 是一棵平衡树:

①T L 和T R 是平衡树;

②1L R h h ,其中h L 和h R 分别是左子树和右子树的高度;

2.2 算法流程

构建多边形的空间分区二叉树的方法是,建立一系列节点,使得每一个节点都表示一条包含多边形的分区直线[1]。分区直线将多边形的其他边分解到不同的节点上。即,位于一条直线的左(正)侧的任何子边都被送往左(正)子树。针对每一个符合条件的节点,重复这种处理。位于一条直线右(负)侧的任何子边都被送往右(负)子树,也重复这种处理。多边形的另一条边也可能完全位于分区直线上,这种边被成为一致边,也存放在表示分区直线的节点上。在这种构建中,至少有一条多边形的边包含于分区直线中。

2.3 算法涉及的数据结构

算法所需的数据结构主要包括:扫描带BSP 树及其对应的一组梯形BSP 树。

struct BSPPOINT //坐标点数据结果 {

double x,y; };

struct BSPEDGE {

//结点边类型默认方向为由pt1到pt2 BSPPOINT pt1,pt2; };

struct CBSPTreeNode //BSP 树结点 {

BSPNODEREGIONID} ; //区结点

变量m_enumChildNodeType 为枚举类型,表示结点是父结点的哪个孩子。

Enum ENUMBSPCHLIDTYPE

{ BSPCHILDNODENULL, //初始值 BSPLEFTCHILD, //左孩子 BSPRIGHTCHILD} ; //右孩子

2.4 水平条带BSP 树的构建及其算法改进

设存在多边形P ,如图3,多边形各个顶点的排列方向为逆时针。假设边k s 包含端点(0x ,0y )和(1x ,1y ),则存在分量0.k s x ,0.k s y ,1.k s x 和1.k s y 指定。在处理第一条边1s 时,其

y 值1.s y 要求当前的扫描带被分为两个带,每一个条带包含

一个表示一个半平面的梯形(如图4(a))。值11.s y 导致另一个扫描带被分解,每一个都包含一个梯形(如图4(b))。当划分完扫描带以后,将边1s 插入,也就是说插入到二叉查找树中。

第38卷 第12期 3 李 楠,肖克炎:一种改进的判断点在多边形内外的算法 这将导致中间的梯形被分为两个梯形(如图4(c))。

图5 边2s 插入结果

对于余下的各条边,可以使用相同的方法来处理。最后

4 计 算 机 工 程 2012年6月20日

3 改进算法的实现

算法改进的核心思想是在构建扫描条带树之前,对所有顶点的Y 值进行排序。同时,按照折半遍历的顺序构建条带BSP 树,最终得到一棵平衡的二维空间二分查找树。 3.1 二维空间分区查找树水平剖分算法实现

算法1(水平分解任意简单多边形) 函数名称:HorizonDecompose 输 入:任意简单多边形P 输 出:扫描带二叉查找树S Step 1 构造多边形P 的外包围盒; Step 2 对多边形P 上的端点排序; Step 3 将水平扫描线按照折半的顺序分割外包围盒,生成S ;

Step 4 遍历多边形P 上的边

e ,将e 分别插入到其所在进行点在多边形内查询的过程中,当待测点的Y 值正好等于某一条扫描带的Y 值时,需要进行单独的讨论。

图10 点p 在扫描线上为了解决这种问题,本文算法将点p 分别向上和向下移动一个p ?,对两次移动的结果分别进行点在多边形内查询。如果两次判断的结果同时为内(外),则点在多边形内(外)。如

果一次在内,一次在外,则只能使用其他方法进行判断。如图10所示点p 的情况。

4 算法复杂度分析

本文算法中BSP 树构建和查找两个步骤的时间复杂度都不能省略。具体分析如下:

在构造BSP 树的过程中主要包含三个步骤,即扫描线排序,构建扫描带BSP 树和构建扫描带对应的BSP 树。扫描线排序的同时还需要进行去除重复点的计算,因此使用AVL 树结结构,其建树的过程就是排序的过程,因此其时间复杂度为()O n 。经典算法[1]中BSP 树构造的时间复杂度为

(log )O n n ,创建条带对应的BSP 树的时间复杂度为(log )O n m ,其中m 表示每一条带内平均包含的边的个数。一

般m n ,因此在最坏情况下,使用平行剖分法进行点在多边图11 使用的测试多边形

测试多边形,如图11所示,为单调多边形。设该多边形的顶点排列顺序为逆时针,由经过B 点的水平扫描线开始分割多边形的外包围盒。则使用改进前后的算法创建二叉树的形态见图12和13所示。

图12 经典算法建树结果

第38卷 第12期 5

李 楠,肖克炎:一种改进的判断点在多边形内外的算法

图13 改进算法建树结果

1995;19(4):595–600.

[5] Feito F, Torres JC. Inclusion test for general polyhedra[J].

Computers& Graphics 1997;21(1):23–30.

[6] Preparata FP, Shamos MI. Computational geometry: an

introduction[M]. New York: Springer; 1985.

[7] Taylor G. Point in polygon test[J]. Survey Review 1994, 32:

479–84.

[8] Rueda AJ, Feito FR, Rivero M. A triangle-based representation

forpolygons

and its applications[J]. Computers &

Graphics2002;26(5):805–14.

[9] Wang W, Li J, Wu E. 2D point-in-polygon test by classifying

edgesinto layers[J]. Computers & Graphics 2005;29(3):427–39. [10] Huang CW, Shih TY. On the complexity of point-in-

polygonalgorithms[J]. Computers

&

Geosciences

point-in-polygon

Computers & M, Schwarzkpf

and applications. 2nd trapezoidation by

&

Graphics

on dynamic

Theory and On visible surface

of SIGGRAPH, 数据结构、算法与应用

[J].

编辑

相关文档
最新文档