随机生成二维多边形/区域以填充 [长度,宽度] 区域的方法?

问题描述

最终,我想在一个假“大陆”上生成多个假“国家”,但一开始我将问题归结为简单的问题,而我已经陷入困境第一步:

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

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

spiral method of generating regions

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

'snake' method of generating regions

为了创建一些模糊的现实,我认为我需要在 [10,10] 区域生成 6 个质心,然后使用螺旋方法从中创建区域。

'centroid' method of generating regions

我发现自己很快就遇到了三个问题:

  1. 如何“等距”隔开质心?
  2. 如何处理“重叠”区域,例如用 ?s 或 ?!s 显示的区域(用于第二次传递)
  3. 如何处理“间隙”区域,如上面的字母 G 所示?

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

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

解决方法

我对此不是很有经验,但您可以使用 Voronoi 三角剖分。您将在网格上生成随机间隔的点,然后使用 Voronoi 图 (https://en.wikipedia.org/wiki/Voronoi_diagram) 来确定国家/地区。为了使它们更相等,您可以使用劳埃德松弛 (https://en.wikipedia.org/wiki/Lloyd's_algorithm) 来使它们相等。