通过填充矩形来检查许多(小)多边形与一个(大)多边形的交叉点?

时间:2011-04-17 07:55:43

标签: 2d intersection computational-geometry polygons

我有一个2D计算几何/ GIS问题,我认为应该是常见的,我希望找到一些现有的代码/库来使用。

问题是要检查大型多边形(数千个)小多边形的哪个子集与单个大多边形相交。 (“小”和“大”我指的是多边形覆盖的空间量,而不是定义它们的点的数量,尽管通常假设定义多边形的点的数量与其几何尺寸大致成比例为了给出一种比例感,可以将“大”视为美国一个州的多边形,将“小”视为一个城镇的多边形。)

假设使用标准CheckIfPolygonsIntersect(P,p)函数的朴素解决方案,针对一个大的多边形P调用每个小多边形p,太慢了。似乎有一些方法可以预处理大多边形,使大多数小多边形的交叉检查变得微不足道。特别是,您似乎可以创建一小部分矩形,这些矩形部分/几乎填充大多边形。类似地,您可以创建一小部分矩形,这些矩形部分/几乎填充大多边形的边界框区域,该区域实际上不在大多边形内。然后,绝大多数小多边形可以被简单地包含或排除:如果它们完全位于大多边形的边界矩形之外,则它们被排除在外。如果它们完全位于内部边界 - 矩形但外部 - 多边形的一个边界内,则将它们排除在外。如果他们的任何积分都在任何内部法案中,则包括在内。只有在上述情况都不适用的情况下,您才需要调用CheckIfPolygonsIntersect(P,p)函数。

这是一个众所周知的算法吗?您是否知道现有代码可以为任意(凸面或凹面)多边形计算一组合理的内部/外部矩形?矩形在所有情况下都不一定是完美的;他们只需要填充大部分多边形,以及大部分内部边界 - 矩形但外部多边形区域。

这是一个关于如何计算这些矩形的简单计划:

  • 取大型多边形的边界框,然后在其上构建一个10x10网格点
  • 对于每个点,确定它是在多边形内部还是外部
  • 通过在四个方向中的每个方向上迭代地扩展它来将每个点“生长”成矩形,直到其中一个矩形边缘穿过其中一个多边形边缘,在这种情况下,你已经走得太远了(这实际上是在一个“二分搜索”类型的迭代,所以只需几次迭代就可以找到在每个方向上扩展的正确数量;当然,还有一个问题是,是一次一个地最大化边缘还是彼此协调一致)
  • 任何未被扩展的网格点被另一个点的扩展所覆盖就会消失
  • 当所有点都已扩展(或已消失)时,您拥有一套内部和外部矩形

当然,大多边形的某些疯狂的凹形可能会导致一些差/小矩形。但假设多边形大多数是合理的(例如,它们是美国各州的形状),看起来你会得到一组好的矩形,并且可以大大优化你随后做的数千个相交检查

该算法是否有名称(和代码)?

编辑:我已经在使用四叉树来确定可能与大多边形的边界矩形相交的小多边形。所以问题在于检查哪些那些多边形实际上与大多边形相交。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在您的计划中,您描述了与签名距离地图方法非常相似的内容。谷歌的“距离图算法”了解详情。我希望这将是你正在寻找的。