0

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

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

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

做一个“矩形树”预处理,矩形树的深度随多边形的大小而变化(即,允许更大的多边形有更多的深度)。矩形树将多边形的边界框分成四等分。它会检查每个四分之一矩形是否完全在多边形内,完全在多边形外,或者两者都不。在两者都不是的情况下,它不会递归地划分子矩形,以这种方式继续,直到所有矩形都完全在内部或外部,或者已经达到最大深度。所以这个想法是(a)制作这棵树的预处理时间,即使它本身会做几个多边形点检查,也是非常值得的,因为这个时间与要检查的点的数量相比相形见绌,

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

4

1 回答 1

-2

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

一个问题是能够检测到多边形最边缘附近的点,由于舍入/分辨率问题,即使在 4000x4000 尺寸下,这些点也可能被错误地包含或排除。如果您需要准确地知道这些点是在里面还是在外面,您可以用另一种颜色在多边形周围画一个笔划,如果您的像素测试达到该颜色,您将在多边形检查中进行完整点。就我的目的而言,4000x4000 的分辨率已经足够好了(我可以容忍我的一些边缘点不正确的包含/排除)。

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

于 2013-06-26T16:43:09.780 回答