====== perlin3D.py ====== #-*-coding:utf-8-*- from __future__ import division import math import numpy g = [] def noise(x, y, z): def interpolate(diff_x, diff_y, diff_z, w000, w001, w010, w100, w011, w101, w110, w111 ): def blending(x): return 10*x**3 - 15*x**4 + 6*x**5 def lerp(t, a, b): return a + t * (b - a) blended_x = blending(diff_x) blended_y = blending(diff_y) blended_z = blending(diff_z) return lerp(blended_z, lerp(blended_y, lerp(blended_x, w000,w100), lerp(blended_x,w010,w110)),lerp(blended_y, lerp(blended_x,w001, w101),lerp(blended_x, w011, w111))) floored_x = int(math.floor(x)) floored_y = int(math.floor(y)) floored_z = int(math.floor(z)) gradient000 = g[floored_x ][floored_y ][floored_z ] gradient001 = g[floored_x ][floored_y ][floored_z + 1] gradient010 = g[floored_x ][floored_y + 1][floored_z ] gradient100 = g[floored_x + 1][floored_y ][floored_z ] gradient011 = g[floored_x ][floored_y + 1][floored_z + 1] gradient101 = g[floored_x + 1][floored_y ][floored_z + 1] gradient110 = g[floored_x + 1][floored_y + 1][floored_z ] gradient111 = g[floored_x + 1][floored_y + 1][floored_z + 1] diff_x = x - floored_x diff_y = y - floored_y diff_z = z - floored_z w000 = gradient000[0] * diff_x + gradient000[1] * diff_y + gradient000[2] * diff_z w001 = gradient001[0] * diff_x + gradient001[1] * diff_y + gradient001[2] * (diff_z - 1) w010 = gradient010[0] * diff_x + gradient010[1] * (diff_y - 1) + gradient010[2] * diff_z w100 = gradient100[0] * (diff_x - 1) + gradient100[1] * diff_y + gradient100[2] * diff_z w011 = gradient011[0] * diff_x + gradient011[1] * (diff_y - 1) + gradient011[2] * (diff_z - 1) w101 = gradient101[0] * (diff_x - 1) + gradient101[1] * diff_y + gradient101[2] * (diff_z - 1) w110 = gradient110[0] * (diff_x - 1) + gradient110[1] * (diff_y - 1) + gradient110[2] * diff_z w111 = gradient111[0] * (diff_x - 1) + gradient111[1] * (diff_y - 1) + gradient111[2] * (diff_z - 1) w = interpolate(diff_x, diff_y, diff_z, w000, w001, w010, w100, w011, w101, w110, w111) return w def perlinnoise(x, y, z,f_min, f_max=0.5, phi=0.3, a=1, frequenz_faktor=2): summe = 0 n = 0 f = f_min a = 1 while f <= f_max: summe += a*noise(f*x, f*y, f*z) n += 1 f = f*frequenz_faktor a = phi=0.3*a return summe def setmaxsize(breite): global g g = [[[(numpy.random.uniform(-1, 1), numpy.random.uniform(-1, 1), numpy.random.uniform(-1, 1)) for wertx in range(0,200)] for werty in range(0,200)] for wertz in range(0,200)]