Skip to content

Instantly share code, notes, and snippets.

@davepape
Created October 22, 2013 15:02
Show Gist options
  • Select an option

  • Save davepape/7102304 to your computer and use it in GitHub Desktop.

Select an option

Save davepape/7102304 to your computer and use it in GitHub Desktop.
Fractal mountain outline using midpoint subdivision
import sys, random
from pyglet.gl import *
window = pyglet.window.Window(500,500)
seed = int(random.uniform(0,10000))
if len(sys.argv) > 1:
seed = int(sys.argv[1])
def generateHeights(level):
random.seed(seed)
numPoints = 2**level + 1
p = [0] * numPoints
displacement = 100.0
for l in range(level-1, -1, -1):
step = 2**l
for i in range(step, numPoints, step*2):
p[i] = (p[i-step] + p[i+step])/2.0 + random.gauss(0.0, displacement)
displacement /= 2.1
return p
def generateMountain(level):
heights = generateHeights(level)
verts = []
x = 0
for y in heights:
verts += [x, y + 200]
x = x + 500.0/(len(heights)-1)
return pyglet.graphics.vertex_list(len(heights), ('v2f', verts))
level = 0
vlist = generateMountain(level)
@window.event
def on_draw():
global vlist
glClear(GL_COLOR_BUFFER_BIT)
vlist.draw(GL_LINE_STRIP)
@window.event
def on_key_press(key, modifiers):
global level, vlist
if key == pyglet.window.key.PLUS or key == pyglet.window.key.EQUAL:
level += 1
vlist = generateMountain(level)
elif key == pyglet.window.key.MINUS and level > 0:
level -= 1
vlist = generateMountain(level)
pyglet.app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment