import random def makeHeightField(level): size = 2**level + 1 h = [[0]*size for _ in range(0,size)] displacement = 1.0 for l in range(level-1, -1, -1): print 'level', l step = 2**l for i in range(0, size, step*2): for j in range(step, size, step*2): h[i][j] = (h[i][j-step]+h[i][j+step])/2.0 + random.gauss(0,displacement) for i in range(step, size, step*2): for j in range(0, size, step*2): h[i][j] = (h[i-step][j]+h[i+step][j])/2.0 + random.gauss(0,displacement) for i in range(step, size, step*2): for j in range(step, size, step*2): h[i][j] = (h[i-step][j]+h[i+step][j]+h[i][j-step]+h[i][j+step])/4.0 + random.gauss(0,displacement) displacement /= 1.8 return h hf = makeHeightField(9) import Image width = len(hf) height = len(hf) img = Image.new('L',(width,height)) maxheight = max([max(l) for l in hf]) minheight = min([min(l) for l in hf]) for i in range(0,width): for j in range(0,height): v = (hf[i][j]-minheight) * 255 / (maxheight-minheight) img.putpixel((i,j),int(v)) img.save('terrain.tif')