mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	 9c01db40aa
			
		
	
	
		9c01db40aa
		
			
		
	
	
	
	
		
			
			Co-authored-by: Wulian <xiguawulian@gmail.com> Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """turtledemo/forest.py
 | |
| 
 | |
| Displays a 'forest' of 3 breadth-first trees,
 | |
| similar to the one in tree.py.
 | |
| For further details, see tree.py.
 | |
| 
 | |
| This example is a breadth-first rewrite of
 | |
| a Logo program by Erich Neuwirth.
 | |
| """
 | |
| from turtle import Turtle, colormode, tracer, mainloop
 | |
| from random import randrange
 | |
| from time import perf_counter as 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__':
 | |
|     main()
 | |
|     mainloop()
 |