幸运算法中的beachline包含什么?

3
我正在尝试在Julia中实现Fortune算法,以找到随机点数组的Voronoi多边形,但我在beachline方面遇到了很大困难。
我知道beachline是几个抛物线的联合。每个抛物线都有一个来自数组的点作为其焦点,因此相邻两条抛物线的交集给出了两个Voronoi区域之间的"边缘"。数组中的每个点都将成为beachline所在的事件,但还会有一些称为"circle points"的东西,这些点对应于通过三个"真实点"(即随机点数组中的点)的某个极点(在这种情况下是最低点)的圆。
我知道如何相交抛物线,我也知道当beachline通过真实点时,它的抛物线将成为与以前点的抛物线相交的半条线,并且该交点易于找到。
你如何存储beachline?你只是随着计算相邻抛物线的每个交点而不断存储交点吗?
我正在阅读Mark de Berg的《计算几何算法与应用》,但我的母语不是英语,所以有些东西对我来说有点难理解。
如果您能在此方面帮助我,那将非常好,谢谢您提前的帮助。

3
欢迎来到 StackOverflow。您正在提出一些好问题。不知是否可以挑选最重要的问题,并在您的问题中以此为开头进行编辑?此外,请问您是否能展示一下您所做的研究和已经尝试过的东西? - rajah9
1个回答

1
决定如何表示海滩线时,重要考虑因素是,在算法过程中处理的每个“事件”必须对其进行仅有局部修改。如果扫描线移动了一点,但没有穿过任何事件,则您对海滩线的表示不应需要更改。
因此,海滩线数据结构不应包括海滩线上的任何实际点!
还重要的是,您可以在O(log N)时间内找到要修改的部分。
最简单的表示方法只是一个二叉搜索树,其中包含为海滩线贡献抛物线的输入点,按顺序排列。然后,在每个事件期间进行的修改包括添加或删除单个点。

好的,所以对于海岸线的修改将只是按照扫描线遇到的顺序添加点,这里扫描线是水平的,所以它们将按照x坐标排序,对吗?而且,如果一个新事件将一个抛物线分成两个部分,比如你有两个点[x1,y1]和[x2,y2],其中y2 < y1且x2接近x1,当扫描线在第二个点时,我的海岸线将不再只是[x1,y1],而是变成[x1,y1],[x2,y2],[x1,y1]? - Luis.Alberto
没错,你还必须在相邻抛物线覆盖时移除点。所有这些事件都按照扫描线的x坐标发生的优先级队列排序。 - Matt Timmermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接