17db96d56Sopenharmony_ci#!/usr/bin/env python3
27db96d56Sopenharmony_ci"""       turtle-example-suite:
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci        xtx_lindenmayer_indian.py
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ciEach morning women in Tamil Nadu, in southern
77db96d56Sopenharmony_ciIndia, place designs, created by using rice
87db96d56Sopenharmony_ciflour and known as kolam on the thresholds of
97db96d56Sopenharmony_citheir homes.
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciThese can be described by Lindenmayer systems,
127db96d56Sopenharmony_ciwhich can easily be implemented with turtle
137db96d56Sopenharmony_cigraphics and Python.
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciTwo examples are shown here:
167db96d56Sopenharmony_ci(1) the snake kolam
177db96d56Sopenharmony_ci(2) anklets of Krishna
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciTaken from Marcia Ascher: Mathematics
207db96d56Sopenharmony_ciElsewhere, An Exploration of Ideas Across
217db96d56Sopenharmony_ciCultures
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci"""
247db96d56Sopenharmony_ci################################
257db96d56Sopenharmony_ci# Mini Lindenmayer tool
267db96d56Sopenharmony_ci###############################
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_cifrom turtle import *
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_cidef replace( seq, replacementRules, n ):
317db96d56Sopenharmony_ci    for i in range(n):
327db96d56Sopenharmony_ci        newseq = ""
337db96d56Sopenharmony_ci        for element in seq:
347db96d56Sopenharmony_ci            newseq = newseq + replacementRules.get(element,element)
357db96d56Sopenharmony_ci        seq = newseq
367db96d56Sopenharmony_ci    return seq
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_cidef draw( commands, rules ):
397db96d56Sopenharmony_ci    for b in commands:
407db96d56Sopenharmony_ci        try:
417db96d56Sopenharmony_ci            rules[b]()
427db96d56Sopenharmony_ci        except TypeError:
437db96d56Sopenharmony_ci            try:
447db96d56Sopenharmony_ci                draw(rules[b], rules)
457db96d56Sopenharmony_ci            except:
467db96d56Sopenharmony_ci                pass
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_cidef main():
507db96d56Sopenharmony_ci    ################################
517db96d56Sopenharmony_ci    # Example 1: Snake kolam
527db96d56Sopenharmony_ci    ################################
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    def r():
567db96d56Sopenharmony_ci        right(45)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def l():
597db96d56Sopenharmony_ci        left(45)
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci    def f():
627db96d56Sopenharmony_ci        forward(7.5)
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    snake_rules = {"-":r, "+":l, "f":f, "b":"f+f+f--f--f+f+f"}
657db96d56Sopenharmony_ci    snake_replacementRules = {"b": "b+f+b--f--b+f+b"}
667db96d56Sopenharmony_ci    snake_start = "b--f--b--f"
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci    drawing = replace(snake_start, snake_replacementRules, 3)
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci    reset()
717db96d56Sopenharmony_ci    speed(3)
727db96d56Sopenharmony_ci    tracer(1,0)
737db96d56Sopenharmony_ci    ht()
747db96d56Sopenharmony_ci    up()
757db96d56Sopenharmony_ci    backward(195)
767db96d56Sopenharmony_ci    down()
777db96d56Sopenharmony_ci    draw(drawing, snake_rules)
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci    from time import sleep
807db96d56Sopenharmony_ci    sleep(3)
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    ################################
837db96d56Sopenharmony_ci    # Example 2: Anklets of Krishna
847db96d56Sopenharmony_ci    ################################
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci    def A():
877db96d56Sopenharmony_ci        color("red")
887db96d56Sopenharmony_ci        circle(10,90)
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    def B():
917db96d56Sopenharmony_ci        from math import sqrt
927db96d56Sopenharmony_ci        color("black")
937db96d56Sopenharmony_ci        l = 5/sqrt(2)
947db96d56Sopenharmony_ci        forward(l)
957db96d56Sopenharmony_ci        circle(l, 270)
967db96d56Sopenharmony_ci        forward(l)
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci    def F():
997db96d56Sopenharmony_ci        color("green")
1007db96d56Sopenharmony_ci        forward(10)
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    krishna_rules = {"a":A, "b":B, "f":F}
1037db96d56Sopenharmony_ci    krishna_replacementRules = {"a" : "afbfa", "b" : "afbfbfbfa" }
1047db96d56Sopenharmony_ci    krishna_start = "fbfbfbfb"
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci    reset()
1077db96d56Sopenharmony_ci    speed(0)
1087db96d56Sopenharmony_ci    tracer(3,0)
1097db96d56Sopenharmony_ci    ht()
1107db96d56Sopenharmony_ci    left(45)
1117db96d56Sopenharmony_ci    drawing = replace(krishna_start, krishna_replacementRules, 3)
1127db96d56Sopenharmony_ci    draw(drawing, krishna_rules)
1137db96d56Sopenharmony_ci    tracer(1)
1147db96d56Sopenharmony_ci    return "Done!"
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ciif __name__=='__main__':
1177db96d56Sopenharmony_ci    msg = main()
1187db96d56Sopenharmony_ci    print(msg)
1197db96d56Sopenharmony_ci    mainloop()
120