我偶然发现了一个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));
}
};
我有兴趣理解的三条线是根据左右站点事件的位置分配
f
、g
和direction
。首先,
f
和g
变量的命名似乎很糟糕,除非它们遵循某种公式化的命名法?这些关系是什么?这里实际计算/确定的是什么?在我看来,这个方向指示了左右两个站点事件之间边缘的坡度。再说一遍,这里计算的是什么?
理解这一点的任何帮助都会被赏识,因为我发现,当两个站点事件位于同一个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
点代表什么,以及算法是从左还是从右扫描,我也许能确切地知道它在做什么。