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