Здарова! Реализовать шум Перлина не так уж сложно, когда поймешь концепцию. Начнем с базового ветора и точек сетки. Сам код на Python ниже:
Программный код:
import math
import random
def fade(t):
return t * t * t * (t * (t * 6 - 15) + 10)
def lerp(t, a, b):
return a + t * (b - a)
def grad(hash, x, y):
h = hash & 15
u = x if h < 8 else y
v = y if h < 4 else x
return (u if ((h & 1) == 0) else -u) + (v if ((h & 2) == 0) else -v)
def perlin(x, y):
p = [random.randint(0, 255) for _ in range(256)]
p = p + p
X = math.floor(x) & 255
Y = math.floor(y) & 255
x -= math.floor(x)
y -= math.floor(y)
u = fade(x)
v = fade(y)
aaa, aba, aab, abb, baa, bba, bab, bbb = [(p[A] + B) for A, B in zip((p[X] + Y, p[X] + Y + 1, p[X + 1] + Y, p[X + 1] + Y + 1), (p, p + 1, p + 1, p + 2))]
return lerp(v, lerp(u, grad(p[aaa], x, y), grad(p[baa], x - 1, y)),
lerp(u, grad(p[aab], x, y - 1), grad(p[bab], x - 1, y - 1)))
if __name__ == "__main__":
width, height = 100, 100
for i in range(width):
for j in range(height):
print("{:.2f}".format(perlin(i/100, j/100)), end=" ")
print()
Вот такой кусочек кода должен помочь в генерировании шума. Если есть вопросы, пиши!