java - 具有加权柏林噪声的 map 生成器

标签 java random perlin-noise stochastic

我有任意数量的柏林噪声图和每个的权重。所有权重的总和为 1,但这应该没有区别。

我想要获得关于重量的最高值的噪声。

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

我想将其用于 map 生成器来选择图 block 类型。我使用多个柏林噪声,因为我想使用许多不同的图 block 类型彼此接壤,因此无法使用渐变。

有谁知道如何修复这个缺陷,或者使用不同的方法来生成基于图 block 的 map ?

编辑: 同时我想出了一个几乎可以接受的解决方案:

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% 的时间内出现。

最佳答案

也许解决方案是这样的:

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!");
}

(也就是说,完全根据权重而不是 map 值来选择噪声图之一。我在这里选择它的做法可以想象为将所有权重端到端地布置在一条数轴,在其中选择一个值,然后计算出它属于哪个权重。)

关于java - 具有加权柏林噪声的 map 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555222/

相关文章:

perlin-noise - 佩林噪声梯度函数

java - 按 JTable 中未包含的值对 JTable 进行排序

java - Vaadin 表格标题颜色

php - 选择随机值 MYSQL 但不是当前值

algorithm - 如何在球面上生成 Perlin 噪声?

python - 如何使用noise.py模块选择种子

java - Windows Bat 文件无法使用德语元音变音

Java JFrame 表单

C:随机游走(布朗运动)程序没有返回预期的理论值。为什么?

c++ - 随机数和编程逻辑