在不使用Fortune算法的情况下生成Voronoi图

时间:2017-07-27 05:52:33

标签: c# unity3d voronoi

我希望用C#在Unity中创建Voronoi景观。我查看了许多Unity Project文件,但它们都实现了Fortune的算法,这完全超出了我的想法。有没有其他生成Voronoi图的方法(更容易理解)? 对我而言,缓慢的表现完全没问题。 非常感谢!

旁注:由于我在Unity工作并需要从Voronoi图生成2D / 3D网格,每像素距离检查不起作用:,( 第二个想法,也许我可以使用Vector2s的2D数组而不是像素,它们在x和z轴上间隔1.0个单位。

2 个答案:

答案 0 :(得分:2)

有一种非常简单的方法可以创建近似的Voronoi图VD。对于应在VD(2D平面)中定义单元格的每个站点s,您将锥体居中s,具有恒定的斜率和一定的高度。然后你从上面看到锥体的景观(所有的尖峰都可见)。不同锥体相遇的边界(投影到2D平面)是(近似)Voronoi图。

enter image description here

Image Source

正如您在评论中所要求的那样,获取实际边缘数据似乎并不那么容易。但是可能有一些图形例程通过交叉锥体来生成它们。

另一种方法是计算给定点集的Delaunay三角剖分。这个related post中引用了一些实现(也提到了简单的近似)。然后你计算三角测量的双重图形,你就得到了Voronoi图。 (双图表示对于三角测量中的每个边AB的每一个,在VD中存在一个边缘,将两个顶点AB之间的空间平分,并且对于每个三角形存在VD中双顶边相交的顶点。)另外,还有很多C# Voronoi实现:Unity-delaunay,但正如你提到的那样使用Fortune方法。

如果你想自己编码所有内容,你可以在n时间内用O(n^2)点蛮力计算点的三角剖分。然后应用圈内测试和edge flips。也就是说,对于每个三角形t(abc),创建一个由C的三个顶点定义的圆t。然后检查d中是否存在您的点集的另一个点C。如果是,则翻转t中的边缘,并在d的三角形中形成边。完成此翻转直到所有三角形都满足空圆属性(Delaunay条件)。再次使用蛮力将花费O(n^2)时间。然后你可以计算如上所述的双图。

enter image description here

Image Source

答案 1 :(得分:1)

“最简单?这是蛮力的方法:对于输出中的每个像素,迭代所有点,计算距离,使用最接近的。尽可能慢,但非常简单。如果性能不重要,它确实这份工作。“

[1] Easiest algorithm of Voronoi diagram to implement?