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

Como replicar a figura 3.22 (b) do livro "The Algorithmic Beauty of Plants - Przemyslaw Prusinkiewicz and Aristid Lindenmayer (1991)"?

0 votos
39 visitas
perguntada Jun 10 em Ciência da Computação por Monica Guo (41 pontos)  

A imagem a ser replicada por recursão é:

A imagem será apresentada aqui.

Compartilhe

1 Resposta

0 votos
respondida Jun 10 por Monica Guo (41 pontos)  

Para replicarmos a figura em questão, utilizamos o pacote turtle. Podemos criar várias figuras utilizando os métodos do turtle, especificando ângulo, comprimento, forma geométrica a ser desenhada, etc.

Como queremos replicar a figura utilizando recursão, criamos uma função denominada drawTree a qual é chamada dentro dela mesma recursivamente até que um critério de parada seja satisfeito. Nesse caso, utilizamos o critério de parada como sendo o level, que representa quantos níveis de galho a árvore tem. A imagem que queremos replicar possui dois níveis, e portanto level é igual a 2.

A cada nível, o comprimento do galho diminui na proporção definida por ratio. Além disso, é importante notar que a cada vez que chamamos a função, o level diminui, até que o critério de parada seja satisfeito. A árvore é composta por 7 galhos em cada nível. A função implementada foi:

from turtle import *

# Função recursiva que desenha a árvore com auxílio do turtle
# Level diz o nível da árvore, size diz o tamanho do galho, angle é o ângulo 
# do galho e ratio é a razão dos tamanhs dos galhos
def drawTree(level,size,angle,ratio):
  if level >= 0:
    # Desenhando o primeiro galho
    forward(size)
    left(angle)
    drawTree(level-1,size/ratio,angle,ratio)
    right(2*angle)
    # Desenhando e pintando as bolinhas na ponta de cada galho
    fillcolor('black')
    begin_fill()
    circle(1)
    end_fill()
    # Desenhando o segundo galho
    drawTree(level-1,size/ratio,angle,ratio)
    left(angle)
    forward(-size)    

    # Desenhando o terceiro galho
    forward(size)
    left(2*angle)
    drawTree(level-1,size/ratio,angle,ratio)
    right(4*angle)
    # Desenhando o quarto galho
    drawTree(level-1,size/ratio,angle,ratio)
    left(2*angle)
    forward(-size)


    # Desenhando o quinto galho
    forward(size)
    left(3*angle)
    drawTree(level-1,size/ratio,angle,ratio)
    right(6*angle)
    # Desenhando o sexto galho
    drawTree(level-1,size/ratio,angle,ratio)
    left(3*angle)
    forward(-size)

    # Desenhando o sétimo galho (o galho central)
    forward(size)
    left(0.08*angle)
    drawTree(level-1,size/ratio,angle,ratio)
    right(0.16*angle)
    left(0.08*angle)
    forward(-size)
    right(215)
    circle(5,60) 
    circle(5,-60) 
    left(215)


  else:
    # Condição de parada
    return

Na função principal, definimos os valores dos parâmetros de simulação (level, ratio, angle e size), inicializamos o cursor do turtle e chamamos a função drawTree com os parâmetros definidos.

if __name__ == '__main__':

    # Configurações iniciais
    speed(0)
    penup()
    goto(0,-180)
    left(90)
    pendown()

    # Definindo os valores dos parâmetros
    size = 230
    angle = 25 
    ratio = 4
    level = 2

    drawTree(level,size,angle,ratio)

    exitonclick()
    turtle.done()

O resultado obtido foi:

A imagem será apresentada aqui.

...