【发布时间】:2011-08-07 05:33:55
【问题描述】:
我有一个我认为应该很常见的 2D 计算几何/GIS 问题,我希望找到一些现有的代码/库来使用。
问题是检查一大组(数千个)小多边形的哪个子集与单个大多边形相交。 (“小”和“大”指的是多边形覆盖的空间量,而不是定义它们的点数,尽管通常假设定义多边形的点数大致与其几何尺寸成正比. 并且为了给出比例感,将“大”视为美国州的多边形,将“小”视为城镇的多边形。)
假设使用标准 CheckIfPolygonsIntersect( P, p ) 函数(针对一个大多边形 P 对每个小多边形 p 调用)的简单解决方案太慢了。似乎有一些方法可以预处理大多边形,以使大多数小多边形的交集检查变得微不足道。特别是,您似乎可以创建一小组部分/几乎填充大多边形的矩形。同样,您可以创建一小组矩形,部分/几乎填充实际上不在大多边形内的大多边形的边界框区域。然后,您的绝大多数小多边形可以被简单地包含或排除:如果它们完全在大多边形的边界矩形之外,则它们被排除在外。如果它们完全位于内部边界矩形但外部多边形矩形之一的边界内,则将它们排除在外。如果它们的任何点在任何内部矩形内,则它们被包括在内。只有当上述都不适用时,您才需要调用 CheckIfPolygonsIntersect( P, p ) 函数。
这是一个众所周知的算法吗?您是否知道现有代码可以为任意(凸面或凹面)多边形计算一组合理的内部/外部矩形?矩形不必在所有情况下都是完美的。他们只需要填充大部分多边形,以及大部分内部边界矩形但外部多边形区域。
以下是我如何计算这些矩形的简单计划:
- 获取大多边形的边界框并在其上构建一个 10x10 的点网格
- 对于每个点,确定它是在多边形内部还是外部
- 通过在四个方向中的每一个方向上迭代扩展每个点,直到其中一个矩形边缘穿过多边形边缘之一,将每个点“增长”成一个矩形,在这种情况下,你走得太远了(这实际上是在一种“二分搜索”类型的迭代,因此只需几次迭代,您就可以找到在每个方向上扩展的正确数量;当然还有一些问题是是否一次最大化边缘或彼此一致)
- 被另一个点的扩展覆盖的任何尚未扩展的网格点都会消失
- 当所有点都展开(或消失)后,您就有了一组内部和外部矩形
当然,大多边形的某些疯狂的凹形可能会导致一些不良/小矩形。但是假设多边形大多是合理的(例如,假设它们是美国各州的形状),看起来你会得到一组很好的矩形,并且可以极大地优化你随后要做的数千次交叉检查.
该算法有名称(和代码)吗?
编辑:我已经在使用四叉树来确定可能与大多边形的边界矩形相交的小多边形。所以问题在于检查那些多边形中的哪些实际上与大多边形相交。
感谢您的帮助。
【问题讨论】:
标签: 2d intersection computational-geometry polygons