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