blob: 2ac8ecd8ecc697fc961a42c77fae4a8efa37953c [file] [log] [blame]
Benjamin Peterson9cf41d02010-03-11 22:33:25 +00001#!/usr/bin/env python
Martin v. Löwis87184592008-06-04 06:29:55 +00002""" turtle-example-suite:
3
4 tdemo_fractalCurves.py
5
6This program draws two fractal-curve-designs:
7(1) A hilbert curve (in a box)
8(2) A combination of Koch-curves.
9
10The CurvesTurtle class and the fractal-curve-
11methods are taken from the PythonCard example
12scripts for turtle-graphics.
13"""
14from turtle import *
15from time import sleep, clock
16
17class CurvesTurtle(Pen):
18 # example derived from
19 # Turtle Geometry: The Computer as a Medium for Exploring Mathematics
20 # by Harold Abelson and Andrea diSessa
21 # p. 96-98
22 def hilbert(self, size, level, parity):
23 if level == 0:
24 return
25 # rotate and draw first subcurve with opposite parity to big curve
26 self.left(parity * 90)
27 self.hilbert(size, level - 1, -parity)
28 # interface to and draw second subcurve with same parity as big curve
29 self.forward(size)
30 self.right(parity * 90)
31 self.hilbert(size, level - 1, parity)
32 # third subcurve
33 self.forward(size)
34 self.hilbert(size, level - 1, parity)
35 # fourth subcurve
36 self.right(parity * 90)
37 self.forward(size)
38 self.hilbert(size, level - 1, -parity)
39 # a final turn is needed to make the turtle
40 # end up facing outward from the large square
41 self.left(parity * 90)
42
43 # Visual Modeling with Logo: A Structural Approach to Seeing
44 # by James Clayson
45 # Koch curve, after Helge von Koch who introduced this geometric figure in 1904
46 # p. 146
47 def fractalgon(self, n, rad, lev, dir):
48 import math
49
50 # if dir = 1 turn outward
51 # if dir = -1 turn inward
52 edge = 2 * rad * math.sin(math.pi / n)
53 self.pu()
54 self.fd(rad)
55 self.pd()
56 self.rt(180 - (90 * (n - 2) / n))
57 for i in range(n):
58 self.fractal(edge, lev, dir)
59 self.rt(360 / n)
60 self.lt(180 - (90 * (n - 2) / n))
61 self.pu()
62 self.bk(rad)
63 self.pd()
64
65 # p. 146
66 def fractal(self, dist, depth, dir):
67 if depth < 1:
68 self.fd(dist)
69 return
70 self.fractal(dist / 3, depth - 1, dir)
71 self.lt(60 * dir)
72 self.fractal(dist / 3, depth - 1, dir)
73 self.rt(120 * dir)
74 self.fractal(dist / 3, depth - 1, dir)
75 self.lt(60 * dir)
76 self.fractal(dist / 3, depth - 1, dir)
77
78def main():
79 ft = CurvesTurtle()
80
81 ft.reset()
82 ft.speed(0)
83 ft.ht()
84 ft.tracer(1,0)
85 ft.pu()
86
87 size = 6
88 ft.setpos(-33*size, -32*size)
89 ft.pd()
90
91 ta=clock()
92 ft.fillcolor("red")
93 ft.fill(True)
94 ft.fd(size)
95
96 ft.hilbert(size, 6, 1)
97
98 # frame
99 ft.fd(size)
100 for i in range(3):
101 ft.lt(90)
102 ft.fd(size*(64+i%2))
103 ft.pu()
104 for i in range(2):
105 ft.fd(size)
106 ft.rt(90)
107 ft.pd()
108 for i in range(4):
109 ft.fd(size*(66+i%2))
110 ft.rt(90)
111 ft.fill(False)
112 tb=clock()
113 res = "Hilbert: %.2fsec. " % (tb-ta)
114
115 sleep(3)
116
117 ft.reset()
118 ft.speed(0)
119 ft.ht()
120 ft.tracer(1,0)
121
122 ta=clock()
123 ft.color("black", "blue")
124 ft.fill(True)
125 ft.fractalgon(3, 250, 4, 1)
126 ft.fill(True)
127 ft.color("red")
128 ft.fractalgon(3, 200, 4, -1)
129 ft.fill(False)
130 tb=clock()
131 res += "Koch: %.2fsec." % (tb-ta)
132 return res
133
134if __name__ == '__main__':
135 msg = main()
136 print msg
137 mainloop()