【问题标题】:Bentley-Ottmann Algorithm For Two Groups of Lines Segments两组线段的 Bentley-Ottmann 算法
【发布时间】:2010-12-29 11:38:11
【问题描述】:

Bentley-Ottmann 算法用于计算线段的交点。

但是,我不想找到所有线之间的交点,而是要找到两组线之间的交点。也就是说,对于线组A 中的每一行,我都想知道这些线与B 组中的线之间的交点。

无论如何我可以为此扩展Bentley-Ottmann algorithm 吗?我已经实现了现有的 Bentley-Ottmann 算法 (in the library of CGAL),我不想修改它。然而,我渴望找到重用和扩展它的方法。

编辑:欢迎任何其他算法(不一定基于 Bentley-Ottmann)。如果这些算法已经在现有库中实现会更好。

【问题讨论】:

    标签: algorithm geometry computational-geometry line-intersection


    【解决方案1】:

    您可以在A+B 中找到所有线之间的所有交点,然后删除同一集合中的线之间的交点。您不会增加太多复杂性,这允许您使用 CGAL 的库函数,而无需修改,只需一个简单的包装函数。

    【讨论】:

    • @Thanks marcog,一个相关的问题:有没有其他算法可以做到这一点?最好在现有的计算几何库中找到它。
    • @Ngu 我不知道有什么会如此有效。您添加的条件并没有使它更容易解决。即使您尝试改编bentley-otterman,您仍然必须在同一集合中的线相交时处理事件以保持它们在y中排序。
    【解决方案2】:

    Bentley-Ottman 保留一棵按当前垂直位置排序的线段树,难道你不能保留 两棵 棵树,A 组和 B 组各一棵吗?然后在原始算法检查当前点上方和下方的邻居时,您将检查上方的 A 邻居和下方的 B 邻居,反之亦然。

    这是基于对维基百科文章的快速浏览;在过去的十年里,我没有写过多少几何代码。

    【讨论】:

      【解决方案3】:

      为完整性添加此答案,即使它可能不是二维的最有效方法。

      在 3D 图形中,它共有 2 个 KD 树,可用于检测所有重叠节点(可用于几何上的布尔运算)。

      工作示例(C 代码)。 https://developer.blender.org/diffusion/B/browse/master/source/blender/blenlib/intern/BLI_kdopbvh.c;3b4a8f1cfa7339f3db9ddd4a7974b8cc30d7ff0b$1089

      如果有许多小段(例如手绘线的路径),这将相当有效。但是,如果有很多长边(想想拾音器)...这将表现不佳,您可能希望拆分 BVH 树中的叶节点以获得更好的性能。但是,如果是这样的话,最好使用其他答案中建议的不同方法。

      【讨论】:

        【解决方案4】:

        是的,Bentley-Ottmann 算法可以与其他方法一起进行扩展。

        在文学作品中,您描述的任务是报告红线和蓝线之间的交点

        这是一篇将 B-O 扫描扩展到最优算法的论文。 http://www.cs.unc.edu/~snoeyink/demos/rbseg/jcdcg25.pdf

        我不同意@marcog 关于复杂性的说法。链接的论文声称 O(n log(n+k)) 的最佳时间,如果过滤交叉点,则必须对所有行执行 B-O 扫描,它将是 ((n+k) log n)。

        还有其他类似的算法可能不需要复杂的数据结构http://www.cs.swarthmore.edu/~adanner/cs97/s08/pdf/palazzi93counting.pdf

        对于更少的边缘和边缘之间的交叉点,@marcog 的答案中的解决方案可能效果很好。 (这里有一个来自 CGAL http://doc.cgal.org/latest/Arrangement_on_surface_2/Arrangement_on_surface_2_2consolidated_curve_data_8cpp-example.html 的例子)。

        如果您需要处理复杂的多边形(GIS 数据等)或需要通用算法,这类算法可能值得一试。

        【讨论】:

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