mirror of
				https://github.com/python/cpython.git
				synced 2025-10-26 11:14:33 +00:00 
			
		
		
		
	
		
			
	
	
		
			120 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			120 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() |