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