Skip to content

Add Vicsek to fractals #11306

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 20, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions fractals/vicsek.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""Authors Bastien Capiaux & Mehdi Oudghiri

The Vicsek fractal algorithm is a recursive algorithm that creates a
pattern known as the Vicsek fractal or the Vicsek square.
It is based on the concept of self-similarity, where the pattern at each
level of recursion resembles the overall pattern.
The algorithm involves dividing a square into 9 equal smaller squares,
removing the center square, and then repeating this process on the remaining 8 squares.
This results in a pattern that exhibits self-similarity and has a
square-shaped outline with smaller squares within it.

Source: https://en.wikipedia.org/wiki/Vicsek_fractal
"""

import turtle


def draw_cross(x: float, y: float, length: float):
"""
Draw a cross at the specified position and with the specified length.
"""
turtle.up()
turtle.goto(x - length / 2, y - length / 6)
turtle.down()
turtle.seth(0)
turtle.begin_fill()
for _ in range(4):
turtle.fd(length / 3)
turtle.right(90)
turtle.fd(length / 3)
turtle.left(90)
turtle.fd(length / 3)
turtle.left(90)
turtle.end_fill()


def draw_fractal_recursive(x: float, y: float, length: float, depth: float):
"""
Recursively draw the Vicsek fractal at the specified position, with the
specified length and depth.
"""
if depth == 0:
draw_cross(x, y, length)
return

draw_fractal_recursive(x, y, length / 3, depth - 1)
draw_fractal_recursive(x + length / 3, y, length / 3, depth - 1)
draw_fractal_recursive(x - length / 3, y, length / 3, depth - 1)
draw_fractal_recursive(x, y + length / 3, length / 3, depth - 1)
draw_fractal_recursive(x, y - length / 3, length / 3, depth - 1)


def set_color(rgb: str):
turtle.color(rgb)


def draw_vicsek_fractal(x: float, y: float, length: float, depth: float, color="blue"):
"""
Draw the Vicsek fractal at the specified position, with the specified
length and depth.
"""
turtle.speed(0)
turtle.hideturtle()
set_color(color)
draw_fractal_recursive(x, y, length, depth)
turtle.Screen().update()


def main():
draw_vicsek_fractal(0, 0, 800, 4)

turtle.done()


if __name__ == "__main__":
main()