Skip to content

Commit 70add35

Browse files
authored
Update gosper_curve.py
1 parent 4e32ef9 commit 70add35

File tree

1 file changed

+75
-60
lines changed

1 file changed

+75
-60
lines changed

fractals/gosper_curve.py

Lines changed: 75 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,89 @@
11
"""
2-
A Python implementation of the Gosper curve using the turtle module.
3-
Reference: https://en.wikipedia.org/wiki/Gosper_curve
2+
Description
3+
The Gosper curve (also known as the flowsnake) is a fractal curve discovered
4+
by Bill Gosper. It is generated recursively by replacing each line segment
5+
with a specific pattern of smaller segments rotated by multiples of
6+
60 degrees.
7+
8+
```
9+
With each iteration, the curve becomes more complex and gradually fills
10+
a hexagonal region.
11+
12+
(description adapted from https://en.wikipedia.org/wiki/Gosper_curve)
13+
```
14+
15+
Requirements (pip):
16+
- turtle (standard library)
417
"""
518

619
import math
720
import turtle
821

9-
1022
def draw_gosper_curve(
11-
side_length: float, depth: int, direction: int = -1, angle: float = 60.0
23+
side_length: float, depth: int, direction: int = -1, angle: float = 60.0
1224
) -> None:
13-
"""
14-
Recursively draws a Gosper curve fractal using turtle graphics.
25+
"""
26+
Recursively draw a Gosper curve using turtle graphics.
1527
16-
Args:
17-
side_length: The length of the current segment.
18-
depth: The recursive depth of the curve.
19-
direction: The direction of the drawing (1 or -1).
20-
angle: The angle of the turns in degrees.
28+
```
29+
Args:
30+
side_length: Length of the current segment.
31+
depth: Recursive depth of the fractal.
32+
direction: Direction of the curve (1 or -1).
33+
angle: Turn angle in degrees.
2134
22-
Example:
23-
>>> import turtle
24-
>>> draw_gosper_curve(200.0, 4, -1, 60.0) # doctest: +SKIP
25-
"""
26-
if depth == 0:
27-
turtle.forward(side_length)
28-
else:
29-
side_length /= math.sqrt(7)
30-
depth -= 1
31-
if direction == -1:
32-
draw_gosper_curve(side_length, depth, -1, angle)
33-
turtle.left(angle)
34-
draw_gosper_curve(side_length, depth, 1, angle)
35-
turtle.left(2 * angle)
36-
draw_gosper_curve(side_length, depth, 1, angle)
37-
turtle.right(angle)
38-
draw_gosper_curve(side_length, depth, -1, angle)
39-
turtle.right(2 * angle)
40-
draw_gosper_curve(side_length, depth, -1, angle)
41-
draw_gosper_curve(side_length, depth, -1, angle)
42-
turtle.right(angle)
43-
draw_gosper_curve(side_length, depth, 1, angle)
44-
turtle.left(angle)
45-
else:
46-
turtle.right(angle)
47-
draw_gosper_curve(side_length, depth, -1, angle)
48-
turtle.left(angle)
49-
draw_gosper_curve(side_length, depth, 1, angle)
50-
draw_gosper_curve(side_length, depth, 1, angle)
51-
turtle.left(2 * angle)
52-
draw_gosper_curve(side_length, depth, 1, angle)
53-
turtle.left(angle)
54-
draw_gosper_curve(side_length, depth, -1, angle)
55-
turtle.right(2 * angle)
56-
draw_gosper_curve(side_length, depth, -1, angle)
57-
turtle.right(angle)
58-
draw_gosper_curve(side_length, depth, 1, angle)
35+
>>> import turtle
36+
>>> draw_gosper_curve(100.0, 1)
37+
"""
38+
if depth == 0:
39+
turtle.forward(side_length)
40+
return
41+
42+
side_length /= math.sqrt(7)
43+
depth -= 1
44+
45+
if direction == -1:
46+
draw_gosper_curve(side_length, depth, -1, angle)
47+
turtle.left(angle)
48+
draw_gosper_curve(side_length, depth, 1, angle)
49+
turtle.left(2 * angle)
50+
draw_gosper_curve(side_length, depth, 1, angle)
51+
turtle.right(angle)
52+
draw_gosper_curve(side_length, depth, -1, angle)
53+
turtle.right(2 * angle)
54+
draw_gosper_curve(side_length, depth, -1, angle)
55+
draw_gosper_curve(side_length, depth, -1, angle)
56+
turtle.right(angle)
57+
draw_gosper_curve(side_length, depth, 1, angle)
58+
turtle.left(angle)
59+
else:
60+
turtle.right(angle)
61+
draw_gosper_curve(side_length, depth, -1, angle)
62+
turtle.left(angle)
63+
draw_gosper_curve(side_length, depth, 1, angle)
64+
draw_gosper_curve(side_length, depth, 1, angle)
65+
turtle.left(2 * angle)
66+
draw_gosper_curve(side_length, depth, 1, angle)
67+
turtle.left(angle)
68+
draw_gosper_curve(side_length, depth, -1, angle)
69+
turtle.right(2 * angle)
70+
draw_gosper_curve(side_length, depth, -1, angle)
71+
turtle.right(angle)
72+
draw_gosper_curve(side_length, depth, 1, angle)
73+
```
5974

75+
if **name** == "**main**":
76+
turtle.title("Gosper Curve")
77+
turtle.speed(0)
6078

61-
if __name__ == "__main__":
62-
# Screen setup
63-
turtle.title("Gosper Curve")
64-
turtle.penup()
65-
turtle.goto(0, -200)
66-
turtle.pendown()
67-
turtle.speed(0)
68-
turtle.width(1)
79+
```
80+
turtle.penup()
81+
turtle.goto(0, -200)
82+
turtle.pendown()
6983

70-
# Drawing the curve
71-
draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0)
84+
draw_gosper_curve(200.0, 4)
7285

73-
# Close window on click
74-
turtle.exitonclick()
86+
turtle.exitonclick()
87+
```
88+
89+
"""

0 commit comments

Comments
 (0)