You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.4 KiB
Python
120 lines
2.4 KiB
Python
3 weeks ago
|
#!/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()
|