123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #!/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()
|