algorithm - 包装 2D 柏林噪声

标签 algorithm language-agnostic perlin-noise

我正在使用 Perlin Noise 进行高度图生成算法,我想让它环绕边缘,这样它就可以被看作是连续的。有没有简单的方法或技巧可以做到这一点?我想我需要类似球形噪声的东西,以便水平和垂直环绕。我也很高兴只有 1 个环绕轴,但两个会更好。

现在我使用的是经典算法,您可以在其中设置要添加的 Octave 音阶数,以及用于在每个连续 Octave 音阶之间改变波的振幅和频率的乘数。

提前致谢!

最佳答案

柏林噪声是作为波形的总和获得的。波形是通过内插随机值获得的,较高倍频程的波形具有较小的比例因子,而内插随机值彼此更接近。为了使它环绕,您只需要以通常的环形方式在 y 轴和 x 轴周围正确插值,即如果您的 X 轴从 x_min 跨越到 x_max,并且最左边的随机点(正在插值)是在 x0 处和最右边的 x1 处(x_min < x0 < x1 < x_max),从 x1 到 x0(环绕边缘)插值得到 x1 右边和 x0 左边的插值像素值。

这里是使用线性插值的 Octave 之一的伪代码。这假设一个 256 x 256 矩阵,其中 Perlin 噪声网格大小是两个像素的幂......只是为了使其可读。想象一下,例如大小==16:

 wrappable_perlin_octave(grid, size):
   for (x=0;x<256;x+=size):
     for (y=0;y<256;y+=size):
       grid[x][y] = random()
   for (x=0;x<256;x+=size):
     for (y=0;y<256;y+=size):
       if (x % size != 0 || y % size != 0): # interpolate
         ax = x - x % size
         bx = (ax + size) % 256 # wrap-around
         ay = y - y % size
         by = (ay + size) % 256 # wrap-around
         h = (x % size) / size # horizontal balance, floating-point calculation
         v = (y % size) / size # vertical balance, floating-point calculation
         grid[x][y] = grid[ax][ay] * (1-h) * (1-v) +
                      grid[bx][ay] * h * (1-v) +
                      grid[ax][by] * (1-h) * v +
                      grid[bx][by] * h * v

关于algorithm - 包装 2D 柏林噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587846/

相关文章:

c# - 为什么可选参数必须出现在声明的末尾

algorithm - 树递归斐波那契算法需要线性空间?

random - 为什么 Perlin 噪声算法使用随机数查找表

javascript - 线性插值在经典柏林噪声中如何工作?

java - 关于 Tetration 的问题

java - union find disjoint set weighted quick union with path compression 算法

在 C 中计算 32 位 int 的阶乘(mod prime)比 O(n) 更快?

language-agnostic - 有谁知道 "Quantum Computing"是什么?

c# - 指数分布柏林噪声的实现问题

c++ - 如何将 Sprite 旋转到一个点?