mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 01:47:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			119 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| """       turtle-example-suite:
 | |
| 
 | |
|         xtx_lindenmayer_indian.py
 | |
| 
 | |
| Each morning women in Tamil Nadu, in southern
 | |
| India, place designs, created by using rice
 | |
| flour and known as kolam on the thresholds of
 | |
| their homes.
 | |
| 
 | |
| These can be described by Lindenmayer systems,
 | |
| which can easily be implemented with turtle
 | |
| graphics and Python.
 | |
| 
 | |
| Two examples are shown here:
 | |
| (1) the snake kolam
 | |
| (2) anklets of Krishna
 | |
| 
 | |
| Taken from Marcia Ascher: Mathematics
 | |
| Elsewhere, An Exploration of Ideas Across
 | |
| Cultures
 | |
| 
 | |
| """
 | |
| ################################
 | |
| # Mini Lindenmayer tool
 | |
| ###############################
 | |
| 
 | |
| from turtle import *
 | |
| 
 | |
| def replace( seq, replacementRules, n ):
 | |
|     for i in range(n):
 | |
|         newseq = ""
 | |
|         for element in seq:
 | |
|             newseq = newseq + replacementRules.get(element,element)
 | |
|         seq = newseq
 | |
|     return seq
 | |
| 
 | |
| def draw( commands, rules ):
 | |
|     for b in commands:
 | |
|         try:
 | |
|             rules[b]()
 | |
|         except TypeError:
 | |
|             try:
 | |
|                 draw(rules[b], rules)
 | |
|             except:
 | |
|                 pass
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     ################################
 | |
|     # Example 1: Snake kolam
 | |
|     ################################
 | |
| 
 | |
| 
 | |
|     def r():
 | |
|         right(45)
 | |
| 
 | |
|     def l():
 | |
|         left(45)
 | |
| 
 | |
|     def f():
 | |
|         forward(7.5)
 | |
| 
 | |
|     snake_rules = {"-":r, "+":l, "f":f, "b":"f+f+f--f--f+f+f"}
 | |
|     snake_replacementRules = {"b": "b+f+b--f--b+f+b"}
 | |
|     snake_start = "b--f--b--f"
 | |
| 
 | |
|     drawing = replace(snake_start, snake_replacementRules, 3)
 | |
| 
 | |
|     reset()
 | |
|     speed(3)
 | |
|     tracer(1,0)
 | |
|     ht()
 | |
|     up()
 | |
|     backward(195)
 | |
|     down()
 | |
|     draw(drawing, snake_rules)
 | |
| 
 | |
|     from time import sleep
 | |
|     sleep(3)
 | |
| 
 | |
|     ################################
 | |
|     # Example 2: Anklets of Krishna
 | |
|     ################################
 | |
| 
 | |
|     def A():
 | |
|         color("red")
 | |
|         circle(10,90)
 | |
| 
 | |
|     def B():
 | |
|         from math import sqrt
 | |
|         color("black")
 | |
|         l = 5/sqrt(2)
 | |
|         forward(l)
 | |
|         circle(l, 270)
 | |
|         forward(l)
 | |
| 
 | |
|     def F():
 | |
|         color("green")
 | |
|         forward(10)
 | |
| 
 | |
|     krishna_rules = {"a":A, "b":B, "f":F}
 | |
|     krishna_replacementRules = {"a" : "afbfa", "b" : "afbfbfbfa" }
 | |
|     krishna_start = "fbfbfbfb"
 | |
| 
 | |
|     reset()
 | |
|     speed(0)
 | |
|     tracer(3,0)
 | |
|     ht()
 | |
|     left(45)
 | |
|     drawing = replace(krishna_start, krishna_replacementRules, 3)
 | |
|     draw(drawing, krishna_rules)
 | |
|     tracer(1)
 | |
|     return "Done!"
 | |
| 
 | |
| if __name__=='__main__':
 | |
|     msg = main()
 | |
|     print(msg)
 | |
|     mainloop()
 | 
