|
|
|
""" 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 |
|
|
|
""" |
|
|
|
|
|
|
|
|
|
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(): |
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
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() |
|
|