sábado, 5 de setembro de 2015

Python - Fractal

O que é uma fractal? De modo simples é um desenho geométrico que se repete. Existem milhares de exemplos na natureza da ação das fractais, um floco de neve, uma imagem microscópica da água congelada, mas a olho nu podemos observar uma árvore. Isso mesmo, uma árvore é uma fractal, principalmente um Pinheiro.


O que mais me atrai nas fractais, além de seus cálculos matemáticos, é um dos recursos utilizados em programação que poucas pessoas sabem como utilizar: Recursão.

Recursão é a capacidade de um método chamar a si mesmo várias vezes, essa técnica pode ser aplicada quando realizamos cálculos fatoriais. Sabemos que 5! (cinco fatorial) é 5x4x3x2x1 e o método utilizado para este cálculo é uma recursão, escrito em Python teria a seguinte codificação:
def fatorial(num):
  if (num > 1):
    return (num * fatorial(num-1))
  else:
    return 1

print(fatorial(5))
Dentro do método fatorial enquanto o número for maior que 1 é retornado uma nova chamada ao mesmo método só que com um valor menor, ou seja, neste caso, na primeira vez é passado o valor 5, o método fará uma chamada a si mesmo só que passando o valor 4, e assim sucessivamente até chegar ao valor 1.

Isso pode ser bem complexo para o iniciante em programação mas é um excelente recurso a se usar. Voltando as fractais, a recursão é a base do desenho, já que o mesmo deve se repetir um número limitado de vezes em posições com ângulos diferentes para que possa se formar o desenho.

Eis o código Python que permite o desenho de um pinheiro:
import turtle

def drawBranch(size, angle): # Funcao recursiva para desenhar os galhos
    turtle.fd(size)
    if size > 8: # Quanto menor mais concentrado
        turtle.rt(angle/2)
        drawBranch(size*0.75, angle)
        turtle.lt(angle)
        drawBranch(size*0.75, angle)
        turtle.rt(angle/2)
    turtle.bk(size)

# Parte principal.
size = 150              # Tamanho Base da Arvore
angle = 60              # Angulo entre os galhos.
turtle.tracer(8,0)      # Velocidade do desenho.
turtle.mode('logo')     # Orientacao - Use LOGO language orientation: turtle faces upward.
turtle.pu()             # Colocar a turtle em posicao.
turtle.bk(size*2)
turtle.pd()             # Posicionar a pena de desenho.
drawBranch(size, angle) # Iniciar o desenho.
turtle.exitonclick()    # Esperar para sair
Coloquei os detalhes do código em seu comentário. E como resultado teremos a seguinte imagem:


Obrigado e até a próxima
Fernando Anselmo

0 comentários:

Postar um comentário