forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vicsek.py
76 lines (59 loc) · 2.18 KB
/
vicsek.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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()