二维网格地图上的道路/河流生成


12

这是一个新手问题,但是在这里:

我的地图是2D网格,我想生成道路和河流。从起点到终点的路线一定不是瓷砖数量的最佳路线。相反,它们应该具有一定程度的随机性(回合)。

是否有针对这种情况的标准算法?

干杯!

更新:

这是在网格上使用权重并使用jgrapht库应用最短路径算法(Bellman-Ford)的结果。毕竟,我接受了多纳兹的回答。

http://pastebin.com/AGQGK5ik


地图上有障碍吗?
MichaelHouse

尚未,这条河将是第一个被放置的障碍。
Markos Fragkakis 2012年

Answers:


18

您可以使用A *生成最佳路径,然后使用中点位移使其变形。

在此处输入图片说明

这将确保满足您的端点,并允许您在很大程度上控制随机性。例如,我不会像河流那样随机分配道路。无论正在建设的智能如何,道路通常都会尝试使其达到最佳状态。

请注意,如果地图上有障碍物,请在每次迭代后检查您是否没有越过这些障碍物。

另一种方法是在找到最佳路径后生成Perlin噪声,然后根据生成的噪声移动点。例如,使用以下噪音:

在此处输入图片说明

然后以红色显示最佳路径,以蓝色显示移动路径:

在此处输入图片说明

请注意,偏移的路径如何“稳定”到噪声的较暗区域。河流可能会流过山谷。

选择Perlin噪声的好处之一是,您可以将障碍因素考虑在内,并将其作为算法的一部分避免。


1
您如何根据噪声来移动点?
Khoi

1
这取决于您如何存储噪声和生成的线。您可以首先在中心找到垂直于直线的最近/最低噪声,然后在中心与末端之间的中点找到噪声,依此类推。
MichaelHouse

3

A *算法还将允许您将值分配给图块,以指示其适用性。例如,您可以将最低的成本得分分配给河流的低地,分配给道路的平地(而不是沼泽地),并以此为依据。这不会给您最短的路线,但是却给您最有效的路线。对您的图块值应用一些随机性,您将获得一些次优路线。


2

高度是什么因素呢?我可以用菱形平方算法制作一个高度图。我当时想在每块瓷砖上添加一些随机的水,然后进行迭代,然后将水移动到更低的高度,直到全部沉降,但这会减慢速度,并且可能会形成湖泊,而不是河流。

我还想考虑每个贴砖的法线。如果2个法线指向彼此,则那一定是山谷。水会积聚在山谷中。如果它们指向同一方向或彼此远离,则水不会聚集。这可能比迭代方法要快,但可能没有湖泊,只有河流。我必须尝试使用​​它,以免将每个瓦片点都彼此指向变成一条河。


我阅读了其中一份文档,您可以在其中添加权重,此外某些瓷砖简直无法通行。
乔·普兰特
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.