Algorithm Voronoi解算器-此边构造方法的作用是什么?

Algorithm Voronoi解算器-此边构造方法的作用是什么?,algorithm,voronoi,Algorithm,Voronoi,我偶然发现了Voronoi图解算器的Fortunes算法的一个实现,它可以工作,但我不确定下面发布的Edge类的\u构造方法中到底发生了什么(为了清晰起见,删除了一些片段) 我感兴趣的三行是基于左右站点事件位置的f、g和方向的分配 首先,f和g变量的命名似乎很糟糕,除非它们遵循某种公式化的命名法?这些与什么有关?这里实际计算/确定的是什么 在我看来,该方向似乎指示了左右站点事件之间的边缘坡度。再说一次,这里计算的是什么 如果有助于理解这一点,我将不胜感激,因为当两个站点事件位于同一y轴上时(即:

我偶然发现了Voronoi图解算器的Fortunes算法的一个实现,它可以工作,但我不确定下面发布的
Edge
类的
\u构造方法中到底发生了什么(为了清晰起见,删除了一些片段)

我感兴趣的三行是基于左右站点事件位置的
f
g
方向的分配

首先,
f
g
变量的命名似乎很糟糕,除非它们遵循某种公式化的命名法?这些与什么有关?这里实际计算/确定的是什么

在我看来,该方向似乎指示了左右站点事件之间的边缘坡度。再说一次,这里计算的是什么

如果有助于理解这一点,我将不胜感激,因为当两个站点事件位于同一y轴上时(即:左侧和右侧站点事件y坐标相同),我发现的实现似乎会逐渐消失

更新

我已经添加了一个从我找到的源代码(见下文)移植的实现的当前结果的屏幕截图。此外,如果它对任何人都有帮助,您可以从中获取解算器的最新副本(不太有效)


看起来很像
f
g
是用来计算的,但是作者把它搞糟了。如果您允许我滥用符号,
f
被定义为x坐标值与y坐标值的比率,我将其写成
f~x/y
。这意味着在
g
的定义中,你要从
y
项中减去
f*x~x^2/y

现在如果
f
实际上被定义为
f~y/x
,那么在
g
的定义中,你将从
y
项中减去
f*x~y
项,这将更有意义。我还认为作者可能在
f
的定义中意外地丢失了-1(这就是分母与分子相反的原因),但是如果没有看到代码的其余部分,我就不能肯定了

另外,当左右位置的y坐标相同时,在
f
的定义中,你会得到一个被零除的分数,这可能就是它出错的原因


如果你能解释一下
开始点
代表什么,以及该算法是从左扫还是从右扫,我也许能准确地知道它试图做什么。

谢谢你的回答。不幸的是,我发现的源代码中使用的大多数数学公式我都无法理解。然而,我确实相信算法是从下到上、从左到右扫描的。如果有帮助的话,您可以查看我移植到目标C中的边缘实现和求解实现是的,VoronoiSolver.m的第474和475行显示
f
确实应该是边缘的斜率,
g
包含边缘的线的y截距。我现在很有信心VoronoiEdge.m的第42行是错的——分子和分母应该是相反的。此外,我认为
start
是边“出生”的点,而左站点和右站点事件是边与它起源的抛物线相交的点。e:在x和y坐标互换的过程中也出现了一些奇怪的情况,但我无法解释这一轮的目的是什么。我已经尝试过转换分子和分母,但似乎没有产生任何更好的结果。从我添加到问题中的图像来看,边缘处理看起来几乎是不正确的,但奇怪的是,仅针对某些事件。抱歉,我无法抽出时间检查代码库并对其进行调试。你可能想考虑适应另一个实现,因为坦率地说,一个看起来比它应该更复杂。评论很多,看起来很清楚。如果你喜欢简洁,还有一个问题。祝你好运没问题,谢谢你的帮助。你回答了我最初的问题,这是我真正想知道的。感谢您提供指向其他实现的链接。我会看看这些,看看是否可以重写解算器以产生更好的结果。
class Edge
{
    //removed member vars

    function __construct($start, $left_site_event, $right_site_event)
    {
        //removed property assignment
        //this->start = $start //etc etc

        $this->f = ($right_site_event->position->x - $left_site_event->position->x) / ($left_site_event->position->y - $right_site_event->position->y);
        $this->g = $start->y - $this->f * $start->x;

        $this->direction = new Vector(($right_site_event->position->y - $left_site_event->position->y), ($right_site_event->position->x - $left_site_event->position->x));
    }
};