0

我有任意数量的柏林噪声图和每个的权重。所有权重的总和为 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% 的时间内返回噪声。

4

2 回答 2

1

也许解决方案是这样的:

Perlin pickOne(Perlin[] noise, double[] weights) {
   double sum = 0;
   for(double weight : weights) sum += weight;
   double choice = Math.random() * sum;
   for(int i = 0; i < weights.length; ++i) {
      choice -= weights[i];
      if(choice <= 0) {
         return noise[i];
      }
   }
   throw new IllegalArgumentException("Must have at least one weight!");
}

(也就是说,完全根据权重而不是地图值来选择噪声图之一。我在这里选择它所做的工作可以想象为将所有权重首尾相连地布置在数轴上,在其中选择一个值,然后找出它属于哪个权重。)

于 2013-03-21T18:40:39.567 回答
0

“我的第一个方法是从每个 perlin 噪声中获取数字,将它们转换为百分比(我有一个循环表),乘以权重并选择最高值。但这种方法有一个巨大的缺陷:它区分较小权重并偏爱较大的,因此会打乱分布。我希望 0.2 的权重出现在 20% 中。”

我的建议是:

1) 将所有百分比*权重相加

2)在0和sum之间选择一个随机数

3)枚举添加百分比*重量项目,直到你超过你的随机数 - 选择那个

这将对按百分比*权重加权的所有可能性进行随机分布,因此如果您有 2、8 和 6,则 2 出现 2/16 的时间,8 8/16 的时间和6 6/16 的时间。

于 2013-03-22T00:10:24.117 回答