summaryrefslogtreecommitdiffstats
path: root/Lib/turtledemo/forest.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/turtledemo/forest.py')
-rw-r--r--Lib/turtledemo/forest.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/Lib/turtledemo/forest.py b/Lib/turtledemo/forest.py
new file mode 100644
index 0000000..a837d84
--- /dev/null
+++ b/Lib/turtledemo/forest.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python3
+""" turtlegraphics-example-suite:
+
+ tdemo_forest.py
+
+Displays a 'forest' of 3 'breadth-first-trees'
+similar to the one from example tree.
+For further remarks see xtx_tree.py
+
+This example is a 'breadth-first'-rewrite of
+a Logo program written by Erich Neuwirth. See:
+http://homepage.univie.ac.at/erich.neuwirth/
+"""
+from turtle import Turtle, colormode, tracer, mainloop
+from random import randrange
+from time import clock
+
+def symRandom(n):
+ return randrange(-n,n+1)
+
+def randomize( branchlist, angledist, sizedist ):
+ return [ (angle+symRandom(angledist),
+ sizefactor*1.01**symRandom(sizedist))
+ for angle, sizefactor in branchlist ]
+
+def randomfd( t, distance, parts, angledist ):
+ for i in range(parts):
+ t.left(symRandom(angledist))
+ t.forward( (1.0 * distance)/parts )
+
+def tree(tlist, size, level, widthfactor, branchlists, angledist=10, sizedist=5):
+ # benutzt Liste von turtles und Liste von Zweiglisten,
+ # fuer jede turtle eine!
+ if level > 0:
+ lst = []
+ brs = []
+ for t, branchlist in list(zip(tlist,branchlists)):
+ t.pensize( size * widthfactor )
+ t.pencolor( 255 - (180 - 11 * level + symRandom(15)),
+ 180 - 11 * level + symRandom(15),
+ 0 )
+ t.pendown()
+ randomfd(t, size, level, angledist )
+ yield 1
+ for angle, sizefactor in branchlist:
+ t.left(angle)
+ lst.append(t.clone())
+ brs.append(randomize(branchlist, angledist, sizedist))
+ t.right(angle)
+ for x in tree(lst, size*sizefactor, level-1, widthfactor, brs,
+ angledist, sizedist):
+ yield None
+
+
+def start(t,x,y):
+ colormode(255)
+ t.reset()
+ t.speed(0)
+ t.hideturtle()
+ t.left(90)
+ t.penup()
+ t.setpos(x,y)
+ t.pendown()
+
+def doit1(level, pen):
+ pen.hideturtle()
+ start(pen, 20, -208)
+ t = tree( [pen], 80, level, 0.1, [[ (45,0.69), (0,0.65), (-45,0.71) ]] )
+ return t
+
+def doit2(level, pen):
+ pen.hideturtle()
+ start(pen, -135, -130)
+ t = tree( [pen], 120, level, 0.1, [[ (45,0.69), (-45,0.71) ]] )
+ return t
+
+def doit3(level, pen):
+ pen.hideturtle()
+ start(pen, 190, -90)
+ t = tree( [pen], 100, level, 0.1, [[ (45,0.7), (0,0.72), (-45,0.65) ]] )
+ return t
+
+# Hier 3 Baumgeneratoren:
+def main():
+ p = Turtle()
+ p.ht()
+ tracer(75,0)
+ u = doit1(6, Turtle(undobuffersize=1))
+ s = doit2(7, Turtle(undobuffersize=1))
+ t = doit3(5, Turtle(undobuffersize=1))
+ a = clock()
+ while True:
+ done = 0
+ for b in u,s,t:
+ try:
+ b.__next__()
+ except:
+ done += 1
+ if done == 3:
+ break
+
+ tracer(1,10)
+ b = clock()
+ return "runtime: %.2f sec." % (b-a)
+
+if __name__ == '__main__':
+ msg = main()
+ print(msg)
+ mainloop()