Joe*_*son 6 java random algorithm noise terrain
我正在尝试一种新的随机景观生成算法.这种方法是我的想法,所以它可能变得不可能.与此同时,我正试图解决这个问题.
public static void generate(){
for(int x = -64; x <= 64; x++){
for(int y = -64; y <= 64; y++){
double val = 2d;
for(int i = x - 4; i <= x + 4; i++){
for(int j = y - 4; j <= y + 4; j++){
double w = Math.pow(hypotenuse(x, y, i, j), 1);
val += (1 * (random(i, j) / w));
}
}
tileSet(x, y, val);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我解释这段代码之前,让我说这是一个2D游戏,因此高度图是瓷砖的类型而不是实际高度.水最低(0),然后是沙子,草和树(3).为了测试,我在两个维度中从-64循环到64.对于每个图块,声明一个值(以2或草开头).然后,我们循环解决此瓦(-4至4是任意金额,我不能够通过修改这个值来实现效果显著差异,但好像4没关系).现在,变量w代表重量.每个(i,j)点离(x,y)越远,随机值在加到val之前给出的权重越小.我已经尝试了w的不同指数,下一行的不同乘数(在这个例子中两个情况都是1); 较低的指数和乘数似乎扩大了最终结果而不必平滑,较高的指数则相反,你会得到更多的树更接近水,中间的草和沙更少.
这是方法random()
public static double random(int x, int y){
Random random = new Random(seed * 17717171L + x * 22222223L + y * 111181111L);
return random.nextGaussian() / 2d;
}
Run Code Online (Sandbox Code Playgroud)
在那些内部循环完成之后,设置x,y的值.
这是一次运行

这是.5的乘数,意思是 val += (.5 * (random(i, j) / w));

正如你所看到的,有更多的沙子和草,更少的树木(和整体水),但仍然是一样多的小颠簸.因此它无法有效地改变规模.
感谢您的时间!
您所做的称为反距离加权。正如文章指出的,关键参数是权重的指数。所以在你的代码中,尝试
double w = Math.pow(hypotenuse(x, y, i, j), p);
Run Code Online (Sandbox Code Playgroud)
采取等p0.25, 0.5, 1.0, 2.0,
另外,您的算法还有一个细微的变化,可能会使算法的推理变得更容易:不是为每个单元格生成随机值并将其添加到相邻单元格,而是首先在每个单元格角生成随机值,然后使用反距离从细胞中心测量权重来计算细胞值。
使用此方案,对像元值有贡献的随机值都以统一的方式处理,而不是一个随机值获得权重 1,而其他随机值获得反距离加权。
如果您还没有遇到过梯度噪声,您可能也对它感兴趣。