Voronoi Solver - 这种边缘构造方法有什么作用?

时间:2013-11-27 13:21:56

标签: algorithm voronoi

我偶然发现了一个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获取解算器的最新(不太合适)副本。

Voronoi Solver

1 个答案:

答案 0 :(得分:2)

看起来很像f& g旨在计算slope & intercept of a straight line through the points,但作者将其搞砸了。如果您允许我滥用表示法,f被定义为x坐标值与y坐标值的比率,我将其写为f ~ x/y。这意味着,在g的定义中,您将从f*x ~ x^2 / y字词中减去y字词。

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

此外,当左侧和右侧站点的y坐标相同时,您在f的定义中得到零,这可能就是为什么它正在消失。

如果您能够解释f点所代表的内容,以及该算法是从左侧还是右侧扫描,我可能能够确切地知道它正在尝试做什么。