-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlfractals.py
57 lines (53 loc) · 2.52 KB
/
lfractals.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Fractal(object):
constants = None
variables = None
actions = None
default_start_dir = 0
default_start_pos = (0,0)
default_axiom = None
default_depth = 0
# Stolen from https://en.wikipedia.org/wiki/L-system
class FractalPlant(Fractal):
default_start_dir = -50
default_axiom = 'X'
default_depth = 6
default_start_pos = (10,10)
variables = {'X': lambda: 'F[-X][X]F[-X]+FX', 'F': lambda: 'FF'}
constants = ['+', '-', '[', ']']
actions = {'F': lambda l, draw, fill, stroke_width: l.draw_forward(draw, fill=fill, stroke_width=stroke_width),
'[': lambda l, draw, fill, stroke_width: l.store(),
']': lambda l, draw, fill, stroke_width: l.restore(),
'X': lambda l, draw, fill, stroke_width: (l.pos, l.direction),
'-': lambda l, draw, fill, stroke_width: l.rotate(-25),
'+': lambda l, draw, fill, stroke_width: l.rotate(25)}
class DragonCurve(Fractal):
default_start_dir = 0
default_axiom = 'FX'
default_depth = 10
variables = {'X': lambda: 'X+YF+', 'Y': lambda: '-FX-Y'}
constants = ['F', '+', '-']
actions = {'F': lambda l, draw, fill, stroke_width: l.draw_forward(draw, fill=fill, stroke_width=stroke_width),
'-': lambda l, draw, fill, stroke_width: l.rotate(90),
'+': lambda l, draw, fill, stroke_width: l.rotate(-90),
'X': lambda l, draw, fill, stroke_width: (l.pos, l.direction),
'Y': lambda l, draw, fill, stroke_width: (l.pos, l.direction),
}
class SierpinskiTriangle(Fractal):
default_start_dir = 0
default_axiom = 'F-G-G'
default_depth = 4
variables = {'F': lambda: 'F-G+F+G-F', 'G': lambda: 'GG'}
constants = ['+', '-']
actions = {'F': lambda l, draw, fill, stroke_width: l.draw_forward(draw, fill=fill, stroke_width=stroke_width),
'G': lambda l, draw, fill, stroke_width: l.draw_forward(draw, fill=fill, stroke_width=stroke_width),
'+': lambda l, draw, fill, stroke_width: l.rotate(-120),
'-': lambda l, draw, fill, stroke_width: l.rotate(+120)}
class KochCurve(Fractal):
default_start_dir = 0
default_axiom = 'F'
default_depth = 4
variables = {'F': lambda: 'F+F-F-F+F'}
constants = ['+', '-']
actions = {'F': lambda l, draw, fill, stroke_width: l.draw_forward(draw, fill=fill, stroke_width=stroke_width),
'+': lambda l, draw, fill, stroke_width: l.rotate(-90),
'-': lambda l, draw, fill, stroke_width: l.rotate(+90)}