使用voroni近似将空间划分为多边形区域,给出一组点

时间:2015-06-17 02:30:30

标签: c++ boost voronoi boost-polygon

我正在尝试将空间划分为一组多边形,其中每个多边形大约是一组输入点之一的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
} 

因为对于我的需求来说,提升是过于笼统和复杂的,所以我更喜欢只完成所有这些操作的库或算法,只返回多个多边形集。我有什么选择?

2 个答案:

答案 0 :(得分:0)

你可以在PHP中尝试使用bowyer-watson增量算法实现delaunay三角测量,它也可以找到voronoi图。您可以在codeplex.com(http://voronoi.codeplex.com/)下载。

答案 1 :(得分: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 );