我正在实现Fortune的扫描线算法来计算Voronoi图。我主要参考了de Berg等人的《计算几何:算法与应用》,虽然他们对这个主题的覆盖非常清晰,但是他们忽略了一些小但重要的细节,这让我自己很难解决。我已经在网上寻求帮助,但其他网站要么比教科书提供的概述更高,要么给出与书本相同的伪代码。
我需要一种方法来确定由海滩线上的三个弧组成的一对断点是收敛还是发散,以便检测即将发生的圆事件。看起来,为了做出一个决定,我需要知道随着Fortune算法的推进,断点所跟踪的Voronoi单元边的形状。例如,如果我能找到由断点跟踪的边的斜率,我就可以计算由断点和它们各自的斜率形成的两条直线的交点位置,并根据该结果决定它们是否收敛。然而,我不知道如何获取斜率的信息,只知道断点的当前位置。
我唯一可以使用的信息是三个点的x、y坐标和扫描线的当前y坐标(我正在使用水平扫描线)。
实际上,我对于确定收敛有一个想法。给定两个点,它们定义的海滩线之间的断点仅由扫描线的当前位置控制。我考虑记录两个断点的位置,暂时将扫描线向前移动一小段距离,并记录它们的新位置。因为正常Voronoi图中的边不会弯曲,所以如果新的一对断点之间的距离小于旧的一对断点之间的距离,则断点收敛;否则,它们发散。但这似乎既危险(我不知道它是否总是有效),又很丑陋。肯定有更好的方法。
任何想法都将不胜感激,尤其是伪代码(如果可能的话使用类似C#的语法)。我也意识到,有计算几何库可以用来获取Voronoi图,但这是个人的学习练习,所以我想自己实现算法的所有部分。
我需要一种方法来确定由海滩线上的三个弧组成的一对断点是收敛还是发散,以便检测即将发生的圆事件。看起来,为了做出一个决定,我需要知道随着Fortune算法的推进,断点所跟踪的Voronoi单元边的形状。例如,如果我能找到由断点跟踪的边的斜率,我就可以计算由断点和它们各自的斜率形成的两条直线的交点位置,并根据该结果决定它们是否收敛。然而,我不知道如何获取斜率的信息,只知道断点的当前位置。
我唯一可以使用的信息是三个点的x、y坐标和扫描线的当前y坐标(我正在使用水平扫描线)。
实际上,我对于确定收敛有一个想法。给定两个点,它们定义的海滩线之间的断点仅由扫描线的当前位置控制。我考虑记录两个断点的位置,暂时将扫描线向前移动一小段距离,并记录它们的新位置。因为正常Voronoi图中的边不会弯曲,所以如果新的一对断点之间的距离小于旧的一对断点之间的距离,则断点收敛;否则,它们发散。但这似乎既危险(我不知道它是否总是有效),又很丑陋。肯定有更好的方法。
任何想法都将不胜感激,尤其是伪代码(如果可能的话使用类似C#的语法)。我也意识到,有计算几何库可以用来获取Voronoi图,但这是个人的学习练习,所以我想自己实现算法的所有部分。