Я пытаюсь перенести эталонную реализацию Ken Perlin улучшенного Perlin Noise на Python 3, и столкнулся с несколькими проблемами. Я довольно неопытен в Python, поэтому он не работает в настоящее время. Какие ошибки я допустил в этом коде? Я стараюсь сохранить его как можно точнее для эталонной реализации, оставаясь при этом функциональным. Любые предложения по улучшению кода будут высоко оценены. Даже простое объяснение того, как математически работает улучшенный Perlin Noise, мне очень помогло бы.
import math
class ImprovedNoise:
def noise(x: float, y: float, z: float, self):
X2 = math.floor(x) & 255
Y2 = math.floor(y) & 255
Z2 = math.floor(z) & 255
x -= math.floor(x)
y -= math.floor(y)
z -= math.floor(z)
u = self.fade(x)
v = self.fade(y)
w = self.fade(z)
A = p[X ]+Y
AA = p[A]+Z
AB = p[A+1]+Z
B = p[X+1]+Y
BA = p[B]+Z
BB = p[B+1]+Z
# ToDo
return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ),
grad(p[BA ], x-1, y , z )),
lerp(u, grad(p[AB ], x , y-1, z ),
grad(p[BB ], x-1, y-1, z ))),
lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ),
grad(p[BA+1], x-1, y , z-1 )),
lerp(u, grad(p[AB+1], x , y-1, z-1 ),
grad(p[BB+1], x-1, y-1, z-1 ))))
def fade(t: float):
return t * t * t * (t * (t * 6 - 15) + 10)
def lerp(t: float, a: float, b: float):
return a + t * (b - a)
def grad(hash: int, x: float, y: float, z: float):
h = hash & 15
u = x if h < 8 else y
v = y if h < 4 else x if h == 12 or h == 14 else z
return ((u if h & 1 == 0 else -u) + (v if h & 2 == 0 else -v))
p = [None] * 512
permutation = [151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]
for i in range(256):
p[i+256] = permutation[i]
p[i] = permutation[i]
Спасибо, что нашли время помочь мне!