mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 15:11:34 +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()
							 |