我需要一种算法来填充2D非凸多边形,该多边形可能有随机点的孔,然后在它们上构建一个voronoi图。该图应与多边形绑定,算法应在O(n log n)
中运行。
我的想法是通过测试聚合物边界框内的随机点并仅采用聚合物内部的点,而不是在它们上构建voronoi来填充聚合物,而不是剪切退出多边形的图的边缘。
问题是,测试随机点并剪切边缘是O(n^2)
。
这可以在boost中完成,还是有其他小型库,还是其他任何东西?
答案 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可能会让你开始。