Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在多边形内部构造voronoi图?_C++_Algorithm_Boost_Voronoi - Fatal编程技术网

C++ 如何在多边形内部构造voronoi图?

C++ 如何在多边形内部构造voronoi图?,c++,algorithm,boost,voronoi,C++,Algorithm,Boost,Voronoi,我需要一个算法来填充二维非凸多边形,该多边形可能有随机点的孔,然后在其上构建voronoi图。该图应以多边形为边界,算法应在O(n logn)中运行 我的想法是通过测试多边形边界框内的随机点并仅获取多边形内的点来填充多边形,然后在这些点上构建voronoi,然后剪切退出多边形的图的边 问题是,测试随机点并剪裁边是O(n^2) 这可以在boost中实现吗,或者是否有另一个小库,或者其他什么东西?我想,通过“洞”,你可以实现单个闭合多边形的自相交 首先对多边形进行Delaunay三角剖分: 计算线

我需要一个算法来填充二维非凸多边形,该多边形可能有随机点的孔,然后在其上构建voronoi图。该图应以多边形为边界,算法应在
O(n logn)
中运行

我的想法是通过测试多边形边界框内的随机点并仅获取多边形内的点来填充多边形,然后在这些点上构建voronoi,然后剪切退出多边形的图的边

问题是,测试随机点并剪裁边是
O(n^2)

这可以在boost中实现吗,或者是否有另一个小库,或者其他什么东西?

我想,通过“洞”,你可以实现单个闭合多边形的自相交

首先对多边形进行Delaunay三角剖分:

  • 计算线段之间的截面点;添加这些点,分割线段并重新排列输入,以便在遍历多边形的点时,“内部”始终位于边的同一侧
  • 变换多边形中的所有点
  • 删除位于多边形外部的三角形。这些将是由自相交创建的凹面和孔。可以通过沿多边形行走并删除位于边外部的所有三角形来识别它们。需要边的连通性,但这是三角剖分的副产品
现在,您有了进一步使用进行三角剖分的起点,它通过连续向父三角形添加点进行三角剖分。因此,要添加随机点,我们可以选择一个点并一次性更新三角剖分:

  • 选择一个随机三角形,其中每个三角形被选择的概率与其面积成正比
  • 通过在[0,1]中选择
    s,在[0,1]
    中选择
    t,并使用
    s+t<1`,在该三角形内选择一个随机位置。你的新观点是:

    {P} = s * ({N2} - {N1}) + t * ({N3} - {N1})
    
  • 添加您的点并重新调整父三角形和其外接圆包含新点的其他三角形的角度

  • 要拾取的三角形集现在已更改
现在有了Delaunay三角剖分,但需要一个Voronoi图,通过连接相邻三角形的所有外接圆的中心,可以很容易地获得该图。同样,Delaunay三角剖分为您提供了关于外接圆以及哪些三角形相邻的信息

创建包含所有点的大型虚拟三角形时,可以在初始三角剖分中使用Bowyer-Watson算法

< >我不知道C++的任何三角测量库,但可能会让你开始。

这看起来像是一个工作。