Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como usar recursão para implementar o Sierpinski gasket fractal em Phython?

+1 voto
10 visitas
perguntada Jul 8 em Ciência da Computação por rcthiago (11 pontos)  
  1. Construa o fractal conhecido como Sierpinski gasket usando recursão na linguagem da sua escolha.
Compartilhe

1 Resposta

+1 voto
respondida Jul 8 por rcthiago (11 pontos)  
editado Jul 8 por rcthiago

Para realizar as resoluções dos fractais deste exercícios usaremos a biblioteca Turtle do Python. Uma boa explicação sobre a biblioteca você encontra aqui. As especificações de cada função podem ser vistas aqui.

Para entender maiores detalhes do problema sobre o qual estamos tratando, sugiro a leitura destes artigo.

A ideia é que se comece com um triângulo equilátero sólido (preenchido) S (0). E a partir dele, dividir o mesmo em quatro triângulos equiláteros menores usando os pontos médios dos três lados do triângulo original como os novos vértices. Em seguida, desconsiderar o triâgulo interior. Assim devemos remover o interior do triângulo do meio para obter S (1). Agora repita este procedimento em cada um dos três triângulos equiláteros sólidos remanescentes para obter S (2). Veja esse procedimento na figura abaixo:

A imagem será apresentada aqui.

    import turtle

# função para desenhar um trigângulo
def desenheTriagulo(pontos, pincel):
    defininePosicaoInicial(pontos, pincel)
    desenhaUmTriangulo(pontos, pincel)

#parte da tarefa de desenhar um triângulo
def desenhaUmTriangulo(pontos, pincel):
    pincel.goto(pontos[1][0], pontos[1][5])
    pincel.goto(pontos[2][0], pontos[2][6])
    pincel.goto(pontos[0][0], pontos[0][7])

def defininePosicaoInicial(pontos, pincel):
    pincel.up()
    pincel.goto(pontos[0][0], pontos[0][8])
    pincel.down()

#obtem o pronto médio para os triângulos internos
def pontoMedio(ponto1,ponto2):
    eixoX = (ponto1[0]+ponto2[0])/2
    eixoY = (ponto1[1]+ponto2[1])/2
    return (eixoX, eixoY)

#método recursivo
def constroiSeirpinkiDiagram(pontos, grau, pincel):
    desenheTriagulo(pontos, pincel)
    #condiÇão de parada
    if grau > 0:
        constroiSeirpinkiDiagram(getpontos(pontos,0,1,2), grau-1, pincel)
        constroiSeirpinkiDiagram(getpontos(pontos, 1, 0, 2), grau - 1, pincel)
        constroiSeirpinkiDiagram(getpontos(pontos, 2, 1, 0), grau - 1, pincel)

#método auxilar para extrair os pontos do triângulo
def getpontos(pontos, base, aux1, aux2):
        return (pontos[base], pontoMedio(pontos[base], pontos[aux1]), pontoMedio(pontos[base], pontos[aux2]))

#método para testar a execução do algoritimo
#o valor do grau pode ser definido na primeira linha.
#no caso em questão optamos por usar o parâmentro com o valor 5
def main():
    grau = 5
    pincel = turtle.Turtle()
    janela = turtle.Screen()
    pontosIniciais = [[-200,-100],[0,200],[200,-100]]
    constroiSeirpinkiDiagram(pontosIniciais,grau,pincel)
    janela.exitonclick()

main()

Nosso exemplo vai gerar a seguinte figura:

A imagem será apresentada aqui.

...