Портирование улучшенного шума Perlin на Python - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь перенести эталонную реализацию 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]

Спасибо, что нашли время помочь мне!

...