Geometry 在给定Voronoi图的点集和Delaunay三角剖分的情况下,如何导出Voronoi图?

Geometry 在给定Voronoi图的点集和Delaunay三角剖分的情况下,如何导出Voronoi图?,geometry,computational-geometry,voronoi,delaunay,Geometry,Computational Geometry,Voronoi,Delaunay,我正在做一个游戏,我创建了一个随机的省份地图(洛杉矶风险或外交)。为了创建地图,我首先生成一系列半随机点,然后计算这些点的Delaunay三角剖分 完成后,我现在希望创建一个点的Voronoi图,作为省边界的起点。我在这一点上的数据(并非双关语)由原始点系列和Delaunay三角形集合组成 我在网上看到了很多这样做的方法,但大多数都与Delaunay的起源有关。我很想找到一些不需要集成到Delaunay中的东西,但是可以单独基于数据工作。如果做不到这一点,我会寻找一些相对几何新手可以理解的东西,

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

完成后,我现在希望创建一个点的Voronoi图,作为省边界的起点。我在这一点上的数据(并非双关语)由原始点系列和Delaunay三角形集合组成


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

Voronoi图只是Delaunay三角剖分的对偶图

  • Voronoi图的边沿着Delaunay三角剖分边的垂直平分线,所以计算这些线
  • 然后,通过查找相邻边的交点来计算Voronoi图的顶点
  • 最后,边是您计算的位于相应顶点之间的线的子集

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

如果不考虑最佳速度,以下psuedo代码将以艰难的方式生成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
对于从0到1的高度
对于xloop=0到宽度-1
//生成最大值
最近距离=宽度*高度
对于点=0到点的个数-1
//调用函数来计算距离
点距离=距离(点、xloop、yloop)
如果点距离<最近距离
最近点=最近点
如果结束
下一个
//将结果放置在点类型数组中
点[xloop,yloop]=点
下一个
下一个

假设您有一个“点”类或结构,如果您为它们指定随机颜色,那么在显示输出时,您将看到熟悉的voronoi图案。

每个Delaunay三角形都包含voronoi图的一个点

可以通过为每个三角形找到三个三角形的交点来计算该点

您的Voronoi图将连接这组点,每个点都有最近的三个邻居。(每个邻居共享Delaunay三角形的一侧)


你打算如何处理边缘案例?

在尝试使用此线程作为我自己类似问题的答案来源后,我发现《财富》的算法——可能是因为它是最流行的,因此记录最多的——最容易理解


保留指向C、C#和Javascript中源代码的新链接。所有这些都是一流的,都有很好的例子。

你也可以通过计算所有三角形的外心,并连接三角形共享一条边的任意两个外心来找到对偶(即Voronoi图)。正如上面评论中所建议的,我将分两步完成:1。计算每个Delaunay三角形的外心->这些是Voronoi顶点。见第2条。对于每个Delaunay边,计算Voronoi边:连接两个相邻Delaunay三角形外心的线段。@balint.miklos如何处理外部站点/三角形?请注意,尽管每个Delaunay三角形对应一个Voronoi顶点,但该顶点也可以位于三角形外部。看一个例子:这很好,但我不认为作为图像生成的Voronoi图有任何用处。也许有一个?不是作为图像本身,但我已经将其用于基于程序的瓷砖世界生成(每个瓷砖由其所属的单元格确定)。