如何根据其点集和Delaunay三角剖分推导出Voronoi图?

时间:2008-09-17 16:53:41

标签: geometry computational-geometry voronoi delaunay

我正在制作一个游戏,在那里我创建一个随机的省份地图(风险或外交)。为了创建该地图,我首先生成一系列半随机点,然后计算这些点的Delaunay三角剖分。

完成后,我现在正在寻找创建点的Voronoi图,作为省边界的起点。此时我的数据(没有双关语)包括原始的点系列和Delaunay三角形的集合。

我已经在网上看到了很多方法可以做到这一点,但是大多数方法都与Delaunay的衍生方式有关。我很想找到一些不需要集成到Delaunay的东西,但可以单独根据数据工作。如果做不到这一点,我正在寻找相对几何新手可以理解的东西,而不是最佳速度。谢谢!

5 个答案:

答案 0 :(得分:20)

Voronoi图只是Delaunay三角剖分的双重图。

  • 因此,Voronoi图的边缘沿着Delaunay三角剖分边缘的垂直平分线,因此计算这些线。
  • 然后,通过找到相邻边的交点来计算Voronoi图的顶点。
  • 最后,边缘是您计算出的线的子集,它们位于相应的顶点之间。

请注意,确切的代码取决于您用于两个图表的内部表示。

答案 1 :(得分:8)

如果不考虑最佳速度,下面的伪代码将以艰难的方式生成Voronoi图:

for yloop = 0 to height-1
  for xloop = 0 to width-1

    // Generate maximal value
    closest_distance = width * height

    for point = 0 to number_of_points-1
      // calls function to calc distance
      point_distance = distance(point, xloop, yloop)

      if point_distance < closest_distance
        closest_point = point
      end if
    next

  // place result in array of point types
  points[xloop, yloop] = point

  next
next

假设你有一个'点'类或结构,如果你为它们分配随机颜色,那么当你显示输出时你会看到熟悉的voronoi模式。

答案 2 :(得分:2)

在尝试使用这个线程作为我自己的类似问题的答案的来源后,我发现了Fortune的算法 - 可能是因为它是最流行的&amp;因此大多数文件都是最容易理解的。

The Wikipedia article on Fortune's algorithm保留了C,C#和Javascript中源代码的新链接。所有这些都是一流的,并有很好的例子。

答案 3 :(得分:1)

我很确定'triangle'http://www.cs.cmu.edu/~quake/triangle.html可以生成voronoi

答案 4 :(得分:0)

每个Delaunay三角形都包含Voronoi图的单个点。

您可以通过查找每个三角形的三个perpendicular bisectors的交集来计算此点。

你的Voronoi图将连接这组点,每个点都与它最近的三个邻居相连。 (每个邻居都分享了Delaunay三角形的一面)

您打算如何处理边缘案件?