我需要一些聪明且相当简单的解决方案来解决我的问题 - 省份形状生成。 假设地图是矩阵NxM。每个单元格由自然数表示。 0表示图块不属于任何省份。数字1表示它属于省份nr 1,nr 2表示该单元属于省份nr 2 ...等。
考虑这张地图,即4x4:
0000
0000
0000
0000
此地图代表16个不属于任何省份的图块。
这是包含1个省的地图:
0010
0111
0100
0000
这是大小为5的省份,id = 1.它没有邻居。
考虑3个省:
1133
2100
2200
2000
因此省1是2和3的邻居。省3只是1的邻居,省2只是1的邻居。还有7个没有相关的瓦片。
我的问题是:我想在地图NxN上生成k个省份。也有一些简单的规则:
无效省份的示例(未连接):
1100
0000
0011
0000
我试图通过洪水填充修改来实现它,但它有一些缺点。我很乐意听到一些想法或任何帮助。地图可以是300x300,有200个省或更多,所以它也应该是一些聪明的算法。
答案 0 :(得分:5)
我认为这个不会生成所有可能的地图,但会与大多数“合理的”地图一起生成。
Voronoi图表包括根据与所选点的接近度来划分平面。您可以在标题的维基百科链接中看到示例。
算法:
1)选择一组大于或等于所需省数的随机点。如果生成的数量超过需要,则可以保证空格。
2)运行Voronoi算法(如果您感兴趣,可以描述它,但很容易在网上找到)
3)计算得到的多边形的面积
4)检查你是否有足够的表面> (最小期望面积)。如果没有,请转到1
5)如果您生成的随机点多于所需的随机点,则随机选择将构成每个省的多边形组与区域大于>的多边形组合。 (最小面积)
6)检查你的多边形是否有面积< (最大面积)。如果没有,你必须减少它们。
7)减少每个多边形的面积
顺便说一下,我在Mathematica编写了这个程序来获取上面的图表:
Clear["Global`*"];
Needs["ComputationalGeometry`"];
data2D = Table[{RandomReal[16], RandomReal[16]}, {10}]
convexhull = ConvexHull[data2D]
(delval = DelaunayTriangulation[data2D]) // Shallow[#, {5, 6}] &
b1 = {{0, 0}, {16, 0}, {16, 16}, {0, 16}};
{diagvert1, diagval1} = BoundedDiagram[b1, data2D, delval, convexhull];
Show[{Graphics[Join[{PointSize[Large]}, {Point@data2D}], Frame -> True]}]
Show[{Graphics@Point[data2D], DiagramPlot[data2D, diagvert1, diagval1]}]
我包含代码只是为了表明使用正确的工具可以轻松实现算法。
注意:算法描述未提及您的区域由正方形组成......
HTH
答案 1 :(得分:2)
我没有时间,但一个好主意是:首先从左到右,然后从右到左添加省。 像
1111222
3333322
3344555
0000665
我写了随机数字......这是对的吗?
void insert(Matrix matrix){
lastProvince=0;
missingProvince=MIN;
if(matrix.dimensio<MIN*K) throw new RuntimeException("Matrix too small");
for(y=0;y<matrix.height;y++){
if(y%2==0){
for(x=0;x<matrix.width;x++){
matrix[x][y]=lastProvince;
missingProvince--;
if(missingProvince==0) {
lastProvince++;
missingProvince=MIN;
}
if(lastProvince==k) return;
}
}else{
for(x=matrix.width;x>=0;x--){// is -- not ++
matrix[x][y]=lastProvince;
missingProvince--;
if(missingProvince==0) {
lastProvince++;
missingProvince=MIN;
}
if(lastProvince==k) return;
}
}
}
}
未经测试,但这就是想法..
答案 2 :(得分:2)
刚刚出头:
NxM
地图和L个省,只需生成[0-(N*M-1)]
范围内的L个唯一随机数。数量为X,Y
的种子的P
坐标为P/M
和P%M
。直到所有省份都超过最小尺寸且小于最大尺寸:
一个。选择一个仍然可以种植的随机省份(大小小于最大值,不完全被其他省份包围)
湾将不属于任何省份的随机相邻小区添加到该省。
使用这种技术的飞地几率很小,但它非常低。您可以增强步骤b来检查它们,如果增长会创建一个,则不会增长。
如果各省在自身足够大之前完全被其他省份包围,那么各省也有可能保持太小。您可以在第2步完成后检查并调整。