2011-05-21 179 views
8

我正在寻找/尝试为rectilinear polygon交叉矩形开发最佳算法。我正在测试的多边形没有孔。直线多边形交集

类似herehere的答案适用于非常一般的多边形,并且解决方案的理解相当复杂。

希望S.O.社区可以帮助我记录只有直线多边形的特殊情况的算法。

我找下面充满绿色的图像中的多边形:

rectilinear polygon intersection with a rectangle

+0

是直线多边形的边和平行于轴的矩形? – 2011-05-21 19:45:56

+0

@Andre - 是 - 所有行都是平行的 – jedierikb 2011-05-21 19:47:46

+0

作为第一个想法,将直线多边形存储在[segment tree](http://en.wikipedia.org/wiki/Segment_tree)(二维)中我脑海。假设直线多边形是不变的矩形,而且矩形也是变化的。 – 2011-05-21 19:53:57

回答

2

计算几何:通过Preparata的介绍和Shamos对直线多边形的一章。

+1

谢谢。我会看第2章和第8章。我看到我想要的术语是等度多边形。 – jedierikb 2011-05-21 19:32:00

1

使用扫描线算法,利用直线多边形由其顶点定义的事实。

表示顶点以及它们所属的矩形,即类似(x, y, #rect)。对于这组点,添加由所有边的交点所产生的点。这些新点的格式为(x, y, final),因为我们已经知道它们属于所得到的一组点。

现在:

  • 排序的x值
  • 所有点使用扫描线,从第一个x坐标;对于每个新点:
    • 如果它是“起点”,则将其添加到临时集T。如果它是来自矩形A的点,并且来自T中的矩形B的点的y坐标(或反之亦然),则将其标记为“最终”。
    • 如果它是一个“终点”,从T.

之后删除它和它的相应的起点,被标记为“最终”的所有点表示结果多边形的顶点。

设N是点的总数。进一步假设测试我们是否应该将点标记为“最终”,通过查找T花费时间O(log(n)),整个算法在O(N * log(N))中。

请注意,查找所有交叉点的任务可以合并到上述算法中,因为通常有效地查找所有交点本身就是一个扫掠线算法。还要注意,得到的一组点可能包含多个多边形,这使得重建“最终”顶点之外的解多边形变得稍微困难​​。