【问题标题】:Overlapping segments in Bentley-Ottmann AlgorithmBentley-Ottmann 算法中的重叠段
【发布时间】:2018-01-19 19:28:01
【问题描述】:

我正在尝试根据Mark de Berg, et al. Computational Geometry Algorithms and Applications Third Edition 书中的描述实现 Bentley-Ottmann 算法。没有关于支持重叠(共线而不是不相交)段的明确声明,但是精确描述了另一种退化的情况。

wikipedia 我发现存在处理所有退化情况的实现,它在Bartuschka, U.; Mehlhorn, K.; Näher, S 中描述。但是很难理解。

here 提供的方法完全相同。在 4.3 小节中,我发现了以下内容:

线扫描算法的基本成分可以追溯到 Bentley 和 Ottmann 从 1979 年开始工作。这里讨论的特殊公式考虑了所有可能的简并,归功于 Mehlhorn 和 Näher。

经过深入研究,我得出的结论是,唯一的区别是扫描线是从左到右,而不是像德伯格的书中那样从上到下。但我不明白为什么这个算法会处理重叠段。我想看看为什么这些段被正确处理以及它们是如何处理的一些证据。我们应该输出什么作为相交:根本没有相交或线段相交于无数个点?

(我已经看过The Generalization of Bentley-Ottmann Algorithm。)

请帮我弄清楚这个算法如何以及为什么处理重叠片段

【问题讨论】:

  • IMO,处理此类特殊情况时的真正挑战是 1) 以在数值上有意义的方式检测这些情况,以及 2) 决定如何处理这些情况(例如,如何表示不是一个点的交叉点?)。这些方面取决于应用程序。
  • @Yves Daoust 我已经解决了应用定点算术的第一个问题。第二,我将使用这个实现作为实现另一种算法的基础,所以我认为输出应该是某种通用形式,可以获取所有信息(交叉点列表、重叠点)。现在我正在尝试根据 Sneftel 的回答来实现它,但是每次我解决所有问题时,都会出现一些未经考虑的情况,这些情况在我的测试中断时会出现重叠。似乎需要在书中对算法的描述中添加一些细节。
  • 定点算术如何使其在数值上有意义?并且“根据 Sneftel 的回答实施它”:Sneftel 没有提供单一的解决方案。再一次,这一切都取决于应用程序。

标签: computational-geometry


【解决方案1】:

重叠(我假设您的意思是共线而不是不相交)段并不难处理。你有几个选择。

  • 您可以在事件中遇到重叠片段时合并它们,将它们视为一个片段以用于算法。
  • 您可以决定重叠段根本不相交,在这种情况下,您实际上不需要做任何事情,除了在事件中过滤掉那些相交。但是,为了简化事件处理和在序列上定位段的逻辑,为段提出规范顺序很有用,这样如果两个段共线,则使用该顺序来确定哪个在最上面.

【讨论】:

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