我正在尝试将空间划分为一组多边形,其中每个多边形大约是一组输入点之一的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
}
因为对于我的需求来说,提升是过于笼统和复杂的,所以我更喜欢只完成所有这些操作的库或算法,只返回多个多边形集。我有什么选择?
答案 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 );