From ab3aab51915da4225112b755cccc3611de62c62b Mon Sep 17 00:00:00 2001 From: Tom Jund Date: Sun, 8 Mar 2026 21:13:34 +0100 Subject: [PATCH 01/13] Add Gosper curve fractal implementation --- fractals/gosper_curve.py | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 fractals/gosper_curve.py diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py new file mode 100644 index 000000000000..cda6590c0473 --- /dev/null +++ b/fractals/gosper_curve.py @@ -0,0 +1,67 @@ +""" +A Python implementation of the Gosper curve using the turtle module. +Reference: https://en.wikipedia.org/wiki/Gosper_curve +""" + +import math +import turtle + + +def draw_gosper_curve( + side_length: float, depth: int, direction: int = -1, angle: float = 60.0 +) -> None: + """ + Recursively draws a Gosper curve fractal. + + Args: + side_length: The length of the current segment. + depth: The recursive depth of the curve. + direction: The direction of the drawing (1 or -1). + angle: The angle of the turns in degrees. + """ + if depth == 0: + turtle.forward(side_length) + else: + 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.penup() + turtle.goto(0, -200) + turtle.pendown() + turtle.speed(0) + turtle.width(1) + + draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) + + turtle.exitonclick() From 5e06aed7f62621606cadc568b5ae3f73fbdb8f8f Mon Sep 17 00:00:00 2001 From: Tom Jund Date: Sun, 8 Mar 2026 21:16:42 +0100 Subject: [PATCH 02/13] Add Gosper curve fractal implementation --- fractals/gosper_curve.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index cda6590c0473..90756e855f41 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -18,7 +18,12 @@ def draw_gosper_curve( depth: The recursive depth of the curve. direction: The direction of the drawing (1 or -1). angle: The angle of the turns in degrees. + + Example: + >>> import turtle + >>> draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) # doctest: +SKIP """ + if depth == 0: turtle.forward(side_length) else: From cf34febbd276a36550ab6ff9e5d8d0ffe51e318b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:17:53 +0000 Subject: [PATCH 03/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- fractals/gosper_curve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 90756e855f41..b8d48cd99fb9 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -23,7 +23,7 @@ def draw_gosper_curve( >>> import turtle >>> draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) # doctest: +SKIP """ - + if depth == 0: turtle.forward(side_length) else: From 042e435b2f6bb2ea5dd4e0a62de213e051b43556 Mon Sep 17 00:00:00 2001 From: Tom Jund Date: Sun, 8 Mar 2026 21:20:51 +0100 Subject: [PATCH 04/13] Add Gosper curve fractal implementation --- fractals/gosper_curve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index b8d48cd99fb9..e336d5bdf0dc 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -21,7 +21,7 @@ def draw_gosper_curve( Example: >>> import turtle - >>> draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) # doctest: +SKIP + >>> draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) """ if depth == 0: From 127a6f01fcca1124bebdc69701e180a8e4d56ef5 Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 21:29:06 +0100 Subject: [PATCH 05/13] Update gosper_curve.py --- fractals/gosper_curve.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index e336d5bdf0dc..8bd758c52e72 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -8,8 +8,7 @@ def draw_gosper_curve( - side_length: float, depth: int, direction: int = -1, angle: float = 60.0 -) -> None: + side_length: float, depth: int, direction: int = -1, angle: float = 60.0) -> None: """ Recursively draws a Gosper curve fractal. From 91e7e62e540dc619edf46e42daea0670f153f34b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:29:56 +0000 Subject: [PATCH 06/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- fractals/gosper_curve.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 8bd758c52e72..e336d5bdf0dc 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -8,7 +8,8 @@ def draw_gosper_curve( - side_length: float, depth: int, direction: int = -1, angle: float = 60.0) -> None: + side_length: float, depth: int, direction: int = -1, angle: float = 60.0 +) -> None: """ Recursively draws a Gosper curve fractal. From 86788d86b57c9dea2b9c2e158fd0b6f5cdbbd9a7 Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 21:39:57 +0100 Subject: [PATCH 07/13] Update gosper_curve.py --- fractals/gosper_curve.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index e336d5bdf0dc..0a2b2c06f21e 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -18,10 +18,6 @@ def draw_gosper_curve( depth: The recursive depth of the curve. direction: The direction of the drawing (1 or -1). angle: The angle of the turns in degrees. - - Example: - >>> import turtle - >>> draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) """ if depth == 0: From 9f45232cd169be1273891118d9916f8350028a1c Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 21:41:14 +0100 Subject: [PATCH 08/13] Update gosper_curve.py --- fractals/gosper_curve.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 0a2b2c06f21e..41dd06249eb1 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -8,8 +8,7 @@ def draw_gosper_curve( - side_length: float, depth: int, direction: int = -1, angle: float = 60.0 -) -> None: + side_length: float, depth: int, direction: int = -1, angle: float = 60.0) -> None: """ Recursively draws a Gosper curve fractal. @@ -18,8 +17,15 @@ def draw_gosper_curve( depth: The recursive depth of the curve. direction: The direction of the drawing (1 or -1). angle: The angle of the turns in degrees. - """ + Example: + >>> import turtle + >>> # Mocking turtle methods to allow testing without a GUI + >>> turtle.forward = lambda x: None + >>> turtle.left = lambda x: None + >>> turtle.right = lambda x: None + >>> draw_gosper_curve(100.0, 2, -1, 60.0) + """ if depth == 0: turtle.forward(side_length) else: @@ -56,6 +62,10 @@ def draw_gosper_curve( if __name__ == "__main__": + import doctest + + doctest.testmod() + turtle.title("Gosper Curve") turtle.penup() turtle.goto(0, -200) From 0aa32246865effa725ee1ff66d3ad0c4a1544d5d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:41:49 +0000 Subject: [PATCH 09/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- fractals/gosper_curve.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 41dd06249eb1..94688c4948a2 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -8,7 +8,8 @@ def draw_gosper_curve( - side_length: float, depth: int, direction: int = -1, angle: float = 60.0) -> None: + side_length: float, depth: int, direction: int = -1, angle: float = 60.0 +) -> None: """ Recursively draws a Gosper curve fractal. From 4e32ef904bef3725b1d19654a3cda1dfa024f850 Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 21:44:36 +0100 Subject: [PATCH 10/13] Update gosper_curve.py --- fractals/gosper_curve.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 94688c4948a2..7565fcaa6dd1 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -11,7 +11,7 @@ def draw_gosper_curve( side_length: float, depth: int, direction: int = -1, angle: float = 60.0 ) -> None: """ - Recursively draws a Gosper curve fractal. + Recursively draws a Gosper curve fractal using turtle graphics. Args: side_length: The length of the current segment. @@ -21,11 +21,7 @@ def draw_gosper_curve( Example: >>> import turtle - >>> # Mocking turtle methods to allow testing without a GUI - >>> turtle.forward = lambda x: None - >>> turtle.left = lambda x: None - >>> turtle.right = lambda x: None - >>> draw_gosper_curve(100.0, 2, -1, 60.0) + >>> draw_gosper_curve(200.0, 4, -1, 60.0) # doctest: +SKIP """ if depth == 0: turtle.forward(side_length) @@ -63,10 +59,7 @@ def draw_gosper_curve( if __name__ == "__main__": - import doctest - - doctest.testmod() - + # Screen setup turtle.title("Gosper Curve") turtle.penup() turtle.goto(0, -200) @@ -74,6 +67,8 @@ def draw_gosper_curve( turtle.speed(0) turtle.width(1) + # Drawing the curve draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) + # Close window on click turtle.exitonclick() From 70add355bfa8a9659cfe539b23aceb35f31867d7 Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 21:48:57 +0100 Subject: [PATCH 11/13] Update gosper_curve.py --- fractals/gosper_curve.py | 135 ++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 60 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 7565fcaa6dd1..ab0c096a9162 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -1,74 +1,89 @@ """ -A Python implementation of the Gosper curve using the turtle module. -Reference: https://en.wikipedia.org/wiki/Gosper_curve +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 +side_length: float, depth: int, direction: int = -1, angle: float = 60.0 ) -> None: - """ - Recursively draws a Gosper curve fractal using turtle graphics. +""" +Recursively draw a Gosper curve using turtle graphics. - Args: - side_length: The length of the current segment. - depth: The recursive depth of the curve. - direction: The direction of the drawing (1 or -1). - angle: The angle of the turns in degrees. +``` +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. - Example: - >>> import turtle - >>> draw_gosper_curve(200.0, 4, -1, 60.0) # doctest: +SKIP - """ - if depth == 0: - turtle.forward(side_length) - else: - 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) +>>> import turtle +>>> draw_gosper_curve(100.0, 1) +""" +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) -if __name__ == "__main__": - # Screen setup - turtle.title("Gosper Curve") - turtle.penup() - turtle.goto(0, -200) - turtle.pendown() - turtle.speed(0) - turtle.width(1) +``` +turtle.penup() +turtle.goto(0, -200) +turtle.pendown() - # Drawing the curve - draw_gosper_curve(side_length=200.0, depth=4, direction=-1, angle=60.0) +draw_gosper_curve(200.0, 4) - # Close window on click - turtle.exitonclick() +turtle.exitonclick() +``` + +""" From 4c488fb97ebe539c8466aab9499b8fcf692b4704 Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 21:50:26 +0100 Subject: [PATCH 12/13] Update gosper_curve.py --- fractals/gosper_curve.py | 129 +++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 67 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index ab0c096a9162..790ccf1c42c6 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -1,89 +1,84 @@ """ 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. + 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. + With each iteration, the curve becomes more complex and gradually fills + a hexagonal region. -(description adapted from https://en.wikipedia.org/wiki/Gosper_curve) -``` + (description adapted from https://en.wikipedia.org/wiki/Gosper_curve) Requirements (pip): -- turtle (standard library) + - turtle (standard library) """ import math import turtle + def draw_gosper_curve( -side_length: float, depth: int, direction: int = -1, angle: float = 60.0 + side_length: float, depth: int, direction: int = -1, angle: float = 60.0 ) -> None: -""" -Recursively draw a Gosper curve using turtle graphics. + """ + 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. + 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. ->>> import turtle ->>> draw_gosper_curve(100.0, 1) -""" -if depth == 0: - turtle.forward(side_length) - return + Example: + >>> import turtle + >>> draw_gosper_curve(100.0, 1) + """ + if depth == 0: + turtle.forward(side_length) + return -side_length /= math.sqrt(7) -depth -= 1 + 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 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() +if __name__ == "__main__": + turtle.title("Gosper Curve") + turtle.speed(0) -draw_gosper_curve(200.0, 4) + turtle.penup() + turtle.goto(0, -200) + turtle.pendown() -turtle.exitonclick() -``` + draw_gosper_curve(200.0, 4) -""" + turtle.exitonclick() From 318f4f36f22fda3e10cb9b9405534c3d442b9b65 Mon Sep 17 00:00:00 2001 From: badtommy67 <104507862+badtommy67@users.noreply.github.com> Date: Sun, 8 Mar 2026 22:04:51 +0100 Subject: [PATCH 13/13] Update gosper_curve.py --- fractals/gosper_curve.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fractals/gosper_curve.py b/fractals/gosper_curve.py index 790ccf1c42c6..6848ceed66ed 100644 --- a/fractals/gosper_curve.py +++ b/fractals/gosper_curve.py @@ -30,9 +30,8 @@ def draw_gosper_curve( direction: Direction of the curve (1 or -1). angle: Turn angle in degrees. - Example: - >>> import turtle - >>> draw_gosper_curve(100.0, 1) + Note: + Do not run this as a doctest; it uses turtle graphics. """ if depth == 0: turtle.forward(side_length)