mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-12-22 19:20:17 +00:00
77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
|
"""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()
|