我偶然发现了一个voronoi图解算器的fortunes算法的实现,它可以工作,但是我不确定在下面的__construct类的Edge方法中实际发生了什么(为了清楚起见,删除了一些片段)。

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));
    }
};

我有兴趣理解的三条线是根据左右站点事件的位置分配fgdirection
首先,fg变量的命名似乎很糟糕,除非它们遵循某种公式化的命名法?这些关系是什么?这里实际计算/确定的是什么?
在我看来,这个方向指示了左右两个站点事件之间边缘的坡度。再说一遍,这里计算的是什么?
理解这一点的任何帮助都会被赏识,因为我发现,当两个站点事件位于同一个y轴(即:左和右站点事件y坐标都相同)时,我所发现的实现似乎是虚构的。
更新
我添加了一个从我找到的源代码移植的实现的当前结果的屏幕截图(见下文)。此外,如果它对任何人都有帮助,您可以从github中获取解算器的最新副本(不太有效)。

最佳答案

它看起来很像是要计算slope & intercept of a straight line through the points,但是作者搞错了。如果你允许我滥用符号,f定义为x坐标值与y坐标值的比值,我将其写成g。这意味着在f的定义中,你要从f ~ x/y项中减去g项。
现在,如果f*x ~ x^2 / y实际上被定义为y,那么在f的定义中,您将从f ~ y/x项中减去g项,这将更有意义。我还认为作者可能在f*x ~ y的定义中意外丢失了-1(这就是分母与分子相反的原因),但是如果没有看到代码的其余部分,我不能肯定。
同样,当左、右站点的y坐标相同时,在y的定义中会得到一个0的除法,这可能就是它变脏的原因。
如果你能解释f点代表什么,以及算法是从左还是从右扫描,我也许能确切地知道它在做什么。

07-26 01:45