问题
我想将网格(2D数组)划分为随机形状的部分(想想earth's tectonic plates)。
标准是:
我的解决方案:
请注意,为了避免在其内部长出“臂”或大孔的部件,我创建了两个存储阵列:一个用于相邻的单元 对于只有一个具有当前部件ID号的单元,而另一个单元用于与多个单元相邻的单元,那么我在前者之前将后者用尽。
运行我的解决方案提供以下内容:
网格尺寸:200
宽度:20
身高:10
零件:7
66633333111114444466
00033331111114444466
00003331111114444466
00003331111144444660
00000333111164444660
00000336111664422600
00000336615522222200
00006655555522222200
00006655555552222220
00066655555552222220
部件号:0
零件尺寸:47
部件号:1
零件尺寸:30
部件号:2
零件尺寸:26
部件号:3
零件尺寸:22
部件号:4
零件尺寸:26
部件号:5
零件尺寸:22
部件号:6
零件尺寸:27
我的解决方案存在问题:
其他想法:
结论:
所以这就是问题:我是一名初学程序员,不确定我是否以正确的方式解决了这个问题。我可以创建一些更多的“补丁”方法,将碎片部分移动到一起,并允许形成部分“跳出”死胡同,如果它们卡在其中,但它感觉很乱。
你会如何解决这个问题?我可以用一些性感的数学来简化一些事情吗?
THX
答案 0 :(得分:4)
答案 1 :(得分:3)
这是我要做的:使用Voronoi算法。首先放置一些随机点,然后让Voronoi算法生成零件。要了解它的外观,请咨询:this applet。
答案 2 :(得分:1)
正如Rekin所建议的那样,Voronoi图加上一些随机扰动通常会做得很好,而且在像你一样的离散空间上,相对容易实现。
我只想提出一些关于如何进行随机扰动的想法。如果你在最终分辨率下进行,那么要么花费很长时间,要么花费很少。您可以尝试进行多分辨率扰动。因此,从一个相当小的网格开始,随机播种,计算Voronoi图。然后随机扰动边界 - 类似于,对于具有不同区域的每对相邻单元,以某种方式推动该区域。您可能需要运行后期处理以确保您没有小岛屿。简单的填充将起作用。
然后创建一个两倍大小(每个方向)的网格,并复制您的区域。你可以使用最近的邻居。然后再次扰乱边框,并重复直到达到所需的分辨率。