【问题标题】:Generate hexagonal islands生成六角岛
【发布时间】:2016-01-19 00:17:27
【问题描述】:

我想生成存在多个六边形的平面岛。到目前为止,我已经能够使用代码创建六边形网格,但无法弄清楚如何将它们分组放置,从而创建一个随机形状的岛。 (任何不是完美圆形、正方形等的形状)我想我需要一种算法,将六边形瓷砖放置在现有瓷砖的多个侧面旁边。如果您可以帮助我提出算法的想法,那就太好了。

【问题讨论】:

  • 您提出了一个非常广泛的问题(有很多方法可以生成六边形图案!),但没有明确的目标(可以接受什么样的岛形?)。您还给出了两个例外情况(半六边形和“脱落边缘”),但没有解释您认为它们将如何工作。这意味着这是一个非常广泛的问题——因此答案不太可能涵盖所有内容——并且不清楚您是在寻求算法、代码还是其他方面的帮助。我建议你自己更多地分解问题,然后问一个更具体的问题。
  • @DanPuzey 对不起,丹,我没有意识到这是一个糟糕的问题。不过,它实际上并没有你说的那么复杂。我正在寻找的形状是任何看起来不像人造的东西。所以没有完美的圆形、正方形、直线或三角形。为了简单起见,我将去掉平滑瓷砖。 (这只是使岛屿看起来不太像网格的不同形状)和脱落边缘,它们是岛屿边缘向下的墙壁。感谢任何帮助,无论它只是算法的想法还是实际代码。我会编辑我的问题。谢谢
  • 到目前为止,您是否尝试过任何方法来解决您的问题?你是如何生成六边形网格的?到目前为止,您的问题似乎是要求人们编写代码的下一部分,而无法看到第一部分是什么;这不太可能导致对您(或未来的读者!)有用的答案。
  • 来吧,丹,我已经明确表示我只是想看看是否有人可以引导我朝着正确的方向前进。我不需要代码,只是来自以前做过这个的人的提示。在过去的几天里,我一直在尝试 voronoi 图和 delaunay 三角测量。老实说,不明白你为什么对我这么苛刻..

标签: c# unity3d procedural-generation hexagonal-tiles


【解决方案1】:

你在寻找这样的东西吗?

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

该算法应该为您提供一个相当圆的岛,大致以原始十六进制为中心,因为较旧的六角有更多机会被选中。

您可以通过选择较新或较旧的六边形来调整此形状(例如,您可以在 hexBorders 中包含六边形年龄,并调整您的随机选择,使其更喜欢较年轻的六边形)。

【讨论】:

  • 谢谢卢克,我没想过每次放置一个六边形时都要检查所有六边形的开口边。我只想检查新放置的六边形是否有开口边,这会导致线条过多。我要试试这个。再次感谢!
【解决方案2】:

最近我还在为基于图块的地图做随机地图生成器,并在尝试添加更高级的功能(在图块空间中)时碰壁,输出的真实性并不好。我决定创建一个基于 2D/3D 图像的地图,然后将其转换为平铺地图。添加我想要的所有功能仍未完成,但结果已经比以前好很多:

  1. 地图生成器

    见我的simple random map generator in C++。它基于 Diamond&Square 算法,经过一些调整以获得类似岛屿的地图。

  2. 转换为瓦片地图

    只需将笛卡尔像素映射到您的六边形网格布局中。您还可以计算某个区域的平均值,而不是使用每个单元格/图块的单个像素。

    对于 3D 平铺地图,这将产生“体素化”输出,因此您需要添加额外的过滤器,请参阅

【讨论】:

    【解决方案3】:

    由于是一个非常开放的问题,this article by Red Blob Games about hexagonal data structures 将是一个很好的起点。作者描述了如何使用二维数组来存储六边形,以及如何遍历它们。

    一旦您了解了六边形之间的关系,您就可以开始以有趣的方式遍历它们。

    生成“孤岛”的最简单方法可能是使用 SIR 型模型,也称为流行病模型。这是研究人员常用来模拟传染病传播的模型,但我发现您也可以使用它来生成伪自然形状(如岛屿!)。 SIR 代表 Susceptible-Infectious-Recovered。这些是“细胞”的三种状态,或者在这种情况下是六边形。在算法的任何给定步骤,受感染的细胞都可以感染相邻的细胞。可以这样想:在你的算法开始时,一个六边形被“感染”(土地),其余的没有(水)。在算法的每次迭代中,与受感染细胞相邻的细胞也有机会(例如,十分之一)被感染(变成陆地)。经过多次迭代,你会发现被感染的六边形组的形状看起来很随意,但它们都很感人。 For a grid-bsed example, here's some images I've uploaded to 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
    

    当然还有其他算法,但我首先要了解六边形如何相互关联以及如何存储。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 2015-07-18
      • 2023-03-16
      • 2022-01-19
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多