我有任意数量的柏林噪声图和每个的权重。所有权重的总和为 1,但这不应该有所作为。
我想得到关于重量的最高值的噪音。
我的第一种方法是从每个 perlin 噪声中获取数字,将它们转换为百分比(我有一个循环表),乘以权重并选择最高值。但是这种方法有一个巨大的缺陷:它区分较小的权重而偏爱较大的权重,因此会打乱分布。我希望 0.2 的权重出现在 20% 中。
我想将其用于地图生成器以选择图块类型。我使用多个 perlin 噪声,因为我想使用许多不同的瓦片类型来彼此相邻,因此不能使用渐变。
有谁知道如何修复这个缺陷,或者用不同的方式生成基于瓦片的地图?
编辑:同时我想出了一个几乎可以接受的解决方案:
final float[] values = new float[noises.length];
for (int i = 0; i < values.length; i++)
values[i] = noises[i].get(x, y) * (1f + (weights[i] - 1f / noises.length));
int max = 0;
for (int i = 1; i < values.length; i++)
if (values[i] > values[max])
max = i;
return noises[max];
唯一的缺陷是不精确。即使权重为 0f,仍然会在大约 6% 的时间内返回噪声。