随机生成 2d polygons/regions 来填充 [length, width] 区域的方法?

Method to randomly generate 2d polygons/regions to fill a [length, width] area?

最终,我想到达一个地方,在一个假的“大陆”上生成多个假的“国家”,但一开始我把问题归结为一些简单的事情,我已经停留在第一步:

给定一个区域(比如说 10 个方块 x 10 个方块)和多个多边形(比如说 6 个),我正在寻找一种随机给出多边形方块坐标的方法,其中 6 个多边形大约为大小相等(+/- 10% 可以,老实说甚至是计划好的)将填满整个网格。不是精确的代码本身,而是我将如何在纸上实现它。

我也考虑过使用螺旋线。从该区域的近似中心开始(比方说 [4, 4]),顺时针旋转并在 100 / 6 = ~16 处切断。虽然这看起来是一种非常直接的方法,无论是在纸面上还是在代码中,它肯定会产生看起来很奇怪的多边形:

无论我如何调整一些随机变量(例如,多边形的大小、我从哪里开始等),它总是看起来像那样。在一个变体中,从左下角开始向上,然后向右,然后向下,然后向右,等等,产生相同的结果:

要创建一些模糊逼真的东西,我想我需要在我的 [10, 10] 区域生成 6 个质心,然后使用螺旋方法从中创建区域。

我发现自己很快 运行 陷入三个问题:

  1. 我如何“平均 space”出质心?
  2. 如何处理“重叠”区域,如用 ?s 或 ?!s 显示的(用于第二次直通)
  3. 如何处理“间隙”区域,如上面字母 G 所示?

最后...这种质心方法是不是最好的方法?我听说过(并通过 'clicking a button' 使用过)k 均值聚类...理论上将我的 100 个点设置为输入点并尝试生成 6 个聚类是否可行?

任何帮助当然将不胜感激!

我对此不是很有经验,但您可以使用 Voronoi 三角剖分。您将在网格上生成随机间隔的点,然后使用 Voronoi 图 (https://en.wikipedia.org/wiki/Voronoi_diagram), to determine the countries. To make them more equal, you would use Lloyd relaxation (https://en.wikipedia.org/wiki/Lloyd's_algorithm) 将它们相等。