Page 332 - 《软件学报》2025年第9期
P. 332

李佳玮 等: 基于网格行创建条带结构的点在多边形内判断方法                                                   4243


                 之则在多边形内. 这类方法的计算复杂度较高, 为               O(N), N  为多边形的边数. 为降低测试计算复杂度, 许多方法提
                 出特定数据结构管理多边形的边, 使得每次测试时无需处理多边形的所有边, 如将多边形分解成较简单形状的梯
                 形法  [12] 、凸剖分法  [13] 、分层法  [14,15] , 以及对多边形的包围盒进行均匀划分的网格法        [4,5] 、层次化迭代划分的四叉
                 树、KD  树  [16] 、三叉树  [17] 等. 这些方法能很好地降低检测的计算复杂度, 比如梯形法             [12] 的计算复杂度为   O(logN).
                 在这些方法中, 网格法是应用最广泛的方法之一, 因为其易于实现, 且计算效率较高. 为提高网格法的效率, 已有大
                 量相关研究    [4−7,18] , 比如中心点法  [6] 预计算每个网元中心点位于多边形内/外的属性, 在检测时, 只需计算点与网元
                 中心点之间的连线与其所在网元中的多边形边片段的相交次数. 这样处理可很好地减少需要求交测试的边数量,
                 因为该连线较短, 可简便剔除许多与连线不相交的边.
                    网格法的一个困境是网格分辨率的处理. 如果网格分辨率低, 则网元较大, 每个网元所包含的多边形的边就
                 多, 对测试点进行测试时要处理的边就多, 检测效率会降低. 反之, 如果网格分辨率高, 每个网元所包含的多边形的
                 边就少, 有利于测试效率的提高, 但此时网元数量较多, 使得网格结构的创建开销较大, 不便处理动态多边形或边
                 数很多的大规模多边形. 对此, 近期提出的网元法              [8] 对每个网元中的边进行条带结构的组织, 能较好地化解检测效
                 率对于网格分辨率的敏感性, 大幅提升点在多边形内的检测效率. 这是因为网格分辨率较少, 使得网元较大, 所含
                 多边形的边多, 则网元中的条带就较多; 反之, 网格分辨率较大, 则网元较小, 所含多边形的边少, 因而网元中的条
                 带较少. 但该方法在条带结构的创建时, 会产生过多的条带、有许多冗余计算, 且其空间需求较大, 妨碍了其在
                 GPU  上的实现, 见引言中相关讨论. 对此, 本文提出行元法, 以改进网元法的不足, 将更好地促进相关应用的发展.

                 2   网元法简介

                    网元法   [8] 是一个基于网格单元均匀划分的点在多边形内检测算法. 该方法将多边形的包围盒向外扩张少许,
                 使得包围盒的边均位于多边形外; 然后, 对扩张的包围盒进行均匀的网格划分, 并根据每一个网元内的多边形片段
                 创建条带结构, 见图      1.
                    不失一般性, 根据图      1  对网元法进行简要介绍. 在此, 由浅色实线划分而得的均匀网格单元, 即是网元; 网元中
                 由断线和双细实线分割而成的每个矩形框就是一个条带, 每个条带中的所有多边形边, 均与该条带的左右两边相
                 交. 每个条带记录以下信息: 该条带所包含的多边形的边, 该条带上端位于多边形内/外的属性.
                    基于这样的组织结构, 点在多边形内的检测, 按以下步骤进行.
                    1) 根据测试点的坐标, 以      O(1) 的时间获知其所在的网元.
                    2) 根据该测试点的     x 坐标, 对比该网元中各个条带的         x 坐标范围, 可知测试点所在的条带.
                    3) 从测试点发出的一条垂直于         x 轴的向上射线, 检测该射线与条带中的边相交情况, 统计相交的边的数量. 根
                 据射线法的原理, 如果有偶数条边相交, 则测试点位于多边形内/外的属性与该条带上端位于多边形内/外的属性相
                 同, 否则相反.
                    基于网元法进行点在多边形内的判断具有很高的执行效率, 其原因如下: 1) 只需处理一个条带中的多边形的
                 边, 且一个条带所含的多边形的边一般较少; 2) 测试点发出的射线与                   x 轴垂直, 使得该射线与一条边的相交测试可
                 以较少的计算来完成, 其处理为: 根据该测试点的               x 坐标, 计算该边的相应点的       y 坐标, 并比较该    y 坐标是否大于
                 测试点的   y 坐标, 即可知晓射线是否与该边相交; 3) 一个条带中的边均与该条带的左右两边相交, 因此, 检测测试
                 点发出的射线与这些边的相交情况时, 便于在              GPU  上进行高效的并行化实现.
                    下面, 介绍网元法的条带结构的生成步骤如下.
                    1) 对多边形的每条边, 计算其与各个网格划分横线               (平行  x 轴的网格线) 的交点     x 坐标  (交点的  y 坐标即横线
                 的  y 坐标), 由此知晓各个网元中所包含的多边形边的片段情况.
                    2) 根据每个网元中所含的多边形边的片段, 创建该网元中的条带结构. 在此, 依据网元内的多边形顶点                             (如图  1
                 中的  D  点), 以及多边形的边与该网元的上、下网格横线的交点                (如图  1  中的  d i 、x j  (i, j = 1,…,4)), 由它们的  x 坐标
                 生成平行   y 轴的直线段    (如图  1  中的双实线), 即得到了该网元内的条带划分结构. 当然, 相邻网元之间的分隔线也
   327   328   329   330   331   332   333   334   335   336   337