import sys, Image, random levels = 8 if len(sys.argv) > 1: levels = int(sys.argv[1]) seed = 1 if len(sys.argv) > 2: seed = int(sys.argv[2]) random.seed(seed) def makeHeightField(level): size = 2**level + 1 h = [[0]*size for _ in range(0,size)] displacement = 4.0 for l in range(level-1, -1, -1): 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(levels) maxHeight = max(map(max,hf)) minHeight = min(map(min,hf)) if minHeight == maxHeight: scale = 1 else: scale = 255/(maxHeight-minHeight) img = Image.new('L', (len(hf), len(hf[0]))) for j in range(0, len(hf)): for i in range(0, len(hf[j])): img.putpixel((i,j), (hf[i][j]-minHeight)*scale) img.save('heightfield.png')