| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | #!/usr/bin/python | 
					
						
							|  |  |  | """       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 | 
					
						
							|  |  |  | ############################### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-21 07:32:10 +00:00
										 |  |  | from turtle import * | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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() |