#-*-coding:utf-8-*- from __future__ import division import math import numpy ''' #Die Gradientliste wird aus der Textdatei "zufallsliste.txt" ausgelesen, die von zufallsarray.py generiert wurde. f = open("zufallsliste.txt", "r") g = [] for lk in f.read().split("\n"): splitted_lk = lk.split() g.append([(float(splitted_lk[i]), float(splitted_lk[i + 1])) for i in range(0, len(splitted_lk)-1, 2)]) ''' #Alte Gradientliste, mit jedesmal neu generierten Zufallszahlen. g1 = [[(numpy.random.uniform(-1, 1), numpy.random.uniform(-1, 1)) for wer2 in range(0,500)] for wert in range(0,500)] def noise(x, y, g): def interpolate(diff_x, diff_y, w_00, w_10, w_01, w_11): #eigentliche interpolationsfunktion def blending(x): return 10*x**3 - 15*x**4 + 6*x**5 blended_x = blending(diff_x) blended_y = blending(diff_y) w_0 = (1-blended_x)*w_00 + blended_x*w_10 w_1 = (1-blended_x)*w_01 + blended_x*w_11 return (1 - blended_y)*w_0 + blended_y*w_1 floored_x = int(math.floor(x)) floored_y = int(math.floor(y)) diff_x = x - floored_x diff_y = y - floored_y gradient00 = g[floored_x][floored_y] gradient10 = g[floored_x + 1][floored_y] gradient01 = g[floored_x][floored_y + 1] gradient11 = g[floored_x + 1][floored_y + 1] w_00 = gradient00[0]*diff_x + gradient00[1]*diff_y w_10 = gradient10[0]*(diff_x - 1) + gradient10[1]*diff_y w_01 = gradient01[0]*diff_x + gradient01[1]*(diff_y - 1) w_11 = gradient11[0]*(diff_x - 1) + gradient11[1]*(diff_y - 1) w = interpolate(diff_x, diff_y, w_00, w_10, w_01, w_11) return w def perlin_noise(x, y, f_min = 0.03125, f_max = 0.5, phi = 0.3, a = 1, frequenz_faktor = 2, gradientliste = g1): """Perlin-Noise-Funktion x: x Position y: y Position f_min: Startwert und niedrigste Frequenz der noise-Funktion (wird verdoppelt bis f_max erreicht ist) f_max: höchste Frequenz der noise-Funktion frequenz_faktor: Faktor, um den die Frequenz pro Durchlauf erhöht wird phi: Faktor, um den die Amplitude pro Durchlauf reduziert wird a: Startwert der Amplitude """ summe = 0 f = f_min while f <= f_max: summe += a*noise(f*x, f*y, gradientliste) f = f*frequenz_faktor a = phi*a return summe g2 = [[(numpy.random.uniform(-1, 1), numpy.random.uniform(-1, 1)) for wer2 in range(0,500)] for wert in range(0,500)] heightmap = [] for wert in range(0, 500): heightmap.append([]) for wert2 in range(0, 500): if perlin_noise(wert, wert2, gradientliste = g2) < 0.1: heightmap[wert].append(perlin_noise(wert, wert2, 0.03125, 0.5, 0.1, 1, 2)) elif perlin_noise(wert, wert2, gradientliste = g2) < 0.3: heightmap[wert].append(perlin_noise(wert, wert2, 0.03125, 0.5, 0.3, 3, 2)) else: heightmap[wert].append(perlin_noise(wert, wert2, 0.03125, 0.5, 0.3, 5, 2)) #heightmap = [[perlin_noise(wert, wer2, 0.03125, 0.5, 0.3, 1, 2) for wer2 in range(0,500)] for wert in range(0,500)] f = open("perlin_liste.txt", "w") for a in range(len(heightmap)): for b in range(len(heightmap[a])): f.write(str(heightmap[a][b])) f.write(" ") f.write("\n")