perlin2dBiome.py

#-*-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")