domingo, abril 27, 2008

Curva de Koch

Llevo un tiempo releyendo un libro de fractales que compré hace más de 10 años, Geometría fractal, Algorítmica y representación, de Javier Barrallo Calonge, donde se da una breve introducción a diversos conjuntos fractales. En vez de usar C, he decidido probar alguno de los algoritmos que explican en el libro usando Python, en especial porque tiene un módulo, turtle que permite realizar sin ninguna dificultad gráficos de tortuga. De esta manera puedo tener código que se ejecuta en cualquier sistema que tenga el interprete Python, eso si, al menos la versión 2.4 del mismo. Aunque pierda algo de velocidad, es mucho más fácil de ver los resultados.

Curva de Koch

El primer fractal con el que he estado intentando es la curva de Koch. Esta curva se generar tomando un segmento de recta, dividiéndola en tres trozos, y sustituyendo el segmento central por otros dos segmentos rotado el primero 60º respecto al primero y el segundo 120º respecto al primero. Este proceso se repite de manera recursiva, hasta la profundidad que deseemos. El código python que genera la curva es el siguiente:
#!/usr/bin/python

import turtle

def genera_koch(level,l):
        if level==0:
                turtle.forward(l)
        else:
                genera_koch(level-1,l/3)
                turtle.left(60)
                genera_koch(level-1,l/3)
                turtle.left(-120)
                genera_koch(level-1,l/3)
                turtle.left(60)
                genera_koch(level-1,l/3)
turtle.setup(width=800,height=600,startx=400,starty=300)
turtle.up()
turtle.backward(125)
turtle.down()
turtle.degrees()
turtle.tracer(0)
genera_koch(5,250)
raw_input()
El programa anterior nos genera la siguiente figura:

Curva de Koch

El copo de nieve

Para generar el copo de nieve, lo que se debe hacer es partir de un triángulo equilátero, donde sustituimos cada uno de los lados del mismo con una curva de Koch. El código es el siguiente:
#!/usr/bin/python

import turtle

def genera_koch(level,l):
        if level==0:
                turtle.forward(l)
        else:
                genera_koch(level-1,l/3)
                turtle.left(60)
                genera_koch(level-1,l/3)
                turtle.left(-120)
                genera_koch(level-1,l/3)
                turtle.left(60)
                genera_koch(level-1,l/3)




turtle.setup(width=800,height=600,startx=400,starty=300)
turtle.up()
turtle.degrees()
turtle.tracer(0)
turtle.goto(-100,200)
turtle.down()
for i in range(0,3):
        genera_koch(4,250)
        turtle.right(120)
raw_input()
Este código genera el siguient gráfico: Copo de Nieve

Referencias

No hay comentarios: