lunes, 22 de marzo de 2010

Logo y colorines ( y II )

Volvemos con la segunda parte sobre Logo, con unas cuantas figuras...

La primera, para empezar es bastante facil:
to figura1 :veces :tamanho
     repeat :veces[right 360/:veces
                   repeat 360[ forward :tamanho right 1 ]
                   ]
end


Y " figura1 72 2  " resulta en ...


Fractales
Pasamos a algo mas dificil :)}

¿Que es un fractal? (segun Wikipedia)

Un fractal es un objeto semigeométrico cuya estructura básica, fragmentada o irregular, se repite a diferentes escalas.[1] Una mejor manera para comprender el comportamiento fractal de nuestro universo es considerar la siguiente definición: "Patrones que se repiten a distintas escalas".
A un objeto geométrico fractal se le atribuyen las siguientes características:[2]
Dejemos aparte todo lo de "autosimilar", "dimensiones topologicas" y demas... lo mas comprensible es que "se repite a distintas escalas" y "se define mediante un simple algoritmo recursivo", vamos a probar...

to fractal_cuadrado :long :prof
    if prof <= 0 [stop]
    repeat 4[ forward :long
                     right 90
                     fractal_cuadrado :long/(2.5) :prof-1
                   ]
end


Llamando a "fractal_cuadrado 300 5", conseguimos esto:


Veamos como funciona, y de paso como hacer que el codigo sea aplicable a cualquier figura, la idea es esta:

to fractal_cuadrado :long :prof
No necesita explicacion, declaramos la funcion fractal_cuadrado, con los argumentos long (longitud) y prof (profundidad)

if prof <= 0 [stop]

El caso base, si ya se llego al ultimo nivel de profundidad, ya se acabo

    repeat 4[ forward :long
                     right 90
                     fractal_cuadrado :long/(2.5) :prof-1

                   ]

Como se puede ver, es practicamente el mismo codigo que para dibujar un cuadrado, solo se le añade   fractal_cuadrado :long/(2.5) :prof-1  al final, lo que hace que en cada esquina repita el proceso completo, pero haciendolo mas pequeño y con menos profundidad (sino acabaria siendo infinita)

Es decir, que en cada esquina del cuadrado, se dibuja un cuadrado mas pequeño, y en cada esquina de ese cuadrado, otro aun mas pequeño, asi hasta que se alcance la profundidad maxima (a este proceso se le llama recursion)

end
Fin de la funcion

Ahora veamos como modificar el codigo para que funcione con otras figuras, el caso base no cambia...
to fractal2 :lados :long :prof
    if prof <= 0 [stop]


... asi que solo nos queda el
    repeat 4[ forward :long
                     right 90
                     fractal_cuadrado :long/(2.5) :prof-1

                   ]

De nuevo,es bastante reconocible la parte que dibuja el cuadrado (esto se explica en el otro post sobre logo), asi que...
    repeat :lados[ forward :long
                     right 360/:lados
                     fractal2 :lados :long/(2.5) :prof-1

                   ]
Solo falta el    fractal2 :lados :long/(2.5) :prof-1 ,  la unica parte que hay que cambiar es la de :long/(2.5),  el problema es que este numero (el 2.5 ) es algo arbitrario, debe ser lo suficientemente alto como para separar las figuras "que salen de las esquinas", distancia que es mayor a medida que aumenta :log, pero sin pasarse, por ejemplo :long/(2+((:lados/100)*(:lados*:lados))) servira, asi , el codigo queda

to fractal2 :lados :long :prof
    if prof <= 0 [stop]
     repeat :lados[ forward :long
                     right 360/:lados
                     fractal2 :lados :long/(2+((:lados/100)*(:lados*:lados))) :prof-1
                   ]
end


Y llamando a "fractal2  3 200 4"...
(¿A nadie le suena de algo?)

Y para ir acabando... arboles binarios!

Un arbol binario es uno que del que salen dos arboles (tambien binarios), de los que vuelven a salir dos, y ... bueno, ya cojeis la idea

to arbol_binario :long :prof :grados
    if prof <= 0 [ stop ]
    forward :long
    left :grados
    arbol_binario :long/2 :prof-1 :grados
    right :grados*2
    arbol_binario :long/2 :prof-1 :grados
    left :grados
    back :long
end


Veamos como va, se que habra a quien le aburra y lo vea claro, pero, si ese es el caso, siempre os podeis saltar la explicacion... (Esta vez voy a prescindir del codigo)

La idea basicamente es hacer que cada vez que el arbol avance, se divida en dos y repetir en cada uno de los dos el mismo proceso, para que esto se pueda hacer, ademas hay que volver a la posicion original cada vez (si, simple y rapido)

Llamando a arbol_binario 200 10 30  tenemos:



Y eso es todo con Logo!

Pero espera... esto es "Logo y colorines" !! , hace falta algo de color, volvamos a la primera imagen:


La abrimos con GIMP y usamos en los filtros Artistico>GIMPresionista, el Crosshatch, obtenemos esto:

Seleccionamos todo lo que no es el fondo, y se aplica una mezcla de Quemado, con forma Radial, con centro en el centro del circulo, el resultado:

No es gran cosa, pero tendra que valer :P
Ahora si, hasta otra!

[Referencias]
http://et.bgcbellevue.org/logo/fractals.html

No hay comentarios:

Publicar un comentario