1#!/usr/bin/env python3
2"""       turtle-example-suite:
3
4        xtx_lindenmayer_indian.py
5
6Each morning women in Tamil Nadu, in southern
7India, place designs, created by using rice
8flour and known as kolam on the thresholds of
9their homes.
10
11These can be described by Lindenmayer systems,
12which can easily be implemented with turtle
13graphics and Python.
14
15Two examples are shown here:
16(1) the snake kolam
17(2) anklets of Krishna
18
19Taken from Marcia Ascher: Mathematics
20Elsewhere, An Exploration of Ideas Across
21Cultures
22
23"""
24################################
25# Mini Lindenmayer tool
26###############################
27
28from turtle import *
29
30def replace( seq, replacementRules, n ):
31    for i in range(n):
32        newseq = ""
33        for element in seq:
34            newseq = newseq + replacementRules.get(element,element)
35        seq = newseq
36    return seq
37
38def draw( commands, rules ):
39    for b in commands:
40        try:
41            rules[b]()
42        except TypeError:
43            try:
44                draw(rules[b], rules)
45            except:
46                pass
47
48
49def main():
50    ################################
51    # Example 1: Snake kolam
52    ################################
53
54
55    def r():
56        right(45)
57
58    def l():
59        left(45)
60
61    def f():
62        forward(7.5)
63
64    snake_rules = {"-":r, "+":l, "f":f, "b":"f+f+f--f--f+f+f"}
65    snake_replacementRules = {"b": "b+f+b--f--b+f+b"}
66    snake_start = "b--f--b--f"
67
68    drawing = replace(snake_start, snake_replacementRules, 3)
69
70    reset()
71    speed(3)
72    tracer(1,0)
73    ht()
74    up()
75    backward(195)
76    down()
77    draw(drawing, snake_rules)
78
79    from time import sleep
80    sleep(3)
81
82    ################################
83    # Example 2: Anklets of Krishna
84    ################################
85
86    def A():
87        color("red")
88        circle(10,90)
89
90    def B():
91        from math import sqrt
92        color("black")
93        l = 5/sqrt(2)
94        forward(l)
95        circle(l, 270)
96        forward(l)
97
98    def F():
99        color("green")
100        forward(10)
101
102    krishna_rules = {"a":A, "b":B, "f":F}
103    krishna_replacementRules = {"a" : "afbfa", "b" : "afbfbfbfa" }
104    krishna_start = "fbfbfbfb"
105
106    reset()
107    speed(0)
108    tracer(3,0)
109    ht()
110    left(45)
111    drawing = replace(krishna_start, krishna_replacementRules, 3)
112    draw(drawing, krishna_rules)
113    tracer(1)
114    return "Done!"
115
116if __name__=='__main__':
117    msg = main()
118    print(msg)
119    mainloop()
120