El ruido de Perlin se obtiene como la suma de las formas de onda. Las formas de onda se obtienen interpolando valores aleatorios, y las formas de onda de octava más alta tienen factores de escala más pequeños mientras que los valores aleatorios interpolados están más cerca el uno del otro. Para que se ajuste, solo necesita interpolar correctamente alrededor de los ejes yy de la forma toroidal habitual, es decir, si su eje X se extiende de x_min a x_max, y el punto aleatorio más a la izquierda (que se está interpolando) es en x0 y la derecha en x1 (x_min < x0 < x1 < x_max), el valor de los píxeles interpolados derecho a x1 y a la izquierda de x0 se obtiene interpolando de x1 a x0 (envolviendo los bordes).
Aquí pseudocódigo para una de las octavas que utiliza interpolación lineal. Esto supone una matriz de 256 x 256 donde el tamaño de la rejilla de ruido Perlin es una potencia de dos píxeles ... solo para que sea legible. Imagine, por ejemplo, tamaño == 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
Usted no está tratando de construir mundos de Minecraft periódicos, ¿verdad? : D – Cephron
Por supuesto que no estoy tratando de hacerlo, aunque sabía que alguien lo habría dicho :) (entonces también es 2D, no en 3D) – Jack