O Triângulo de Sierpinski, também conhecido como Junta de Sierpinski, é um fractal e um conjunto fixo atrativo com a forma global de um triângulo equilátero, subdividido recursivamente em triângulos equiláteros menores. Originalmente construído como uma curva, ele é um exemplo básico de conjuntos auto-similares, é um padrão gerado matematicamente que é possível reproduzir em qualquer ampliação ou redução.
O nome é dado em homenagem ao matemático polonês Wacław Sierpiński que contribuiu muito para com os campos de teoria dos conjuntos, teoria dos números, teoria das funções e topologia.
Existe em Python uma biblioteca chamada turtle que nos permite desenhar diversos formas de maneira relativamente simples.
Nesse caso iremos gerar o fractal recursivamente, ao quebrarmos o triângulo em três triângulos menores, depois quebrando esses triângulos em três triângulos menores e assim por diante. Teoricamente é possível fazermos isso infinitamente, porém para ilustração vamos utilizar apenas quatro vezes.
O algoritmo segue a seguinte ideia:
Dessa maneira talvez seja um pouco difícil de visualizarmos e compreendermos a ideia, para isso é importante que vejamos um exemplo do algoritmo em ação:
import turtle
# Função que faz a biblioteca turtle desenhar um triângulo,
# A unidade básica do nosso fractal
def draw_triangle(vertices,tartaruga):
tartaruga.up()
tartaruga.goto(vertices[0][0],vertices[0][1])
tartaruga.down()
tartaruga.goto(vertices[1][0],vertices[1][1])
tartaruga.goto(vertices[2][0],vertices[2][1])
tartaruga.goto(vertices[0][0],vertices[0][1])
# Função que define os pontos médios
def midpoint(p1, p2):
return [(p1[0] + p2[0])/2, (p1[1] + p2[1])/2]
# Função recursiva que desenha os diferentes "níveis" do fractal
def draw_fractal(vertices,level,tartaruga):
# Desenha um triângulo
draw_triangle(vertices,tartaruga)
# Chama a função recursivamente para desenhar todos os níveis do fractal
if level > 0:
# Desenha o primeiro segmento do fractal
# Os vértices sendo passados são o cantor inferior da primeira
# seção, o canto inferior da segunda seção e o canto inferior da terceira seção
draw_fractal([vertices[0],
midpoint(vertices[0], vertices[1]),
midpoint(vertices[0], vertices[2])],
level - 1, tartaruga)
draw_fractal([vertices[1],
midpoint(vertices[0], vertices[1]),
midpoint(vertices[1], vertices[2])],
level - 1, tartaruga)
draw_fractal([vertices[2],
midpoint(vertices[2], vertices[1]),
midpoint(vertices[0], vertices[2])],
level - 1, tartaruga)
tartaruga = turtle.Turtle()
tartaruga.hideturtle()
screen = turtle.Screen()
vertices = [[-300, -200], [0, 300], [300, -200]]
level = 4 # Define quão profunda a recursão para desenharmos o fractal
draw_fractal(vertices, level, tartaruga)
screen.exitonclick()