【问题标题】:What contains the beachline in Fortune's algorithm?财富算法中的海岸线包含什么?
【发布时间】:2019-05-27 12:06:37
【问题描述】:

我正在尝试在 Julia 中实现 Fortune 的算法,以找到一组随机点的 Voronoi 多边形,但我真的在海滩线上苦苦挣扎。

我知道海滩线是几条抛物线的结合。每个抛物线都有一个点作为焦点,因此彼此相邻的抛物线的交点给出了两个 Voronoi 区域之间的“边缘”。 数组中的每个点都将是海滩线所在的事件,但也会有一些称为“圆点”的东西,它对应于穿过三个“真实点”的圆的极点(在这种情况下是最低点) , 真实点是随机点数组中的点。

我知道如何与抛物线相交,我也知道当海滩线经过一个真实的点时,它的抛物线将是与之前点的抛物线相交的半条线,并且相交很容易找到。

你如何储存海滩线?在计算相邻抛物线的每个交点的事件时,您是否只存储交点?

我正在阅读 Mark de Berg 的计算几何算法和应用程序,但我的母语不是英语,所以我有点难以理解。

如果您能在这方面帮助我,那就太好了,在此先感谢。

【问题讨论】:

  • 欢迎来到 StackOverflow。你在问一些很好的问题。您能否选择最重要的并编辑您的问题以从该问题开始?另外,您能否展示一下您的研究以及您已经尝试过的内容?

标签: algorithm julia computational-geometry voronoi


【解决方案1】:

在决定如何表示海滩线时,重要的考虑因素是您在算法过程中处理的每个“事件”都必须对其进行本地修改。如果扫描线移动了一点,但没有穿过任何事件,那么您对海滩线的表示应该不需要改变。

因此,海滩线数据结构不应包含海滩线上的任何实际点!

同样重要的是,您可以在 O(log N) 时间内找到要修改的部分。

最简单的表示只是一个二叉搜索树,其中包含按顺序将抛物线贡献给海滩线的输入点。然后在每个事件期间进行的修改包括添加或删除单个点。

【讨论】:

  • 好的,所以对海滩线的修改将只是按顺序添加扫描线遇到的点,在这种情况下,扫描线是水平的,所以它们将使用 x 坐标右排序?此外,如果一个新事件将一条抛物线一分为二,例如,当扫描线位于第二个点时,您有两个点 [x1,y1] 和 [x2,y2],y2
  • 是的,没错。当他们的抛物线被相邻的抛物线覆盖时,您还必须删除点。所有这些事件在发生时由优先级队列根据扫描线的 x 坐标进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多