-
-
Notifications
You must be signed in to change notification settings - Fork 50.4k
Expand file tree
/
Copy pathgosper_curve.py
More file actions
83 lines (68 loc) · 2.43 KB
/
gosper_curve.py
File metadata and controls
83 lines (68 loc) · 2.43 KB
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""
Description
The Gosper curve (also known as the flowsnake) is a fractal curve discovered
by Bill Gosper. It is generated recursively by replacing each line segment
with a specific pattern of smaller segments rotated by multiples of
60 degrees.
With each iteration, the curve becomes more complex and gradually fills
a hexagonal region.
(description adapted from https://en.wikipedia.org/wiki/Gosper_curve)
Requirements (pip):
- turtle (standard library)
"""
import math
import turtle
def draw_gosper_curve(
side_length: float, depth: int, direction: int = -1, angle: float = 60.0
) -> None:
"""
Recursively draw a Gosper curve using turtle graphics.
Args:
side_length: Length of the current segment.
depth: Recursive depth of the fractal.
direction: Direction of the curve (1 or -1).
angle: Turn angle in degrees.
Note:
Do not run this as a doctest; it uses turtle graphics.
"""
if depth == 0:
turtle.forward(side_length)
return
side_length /= math.sqrt(7)
depth -= 1
if direction == -1:
draw_gosper_curve(side_length, depth, -1, angle)
turtle.left(angle)
draw_gosper_curve(side_length, depth, 1, angle)
turtle.left(2 * angle)
draw_gosper_curve(side_length, depth, 1, angle)
turtle.right(angle)
draw_gosper_curve(side_length, depth, -1, angle)
turtle.right(2 * angle)
draw_gosper_curve(side_length, depth, -1, angle)
draw_gosper_curve(side_length, depth, -1, angle)
turtle.right(angle)
draw_gosper_curve(side_length, depth, 1, angle)
turtle.left(angle)
else:
turtle.right(angle)
draw_gosper_curve(side_length, depth, -1, angle)
turtle.left(angle)
draw_gosper_curve(side_length, depth, 1, angle)
draw_gosper_curve(side_length, depth, 1, angle)
turtle.left(2 * angle)
draw_gosper_curve(side_length, depth, 1, angle)
turtle.left(angle)
draw_gosper_curve(side_length, depth, -1, angle)
turtle.right(2 * angle)
draw_gosper_curve(side_length, depth, -1, angle)
turtle.right(angle)
draw_gosper_curve(side_length, depth, 1, angle)
if __name__ == "__main__":
turtle.title("Gosper Curve")
turtle.speed(0)
turtle.penup()
turtle.goto(0, -200)
turtle.pendown()
draw_gosper_curve(200.0, 4)
turtle.exitonclick()