【问题标题】:The Generalization of Bentley-Ottmann AlgorithmBentley-Ottmann算法的推广
【发布时间】:2010-11-18 09:05:37
【问题描述】:

Bentley-Ottmann 算法用于确定线列表的交点。然而正如这里提到的in Wiki,有一些缺点:

算法假设该行 线段不是垂直的,那条线 段端点不位于其他 线段,交叉点是 仅由两条线段组成,并且 没有两个事件点相同 x 坐标。然而,这些一般 位置假设不 对于大多数应用程序来说是合理的 线段交点。

我的问题是这个算法的泛化可以克服/克服上述困难吗?

【问题讨论】:

  • 我认为您可以通过修改 Bentley-Ottmann 算法来处理所有这些特殊情况。你只会失去很多算法的简单性。

标签: algorithm


【解决方案1】:

您链接到的维基百科文章有一个关于handling these special positions 的部分,其中建议对基本算法进行这些修改:

  • 按照惯例,一个点位于其垂直上方点的“左侧”;因此垂直线的“左”端点是它的端点。
  • 事件可能包括两条或更多条线的交叉点。
  • 到达事件点时,其事件段必须在扫描线中反转(不仅仅是交换,因为可能不止两个)。
  • 在处理过路口后,可能会有两个以上旧的事件点被移除或超过两个新的事件点被插入。

【讨论】:

    【解决方案2】:

    这些是对 Skanthak here: 提出的算法的修改。

    算法进行如下:它首先为输入段的所有起点和终点创建事件。 然后它按排序顺序处理所有事件。
    对于每个事件,它获取 从该点开始的段的关联列表 L 并找到并删除搜索树中的所有段 与当前事件点相交。 它将所有这些段报告为该点的交叉点。 然后切换比较函数的顺序 通过将标志更改为稍晚于当前事件。 它会重新插入之前删除的所有片段 在当前事件点没有他们的端点 (因为它们必须被删除 无论如何,从此时的结构来看) 并另外插入来自 L 的段 (从此时开始)。 它检查顶部和底部的邻居 新交叉口的当前事件点上方和下方 并在发现时将它们添加为事件点。
    这样算法是健壮的 对抗各种退化, 包括垂直段和重叠段, 以及在其端点上相交的线段。

    for all segments s do
      Create events for the endpoints of s
    end for
    while event queue not empty do
      Remove the smallest event point p from the queue
      Let L be the set of segments that start at p
      I ← all segments in the sweep line structure that contain p
      remove I from sweep line structure
      if |L| + |I| ≥ 2 then
         Report intersections of L ∪ I
      end if
      C ← {s ∈ I | p is not endpoint of s}
      Insert C in sweep line structure in reversed order
      Check for new intersections among segments above and below p
    end while
    

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多