| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | """     turtlegraphics-example-suite:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              tdemo_forest.py | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-24 22:21:41 -04:00
										 |  |  | Displays a 'forest' of 3 breadth-first-trees | 
					
						
							|  |  |  | similar to the one in tree. | 
					
						
							|  |  |  | For further remarks see tree.py | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | This example is a 'breadth-first'-rewrite of | 
					
						
							| 
									
										
										
										
											2014-06-24 22:21:41 -04:00
										 |  |  | a Logo program written by Erich Neuwirth. See | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | http://homepage.univie.ac.at/erich.neuwirth/ | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2008-09-21 07:32:10 +00:00
										 |  |  | from turtle import Turtle, colormode, tracer, mainloop | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | from random import randrange | 
					
						
							| 
									
										
										
										
											2017-10-17 14:46:45 -07:00
										 |  |  | from time import perf_counter as clock | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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__': | 
					
						
							| 
									
										
										
										
											2014-06-24 22:21:41 -04:00
										 |  |  |     main() | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  |     mainloop() |