【问题标题】:rectilinear polygon intersection直线多边形相交
【发布时间】:2011-08-30 07:24:14
【问题描述】:

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

herehere 这样的答案是针对非常一般的多边形的,可以理解,解决方案相当复杂。

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

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

【问题讨论】:

  • 是直线多边形的边和平行于轴的矩形吗?
  • @Andre -- 是的 -- 所有线都是平行的
  • 首先想到的是,我想到将直线多边形存储在segment tree(二维)中。假设直线多边形是不变的,而矩形是变化的。
  • 是的,您关于什么是可变的和什么不是的假设是正确的。感谢您的建议。

标签: algorithm math geometry


【解决方案1】:

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

【讨论】:

  • 谢谢。我会看第 2 章和第 8 章。我看到我想要的术语是等角多边形。
【解决方案2】:

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

表示顶点以及它们所属的矩形,例如(x, y, #rect)。对于这组点,添加由所有边的交点产生的那些点。这些新点的形式为(x, y, final),因为我们已经知道它们属于结果点集。

现在:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2021-07-13
    • 2013-10-16
    • 2015-09-21
    • 2014-07-28
    • 2018-01-09
    • 2016-11-18
    • 2021-11-17
    相关资源
    最近更新 更多