我想用生物群落生成一个 2D 瓦片地图(假设:沙漠,草,雪)。我有一些算法的想法,比如放一些随机的瓦片,然后尝试扩展,但我完全不知道如何确定何时扩展和何时不扩展。(我所做的尝试总是以无限递归结束)
我正在寻找的结果是这样的:(生物群落较少)
有没有一个简单的方法来做到这一点?
我用一个真正简单的算法测试了你的问题:
随机设置点与生物群落类型在你的领域
走过完整的字段,并将生物群落类型设置为最近的点
示例结果(X 标记步骤 1 中的生物群落点):
% % % % % % % % % % % % % % % % % % I I I I I I I I I I I I I I
% % % % % % % % % % % % % % % % % I I I I I I I I I I I I I I I
% % % % % % % % % % % % % % % % I I I I I I I I I I I I I I I I
% % % % % % % % % % % % % % % % I I I I I I I I I I I I I I I I
% % % % % % % % % % % % % % % I I I I I I I I I I I I I I I I I
% % % % % X % % % % % % % % I I I I I I I I I I I I I I I I I I
% % % % % % % % % % % % % % I I I I I I I I I I I I I I I I I I
% % % % % % % % % % % % % I I I I I I I I I I I I I I I I I I I
O O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I
O O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I
O O O O O X O O O O O O I I I I I I I I I I I I I I I I I I I I
O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I I
O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I I
O O O O O O O O O O O O I I I I I I X I I I I I I I I I I I I I
O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I I +
O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I + +
O O O O O O O O O O O I I I I I I I I I I I I I I I I I + + + +
O O O O O O O O O O O I I I I I I I I I I I I I I I I + + + + +
O O O O O O O O O O O I I I I I I I I I I I I I I + + + + + + +
O O O O O O O O O O I I I I I I I I I I I I I + + + + + + + + +
O O O O O O O O O O I I I I I I I I I I I I + + + + + + + + + +
O O O O O O O O O O I I I I I I I I I I + + + + + + + + + + + +
O O O O O O O O O O I I I I I I I I + + + + + + + + + + + + + +
O O O O O O O O O I I I I I I I I + + + + + + + + + + + + + + +
O O O O O O O O O I I I I I I + + + + + + + + + + + + + + + + +
O O O O O O O O O I I I I I + + + + + + + + + + + + + + + + + +
O O O O O O O O O I I I + + + + + + + + + + + + + + X + + + + +
O O O O O O O O I I + + + + + + + + + + + + + + + + + + + + + +
O O O O O O O O I + + + + + + + + + + + + + + + + + + + + + + +
O O O O O O O O + + + + + + + + + + + + + + + + + + + + + + + +
O O O O O O O + + + + + + + + + + + + + + + + + + + + + + + + +
O O O O O O + + + + + + + + + + + + + + + + + + + + + + + + + +
我用 Java 的解决方案,但它不应该很难将其转换为 C / C ++
// a simple 'struct' to ld some vars
cl BiomeInfo {
char type;
int x;
int y;
}
接下来我们设置一些点。您可以将随机添加到此任务,也可以多次添加任何类型
char[][] field = new field[32][32];
biomeInfo[0].type = '#';
biomeInfo[0].x = 5;
biomeInfo[0].y = 5;
biomeInfo[1].type = 'O';
biomeInfo[1].x = 10;
biomeInfo[1].y = 5;
biomeInfo[2].type = 'I';
biomeInfo[2].x = 13;
biomeInfo[2].y = 18;
biomeInfo[3].type = '+';
biomeInfo[3].x = 26;
biomeInfo[3].y = 26;
下一篇:走过田野
for (int i = 0; i < field.length; i++) {
for (int j = 0; j < field[0].length; j++) {
char nearest = '.'; // value here doesn't matter
int dist = Integer.MAX_VALUE; // select a big number
// walk over each biomeInfo
for (int z = 0; z < biomeInfo.length; z++) {
// calculate the difference in x and y direction
int xdiff = biomeInfo[z].x - i;
int ydiff = biomeInfo[z].y - j;
// calculate euclidean distance, sqrt is not needed
// because we only compare and do not need the real value
int cdist = xdiff*xdiff + ydiff*ydiff;
// is the current distance smaller than the old distance?
// if yes, take this biome
if (cdist < dist) {
nearest = biomeInfo[z].type;
dist = cdist;
}
}
// set the field to the nearest biome
field[i][j] = nearest;
// you can mark the biome point with this code
// if (dist == 0) {
// field[i][j] = 'X';
// }
}
}
最后打印字段:
for (int i = 0; i < field.length; i++) {
for (int j = 0; j < field[0].length; j++) {
System.out.printf("%c ", field[i][j]);
}
System.out.printf("%n"); // %n means newline
}
System.out.printf("%n");
图片上的线条以Voronoi diagram的名称命名。Wikipedia 页面mentions找到一些算法,或双重Delaunay triangulation。一种简单的方法如下:对于每个控制点,在该点和每个其他控制点之间绘制,按与 Ox 轴的角度对这些线进行排序,然后按照该顺序遍历它们以在控制点周围构造多边形。
之后,将类型分配给图块应该很容易。您只需查看图块的中心,即可找到它属于该图的哪个面。如果需要更好的精度,可以为每个图块计算与每个面的相交面积,然后选择面积最大的图块。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(82条)