在图节点之间随机生成边的好方法是什么?


10

我正在为4X太空游戏制作随机地图生成器。

游戏中的每个节点都放置在2d网格上的随机(x,y)坐标上。一个节点可以具有到另一个节点的一个或多个双向边缘(代表虫洞)。所有节点必须至少有一个虫洞,并且所有节点都必须属于同一图。

理想情况下,虫洞不应超过最大长度,并且如果可能,虫洞不应相互交叉。

我天真的实现是遍历所有节点,并使该节点链接到最近的3个节点。但是,我最终得到了许多子图。生成节点边缘的好方法是什么?


节点如何分散在整个银河系中?我的意思是我可以假设银河系中的每个点(X,Y)都有一个节点吗?或至少对于大多数人而言?
Ali1S232'2011-10-10

并非所有坐标都具有节点。我会说大约40%。
Extrakun 2011年

Answers:


9

这是一个类似问题的好答案。

首先创建一个连接的图,也许使用上面链接中的最小生成树。他建议使用随机边缘权重来使“最小”树随机化。然后,您可以随机添加更多的边,因此它不仅仅是最小的树。如何精确地添加随机边缘取决于您想要哪种图形。


实际上,如果问题仅在于确保所有节点都属于同一图,则可以采用当前的随机生成方法(或任何其他方法),并在其之上应用Prim's算法。如果要对图进行最小的更改以确保所有子图都已连接,则可以将已经存在的边的边成本设置为0。


+1,因为这是一个很好的答案,但我只是不喜欢这种类型的一代,因此我将在接下来的几天里考虑一个更好的算法!
Ali1S232'2011-10-10

是的,对此没有“正确”的答案,我很想看看其他人的想法。
菲利普(Philip)

题外话,但我也将链接到我的答案!:p
r2d2rigo 2011年

这样我就可以得到积分,哈!
菲利普(Philip)

7

问题的主要约束有两个方面:创建1个连通图;并使用近端连接创建它。菲利普的答案虽然有价值,但不能解决您问题的所有限制

理想情况下,虫洞不应超过最大长度,并且如果可能,虫洞不应相互交叉。

当您天真地将云中的点连接起来时,您会冒无法满足这些条件的风险(并由此冒着很高的风险)。

如此看来,问题不仅仅在于连通性,还在于这些连接的邻近性之一。将图形中的每个节点连接到其他每个节点都是微不足道的,但是在保持整个图形的1个连通性的同时,仅连接到最接近的节点比较麻烦。

这就是Delaunay三角剖分n维中创建的。使用Delaunay三角剖分的第一个原因是它隐式地满足了这两个条件。第二个原因是,从这样的图形向后工作(减去不需要的边和顶点)比尝试以其他方式创建它要容易得多。

  1. 随机创建您的全点云。
  2. Delaunay对其进行三角剖分。
  3. 构造图形(点的连接)。在此,您可以生成整个图形(每颗星星),然后再导出图作为未成年人代表你的虫洞连接的地区,执行步骤4时,或者,您也可以工作周围的其他方法,只生成虫洞连接区首先作为超图节点,然后在第二阶段,在这些区域的边界体积内生成单个星(为此,我将得出Delaunay三角剖分图对偶-3维Voronoi图)作为子图。现在您有了近端相连的星团,并且所有星团都通过罕见的虫洞相连:您的拓扑和地形对玩家有意义。
  4. 根据您在步骤3中选择的处理方式,应用智能方法来对上图和子图进行整形。

重要的是要看到这是一个分层过程。第一级涉及虫洞连接性;第二种方法处理的距离大概是使用标准船用驱动器可穿越的距离。您可以在一个或两个级别上应用Delaunay来满足您的约束。

纯粹从拓扑上讲,这会让您留下没有意义的虫洞,因为尽管两者之间有高密度的恒星(甚至可能落在虫洞的直接路径上),但它们可能会将银河的一侧连接到另一侧。拓扑不是拓扑。后者是对前者的考虑。您关心的是邻近性和地形。


Delaunay三角剖分是一个好主意,但不会创建随机边缘。您可以从Delaunay三角剖分创建的边缘中随机删除边缘,但是您将冒着再次获得单独图形的风险...
bummzack 2011年

@Bummzack“它不会创建随机边缘”。听说过未成年人吗?一旦使用Delaunay解决了更困难的约束,便可以根据需要在该图上执行添加或删除操作。
工程师

@Bummzack,我再次对其进行了更新-感谢您的反馈。
工程师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.