1

我正在尝试将空间划分为一组多边形,其中每个多边形大约是一组输入点中的一个的 voroni 单元。

我试图为此目的使用 Boost::Voroni,但是使用这个库的输出很复杂,需要付出很多额外的努力才能得到我想要的。

我想知道是否有人知道从 BOOST::voroni 图中得到我想要的东西的最佳方法,或者是否有人知道一个比可以直接让我得到我想要的东西的更简单的库?

这是一些显示我正在尝试做的代码,

voronoi_diagram< float > vd;
construct_voronoi( gridPointPos.begin(), gridPointPos.end(), &vd );

int index = 0;
for (voronoi_diagram<float>::const_cell_iterator it = vd.cells().begin();
    it != vd.cells().end(); ++it, ++index ) {

    // if the voroni cell has infinite edges,
        // then clip them to a finite length

    // extract the voroni vertices of this cell

    // create a boost polygon from the extracted edges
} 

因为 boost 对于我的需求来说过于笼统和复杂,所以我更喜欢一个库或算法来简单地完成所有这些,只返回多边形集。我有哪些选择?

4

2 回答 2

0

您可以尝试我在 PHP 中实现 delaunay 三角剖分的 bowyer-watson 增量算法,它还可以找到 voronoi 图。您可以在 codeplex.com ( http://voronoi.codeplex.com/ ) 下载它。

于 2015-06-17T13:19:13.580 回答
0

我有同样的问题,但我真的找不到任何重量轻的东西来满足我的口味。所以我创建了自己的 C 实现(单个头文件),请参阅https://github.com/JCash/voronoi

给定一个点数组和一些draw_triangle函数:

    jcv_diagram diagram;
    memset(&diagram, 0, sizeof(jcv_diagram));
    jcv_diagram_generate(count, (const jcv_point*)points, width, height, &diagram );

    const jcv_site* sites = jcv_diagram_get_sites( &diagram );
    for( int i = 0; i < diagram.numsites; ++i )
    {
        const jcv_site* site = &sites[i];

        unsigned char color_tri[3] = { 127, 127, 127 };
        const jcv_graphedge* e = site->edges;
        while( e )
        {
            draw_triangle( &site->p, &e->pos[0], &e->pos[1], image, width, height, 3, color_tri);
            e = e->next;
        }
    }

    jcv_diagram_free( &diagram );
于 2015-09-23T12:24:46.073 回答