Skip to content

Commit ab3aab5

Browse files
author
Tom Jund
committed
Add Gosper curve fractal implementation
1 parent f527d43 commit ab3aab5

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

fractals/gosper_curve.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""
2+
A Python implementation of the Gosper curve using the turtle module.
3+
Reference: https://en.wikipedia.org/wiki/Gosper_curve
4+
"""
5+
6+
import math
7+
import turtle
8+
9+
10+
def draw_gosper_curve(
11+
side_length: float, depth: int, direction: int = -1, angle: float = 60.0
12+
) -> None:
13+
"""
14+
Recursively draws a Gosper curve fractal.
15+
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.
21+
"""
22+
if depth == 0:
23+
turtle.forward(side_length)
24+
else:
25+
side_length /= math.sqrt(7)
26+
depth -= 1
27+
if direction == -1:
28+
draw_gosper_curve(side_length, depth, -1, angle)
29+
turtle.left(angle)
30+
draw_gosper_curve(side_length, depth, 1, angle)
31+
turtle.left(2 * angle)
32+
draw_gosper_curve(side_length, depth, 1, angle)
33+
turtle.right(angle)
34+
draw_gosper_curve(side_length, depth, -1, angle)
35+
turtle.right(2 * angle)
36+
draw_gosper_curve(side_length, depth, -1, angle)
37+
draw_gosper_curve(side_length, depth, -1, angle)
38+
turtle.right(angle)
39+
draw_gosper_curve(side_length, depth, 1, angle)
40+
turtle.left(angle)
41+
else:
42+
turtle.right(angle)
43+
draw_gosper_curve(side_length, depth, -1, angle)
44+
turtle.left(angle)
45+
draw_gosper_curve(side_length, depth, 1, angle)
46+
draw_gosper_curve(side_length, depth, 1, angle)
47+
turtle.left(2 * angle)
48+
draw_gosper_curve(side_length, depth, 1, angle)
49+
turtle.left(angle)
50+
draw_gosper_curve(side_length, depth, -1, angle)
51+
turtle.right(2 * angle)
52+
draw_gosper_curve(side_length, depth, -1, angle)
53+
turtle.right(angle)
54+
draw_gosper_curve(side_length, depth, 1, angle)
55+
56+
57+
if __name__ == "__main__":
58+
turtle.title("Gosper Curve")
59+
turtle.penup()
60+
turtle.goto(0, -200)
61+
turtle.pendown()
62+
turtle.speed(0)
63+
turtle.width(1)
64+
65+
draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0)
66+
67+
turtle.exitonclick()

0 commit comments

Comments
 (0)