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

Posted

技术标签:

【中文标题】随机生成 2d 多边形/区域以填充 [长度,宽度] 区域的方法?【英文标题】:Method to randomly generate 2d polygons/regions to fill a [length, width] area? 【发布时间】:2021-09-20 23:54:58 【问题描述】:

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

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

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

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

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

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

    我如何“平均划分”质心? 如何处理“重叠”区域,如 ?s 或 ?!s 所示(用于第二次传递) 如何处理“间隙”区域,如上面的字母 G 所示?

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的建议!我最终选择了 k-means,并阅读了您的链接,它看起来与您的建议完全一样。

以上是关于随机生成 2d 多边形/区域以填充 [长度,宽度] 区域的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何用颜色填充 box2d-qml 多边形?

在一个国家/地区生成随机纬度/经度多边形?

数学篇08 # 如何利用三角剖分和向量操作描述并处理多边形?

opencv如何读取多边形区域内的像素值?

平行四边形内的随机点

OpenGL研究3.0 多边形区域填充