如何在多边形内构建voronoi图?

时间:2014-05-23 07:25:43

标签: c++ algorithm boost voronoi

我需要一种算法来填充2D非凸多边形,该多边形可能有随机点的孔,然后在它们上构建一个voronoi图。该图应与多边形绑定,算法应在O(n log n)中运行。

我的想法是通过测试聚合物边界框内的随机点并仅采用聚合物内部的点,而不是在它们上构建voronoi来填充聚合物,而不是剪切退出多边形的图的边缘。

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

这可以在boost中完成,还是有其他小型库,还是其他任何东西?

1 个答案:

答案 0 :(得分:1)

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

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

  • 计算段之间的剖面点;添加这些点,拆分线段并重新排列输入,以便在遍历多边形点时“内部”始终位于边缘的同一侧。
  • 变形多边形中的所有点。
  • 删除多边形外的三角形。这些将是自交叉所产生的凹陷和洞。您可以通过沿着多边形走动并删除位于边缘外的所有三角形来识别它们。您需要边缘的连通性,但这是三角测量的副产品。

现在你有了Bowyer-Watson algorithm进一步三角测量的起点,它通过连续地向父三角形添加点来进行三角测量。因此,要添加随机点,我们可以选择一个点并一次更新三角测量:

  • 选择一个随机三角形,其中每个三角形的拾取概率与其面积成正比。
  • 通过选择barycentric coordinates s in [0, 1]t in [0,1] and with s + t<来选择该riangle中的随机位置1`。那么你的新观点是:

    {P} = s * ({N2} - {N1}) + t * ({N3} - {N1})
    
  • 添加您的点并对父三角形和其外接圆包含新点的其他三角形进行重新网格化。

  • 要挑选的三角形组合现已更改。

你现在有一个Delaunay三角剖分,但你需要一个Voronoi图,你可以通过连接相邻三角形的所有外接圆的中心来轻松获得。同样,Delaunay三角剖分为您提供有关外接圆和相邻三角形的信息。

当您创建一个包含所有点的大型虚拟三角形时,您可以在初始三角测量中使用Bowyer-Watson算法。

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

相关问题