Answers:
我将通过两次Voronoi图解决此问题:
第一遍将使用点的稀疏分布(即,点之间的距离应相对较大),以便将岛粗略地划分为多个区域(请参见以下有关点生成的注释)。接下来,基于这些点生成Voronoi图。这会将岛围绕每个点划分为多边形区域,如下所示:
现在,该岛已被划分为多个区域,下一步就是“粗略”它们之间的边界。为此,请使用更紧凑的点分布(即,点之间的距离应较小)生成新的点层,然后再次使用这些点创建另一个Voronoi图。接下来,对于每个较小的区域,通过检查其“种子”点将其分配给较大的区域。这将导致较大细分之间的边界更加锯齿。这是两个Voronoi图的特写图:
这是仅显示最终边界的同一区域:
关于点生成,我喜欢使用Poisson圆盘分布来获得相对较好甚至均匀的点分布。另一个常见的选择是获得相似的均匀分布,即对一组“规则”随机点使用劳埃德算法。LLoyd的代码更容易编写,但可能需要经过反复试验才能确定需要多少次传递才能得出所需的结果。
这种方法的一个潜在问题是,第一遍分区可能会生成一些非常小的区域。如果您不希望它们出现在最终结果中,则只需将它们与随机的相邻区域合并即可。
我提供的插图恰好是光栅图像,但是该技术也适用于多边形/矢量表示。
MineCraft很好地做到了这一点,并且已经对其世界生成算法进行了详尽的分析和记录。
该算法有各种描述,其中一个在这里:https : //github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm
该算法的核心是Perlin噪声发生器。这可以直接控制海拔(或多或少,因为后续的挖洞步骤也可以改变表面),以及生物群落的产生。像生物群系生成器之类的东西可能是您要用来创建区域的东西。
(它的旧版本)已记录在案,基本上它是通过使用两个不同的Perlin Noise发生器来工作的,一个用于“温度”,一个用于“降水”,然后从这两个中选择生物群系。变量本身(温度和降水)在以后的游戏中并没有真正使用。例如,沙漠没有下雨,但是游戏是根据“沙漠”属性而不是原始的降水值来确定的。
有多种在线工具可以根据随机种子生成生物群系图,其中之一是 mineatlas.com。我猜他们在内部使用了Java服务器,该服务器使用了MineCraft本身的内部类。我不知道他们的任何源代码是否直接可用。
如果您有兴趣以矢量格式而不是基于栅格的方法进行此操作,则前一段时间我写了一篇博客文章,内容非常准确。
http://blog.particracy.com/worlds-and-their-geography/
想法是从网格(通常基于Voronoi)开始,然后从足够间隔的随机种子点同心地扩大区域。