C++ 在给定一组点的情况下,使用voroni近似将空间分割为多边形区域

C++ 在给定一组点的情况下,使用voroni近似将空间分割为多边形区域,c++,boost,voronoi,boost-polygon,C++,Boost,Voronoi,Boost Polygon,我试图将一个空间划分为一组多边形,其中每个多边形近似为一组输入点之一的voroni单元 我正试图使用Boost::Voroni实现这一目的,但是使用这个库的输出是复杂的,需要付出很多额外的努力才能得到我想要的 我想知道是否有人知道从BOOST::voroni图中得到我想要的东西的最佳方法,或者是否有人知道比直接得到我想要的更简单的库 下面是一些代码,显示了我要做的事情 voronoi_diagram< float > vd; construct_voronoi( gridPointP

我试图将一个空间划分为一组多边形,其中每个多边形近似为一组输入点之一的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
} 
voronoi\u图vd;
构造_voronoi(gridPointPos.begin()、gridPointPos.end()、&vd);
int指数=0;
对于(voronoi_图::const_cell_迭代器it=vd.cells().begin();
it!=vd.cells().end();++it,++index){
//如果voroni单元有无限边,
//然后将它们剪裁为有限长度
//提取此单元的voroni顶点
//从提取的边创建增强多边形
} 

因为boost对于我的需求来说过于通用和复杂,所以我更喜欢只返回多边形集的库或算法。我的选择是什么?

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

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

我也有同样的问题,但我真的找不到适合我口味的重量足够轻的东西。因此,我创建了自己的C实现(一个头文件),请参见

给定一组点和一些绘制三角形函数:

    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 );
jcv_图;
memset(&diagram,0,sizeof(jcv_图));
jcv_图_生成(计数,(常数jcv_点*)点、宽度、高度和图);
const jcv_site*sites=jcv_diagram\u get_sites(&diagram);
对于(int i=0;i边;
while(e)
{
绘制三角图(&site->p&e->pos[0],&e->pos[1],图像,宽度,高度,3,颜色);
e=e->next;
}
}
jcv_图_-free(&diagram);

我也有同样的问题,但我真的找不到适合我口味的重量足够轻的东西。因此,我创建了自己的C实现(一个头文件),请参见

给定一组点和一些绘制三角形函数:

    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 );
jcv_图;
memset(&diagram,0,sizeof(jcv_图));
jcv_图_生成(计数,(常数jcv_点*)点、宽度、高度和图);
const jcv_site*sites=jcv_diagram\u get_sites(&diagram);
对于(int i=0;i边;
while(e)
{
绘制三角图(&site->p&e->pos[0],&e->pos[1],图像,宽度,高度,3,颜色);
e=e->next;
}
}
jcv_图_-free(&diagram);