我正在为4X太空游戏制作随机地图生成器。
游戏中的每个节点都放置在2d网格上的随机(x,y)坐标上。一个节点可以具有到另一个节点的一个或多个双向边缘(代表虫洞)。所有节点必须至少有一个虫洞,并且所有节点都必须属于同一图。
理想情况下,虫洞不应超过最大长度,并且如果可能,虫洞不应相互交叉。
我天真的实现是遍历所有节点,并使该节点链接到最近的3个节点。但是,我最终得到了许多子图。生成节点边缘的好方法是什么?
我正在为4X太空游戏制作随机地图生成器。
游戏中的每个节点都放置在2d网格上的随机(x,y)坐标上。一个节点可以具有到另一个节点的一个或多个双向边缘(代表虫洞)。所有节点必须至少有一个虫洞,并且所有节点都必须属于同一图。
理想情况下,虫洞不应超过最大长度,并且如果可能,虫洞不应相互交叉。
我天真的实现是遍历所有节点,并使该节点链接到最近的3个节点。但是,我最终得到了许多子图。生成节点边缘的好方法是什么?
Answers:
首先创建一个连接的图,也许使用上面链接中的最小生成树。他建议使用随机边缘权重来使“最小”树随机化。然后,您可以随机添加更多的边,因此它不仅仅是最小的树。如何精确地添加随机边缘取决于您想要哪种图形。
实际上,如果问题仅在于确保所有节点都属于同一图,则可以采用当前的随机生成方法(或任何其他方法),并在其之上应用Prim's算法。如果要对图进行最小的更改以确保所有子图都已连接,则可以将已经存在的边的边成本设置为0。
问题的主要约束有两个方面:创建1个连通图;并使用近端连接创建它。菲利普的答案虽然有价值,但不能解决您问题的所有限制
理想情况下,虫洞不应超过最大长度,并且如果可能,虫洞不应相互交叉。
当您天真地将云中的点连接起来时,您会冒无法满足这些条件的风险(并由此冒着很高的风险)。
如此看来,问题不仅仅在于连通性,还在于这些连接的邻近性之一。将图形中的每个节点连接到其他每个节点都是微不足道的,但是在保持整个图形的1个连通性的同时,仅连接到最接近的节点比较麻烦。
这就是Delaunay三角剖分在n维中创建的。使用Delaunay三角剖分的第一个原因是它隐式地满足了这两个条件。第二个原因是,从这样的图形向后工作(减去不需要的边和顶点)比尝试以其他方式创建它要容易得多。
重要的是要看到这是一个分层过程。第一级涉及虫洞连接性;第二种方法处理的距离大概是使用标准船用驱动器可穿越的距离。您可以在一个或两个级别上应用Delaunay来满足您的约束。
纯粹从拓扑上讲,这会让您留下没有意义的虫洞,因为尽管两者之间有高密度的恒星(甚至可能落在虫洞的直接路径上),但它们可能会将银河的一侧连接到另一侧。拓扑不是拓扑。后者是对前者的考虑。您关心的是邻近性和地形。