算法将多边形递归地划分为输入/输出象限:它叫什么,代码在哪里?

时间:2012-01-12 09:49:09

标签: computational-geometry quadtree point-in-polygon

我有很多点(数十万),我想检查多边形内的哪些点。对于一个相对较小的多边形(即,可能只包含几十或几百个点),我可以使用多边形的边界框作为初始检查,然后对框内的那些点进行常规的多点检查。 。但想象一个大的(即,可能包含数千个我的点),不规则形状的多边形。许多点将通过边界框检查,此外,多边形点检查将更加昂贵,因为较大的多边形由更多点组成。因此,我希望能够过滤掉大部分积分,而无需进行完整的多点检查。

所以,我有一个计划,主要是我想知道我所描述的是一个众所周知的算法,如果是这样,它的名称是什么以及我可能在哪里找到它的现有代码。我不相信我所描述的是四叉树或r树,我不知道如何搜索它。我在下面称它为“矩形树”。

这个想法是,处理这些更大的多边形:

执行“矩形树”预处理,其中矩形树的深度因多边形的大小而变化(即,允许更大的多边形的深度)。矩形树将多边形的边界框分成四个四分之一。它将检查每个四分之一矩形是否完全在多边形内部,完全在多边形外部,或者两者都没有。如果两者都不递归地划分子区域,则以这种方式继续,直到所有区域完全在内部或外部,或者达到最大深度。因此,这个想法是(a)制作这棵树的预处理时间,即使它本身会进行多个多边形点检查,也是值得的,因为时间与要检查的点数相比相形见绌, (b)绝大多数点可以使用简单的边界框检查来处理(通常是你下降树时的几个这样的检查),然后相对较小的数字必须进行完整的多边形点检查(当你到达仍然“既不”的叶节点时。

该算法叫什么?代码在哪里?事实上它写起来并不那么难,但我想在开始编码之前我会问。

1 个答案:

答案 0 :(得分:-2)

我实际上最终使用了相关但不同的方法。我意识到,我构建的树结构基本上只是以低分辨率绘制的多边形。例如,如果我的树深度为8,那就像在分辨率为256x256的位图上绘制多边形,然后对该多边形进行像素点击测试。所以我扩展了这个想法并使用了一个快速的图形库(CImg库)。我在大小为4000x4000的黑白位图上绘制多边形。然后我只是将点检查为该位图的像素。神奇的是,绘制这个巨大的位图与构建树的时间相比真的很快。所以我得到的分辨率比我用树的分辨率高得多。

一个问题是能够检测多边形边缘附近的点,即使在4000x4000大小的情况下,由于舍入/分辨率问题可能会错误地包含或排除这些点。如果您需要准确了解这些点是否在内,您可以用另一种颜色在多边形周围绘制一个笔划,如果您的像素测试击中了该颜色,您将在多边形检查中执行完整点。为了我的目的,4000x4000的分辨率已经足够好了(我可以容忍我的一些边缘点的错误包含/排除)。

因此,这种解决方案的基本技巧是多边形绘制算法与您可能“数字化”多边形的其他方法相比,速度非常快。