【发布时间】: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 没有提供单一的解决方案。再一次,这一切都取决于应用程序。