直线多边形交叉

时间:2011-05-21 17:17:09

标签: algorithm math geometry

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

给出herehere的答案是非常普通的多边形,而且这些解决方案非常复杂。

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

我正在寻找下图中填充绿色的多边形:

rectilinear polygon intersection with a rectangle

2 个答案:

答案 0 :(得分:2)

Preparata和Shamos的 Computational Geometry:a Introduction 一书有一章关于直线多边形。

答案 1 :(得分:1)

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

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

现在:

  • 按照x值
  • 对所有点进行排序
  • 使用扫描线,从第一个x坐标开始;对于每个新点:
    • 如果它是“起始点”,请将其添加到临时集T。如果它是来自矩形A的点和来自T中矩形B的点的y坐标之间(反之亦然),则将其标记为“最终”。
    • 如果它是“终点”,则从T中删除它及其相应的起点。

之后,标记为“final”的所有点都表示生成的多边形的顶点。

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

请注意,找到所有交叉点的任务可以合并到上述算法中,因为有效地找到所有交叉点本身通常是扫描线算法。另请注意,生成的点集可能包含多个多边形,这使得从“最终”顶点重建解多边形变得稍微困难​​。