我想生成由多个六边形存在的平面岛。到目前为止,我已经能够使用代码创建六边形网格,但无法弄清楚如何将它们分组放置,从而创建一个随机形状的岛。(任何不是完美圆形、正方形等的形状)我想我需要一种算法,将六边形瓷砖放置在现有瓷砖的多个侧面旁边。如果你能帮我提出一个算法的想法,那就太好了。
你在寻找这样的东西吗?
Place 1 hexagon.
for i in (islandSize-1):
Scan all hexagons for open sides. Place open sides in a list named hexBorders
Choose a random index in hexBorders, attach a new hexagon there
该算法应该给你一个相当圆的岛,大致以原始十六进制为中心,因为较老的十六进制有更多的机会被选中。
您可以通过首选较新或较旧的六边形来调整此形状(例如,您可以在十六进制边框中包含六边形年龄,并调整您的随机选择,使其更喜欢较年轻的十六边形)。
最近我也在为基于瓷砖的地图做随机地图生成器,并在尝试添加更多高级功能(在瓷砖空间中)时碰壁,输出的真实感不好。我决定创建一个基于2D/3D图像的地图,然后将其转换为平铺地图。仍然没有完成添加我想要的所有功能,但结果已经比以前好了一个数量级:
-
地图生成器
请参阅我在C++中的简单随机地图生成器。它基于Diamond&Square算法,经过一些调整以获得类似岛屿的地图。
-
转换为磁贴地图
只需将笛卡尔像素映射到六边形网格布局中即可。您还可以计算某些区域的平均值,而不是使用每个单元格/切片的单个像素。
对于 3D 切片地图,这将生成"体素化"输出,因此您需要添加其他过滤,请参阅
- 如何程序化地为一些想法生成图块地图。
由于这是一个非常开放的问题,Red Blob Games关于六边形数据结构的这篇文章将是一个很好的起点。作者介绍了如何使用 2D 数组来存储六边形,以及如何循环访问它们。
一旦你理解了六边形之间的关系,你就可以开始以有趣的方式迭代它们。
生成"孤岛"的最简单方法可能是使用SIR型模型,也称为流行病模型。这是研究人员常用来模拟传染病传播的模型,但我发现你也可以用它来生成伪自然形状(比如岛屿!SIR 代表 易感-传染-恢复。这些是"单元格"的三种状态,或者在本例中为六边形。在算法的任何给定步骤中,受感染的细胞都可以感染相邻的细胞。可以这样想:在你的算法开始时,一个六边形被"感染"(土地),其余的不是(水)。在算法的每次迭代中,与受感染细胞相邻的细胞也有被感染的机会(例如,十分之一)被感染(变成陆地)。经过多次迭代,你会发现受感染的六边形组的形状看起来很随机,但它们都很感人。对于一个网格化的例子,这里有一些我上传到imgur的图像。此算法的伪代码如下。
cellsToDo = [originCell]
for 100 iterations:
for each cell in cellsToDo:
for each neighbor to the current cell:
if randomValueBetween(0, 10) == 1:
set the current cell as infected
add the current cell to the cellsToDo list
肯定还有其他算法,但我首先要了解六边形如何相互关联并且可以存储。