blob: 3925f25da61870d0cf75ede6ddefbef2562afd03 [file] [log] [blame]
Alexander Belopolsky77d4dc02010-11-01 18:15:48 +00001#!/usr/bin/env python3
2""" turtle-example-suite:
3
4 xtx_lindenmayer_indian.py
5
6Each morning women in Tamil Nadu, in southern
7India, place designs, created by using rice
8flour and known as kolam on the thresholds of
9their homes.
10
11These can be described by Lindenmayer systems,
12which can easily be implemented with turtle
13graphics and Python.
14
15Two examples are shown here:
16(1) the snake kolam
17(2) anklets of Krishna
18
19Taken from Marcia Ascher: Mathematics
20Elsewhere, An Exploration of Ideas Across
21Cultures
22
23"""
24################################
25# Mini Lindenmayer tool
26###############################
27
28from turtle import *
29
30def replace( seq, replacementRules, n ):
31 for i in range(n):
32 newseq = ""
33 for element in seq:
34 newseq = newseq + replacementRules.get(element,element)
35 seq = newseq
36 return seq
37
38def draw( commands, rules ):
39 for b in commands:
40 try:
41 rules[b]()
42 except TypeError:
43 try:
44 draw(rules[b], rules)
45 except:
46 pass
47
48
49def main():
50 ################################
51 # Example 1: Snake kolam
52 ################################
53
54
55 def r():
56 right(45)
57
58 def l():
59 left(45)
60
61 def f():
62 forward(7.5)
63
64 snake_rules = {"-":r, "+":l, "f":f, "b":"f+f+f--f--f+f+f"}
65 snake_replacementRules = {"b": "b+f+b--f--b+f+b"}
66 snake_start = "b--f--b--f"
67
68 drawing = replace(snake_start, snake_replacementRules, 3)
69
70 reset()
71 speed(3)
72 tracer(1,0)
73 ht()
74 up()
75 backward(195)
76 down()
77 draw(drawing, snake_rules)
78
79 from time import sleep
80 sleep(3)
81
82 ################################
83 # Example 2: Anklets of Krishna
84 ################################
85
86 def A():
87 color("red")
88 circle(10,90)
89
90 def B():
91 from math import sqrt
92 color("black")
93 l = 5/sqrt(2)
94 forward(l)
95 circle(l, 270)
96 forward(l)
97
98 def F():
99 color("green")
100 forward(10)
101
102 krishna_rules = {"a":A, "b":B, "f":F}
103 krishna_replacementRules = {"a" : "afbfa", "b" : "afbfbfbfa" }
104 krishna_start = "fbfbfbfb"
105
106 reset()
107 speed(0)
108 tracer(3,0)
109 ht()
110 left(45)
111 drawing = replace(krishna_start, krishna_replacementRules, 3)
112 draw(drawing, krishna_rules)
113 tracer(1)
114 return "Done!"
115
116if __name__=='__main__':
117 msg = main()
118 print(msg)
119 mainloop()