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