Mostrando entradas con la etiqueta fractal. Mostrar todas las entradas
Mostrando entradas con la etiqueta fractal. Mostrar todas las entradas

martes, 11 de enero de 2011

La curva del dragón con Logo

Nada, que después de encontrarse uno con que alguien se las arreglo para hacer este fractal con redcode [ http://impomatic.blogspot.com/2011/01/dragon-curve-in-redcode.html ] (para quitarse el sombrero, vaya :P !) no se puede menos que intentarlo en otro lenguaje, y a falta de poder tirar de los gráficos de tortuga el python por cosas de la vida, la siguiente opción es logo.


lunes, 20 de septiembre de 2010

Sonido fractal (experimento)

Update: corregido un detalle que podría causar un error al dividir por 0

La idea (no me acuerdo de donde salio, la verdad) es diseñar un fractal y "mostrarlo" a través de un archivo de música. El fractal elegido es una conjunto de Cantor por que es simple, y porque se puede presentar en un formato de 1 dimensión, de tiempo en este caso y otra que aquí será la frecuencia. Este script genera un archivo wave (.wav) basandose en esa idea.

jueves, 15 de julio de 2010

Structure Synth y Sunflow, diseño en 3D

Hoy traigo un par de herramientas, de las que supe por un mail, son Structure Synth y Sunflow.

Structure Synth se encarga de la parte del diseño, con una peculiaridad, en vez de hacer las figuras a mano, se las "describe" a través de una gramatica... para entendernos, se programan, pero a diferencia de la mayoria de los lenguajes, no hay variables (hay parámetros, pero solo unos predefinidos) ni condiciones, todo está definido como un conjunto de figuras ("rules", reglas), que son algunas figuras básicas (cubos, esferas, lineas...). El truco suele estar en usar la recursividad de las reglas (que una misma regla se llame a si misma, lo que lo hace ideal para generar fractales) y , aunque menos, las repeticiones, como repetir muchos cubos para hacer una especie de aro.


Solo un comentario, si usas GNU/Linux, probablemente el paquete del repositorio falle, así como la compilación desde el código, a falta de otra solución mejor, se puede usar Wine con el paquete de Windows, que sorprendentemete va muy bien es usable aún emulado, supongo que porque no usa ninguna librería única de Windows (¿?)
Página web: http://structuresynth.sourceforge.net/
Descarga: http://structuresynth.sourceforge.net/download.php

Sunflow se encarga de la parte del renderizado, si exportamos las imágenes de Structure Synth, (F6) y se las pasamos a Sunflow, el resultado será mucho mejor que el propio de Structure Synth.

Este funciona perfectamente con GNU/Linux (está en java).
Página web: http://sunflow.sourceforge.net/
Descarga: http://sunflow.sourceforge.net/index.php?pg=down (o el sistema de paquetes de tu SO)


En los próximos post intentaré hacer un tutorial sobre Structure Synth (el uso básico de Sunflow, a partir de archivos ya generados, es fácil), ya que no hay ninguno por la red.

Sin más dilación algunas muestras de lo que se puede hacer con estos dos programas:

La primera es obra de Vishkey, responsable de que haya encontrado estos programas, es un triángulo fractal:



set maxobjects 1000000

R1

rule r1 maxdepth 5 > c2 { //El 5 hace referencia a la profundidad del fractal
   {s 0.5 hue 5}  R1
   {s 0.5 x 1 hue 5} R1
   {s 0.5 y 0.865  x 0.5 hue 5} R1
}

rule c2 {
  linea
  {rz 60 x 0.25 y 0.433} linea
  {rz -60 x -0.25 y 0.433} linea
}

rule linea {
 {s 1 0.1 0.1} box
}



Otro código del mismo autor (con este me tome la libertad de bajar el maxdepth a 50 porque sino, con Wine, el renderizado no era posible):


r2

rule r2 maxdepth 100 {
  4 * {rz 90 hue 4} r1
  { s 0.75 z 1 rz 30 a 39} r2
}

rule r1 maxdepth 100{
  box
  {s 0.9 y 0.3 rz 5} r1
}


Un ejemplo de la web, que también tiene su interes:


/*
Sample Torus.
*/

set maxdepth 100
r1

36 * { x -2 ry 10   } r1

rule r1 maxdepth 10 {
   2 * { y -1 } 3 * { rz 15 x 1 b 0.9 h -20 } r2
   { y 1 h 12 a 0.9 rx 36 } r1
}

rule r2 {
   { s 0.9 0.1 1.1 hue 10 } box // a comment
}

rule r2 w 2 {
   { hue 113 sat 19 a 23 s 0.1 0.9 1.1 } box
}


Y por último, un aporte propio:


/*

Trisquel Structure Synth figure.
*/

set maxdepth 75

{ color #195EB9 } base

rule spiral_base {
  { x 1 rz 6 ry 6 s 0.975 } spiral_base
  { s 1 } box
}

rule arm1 {
  { rx 140 } spiral_base
}

rule arm2 {
  { rx 60 ry 36 rz 120 } spiral_base
}

rule arm3 {
  { ry -60 rz 180 }  spiral_base
}

rule base {
    arm1
    arm2
    arm3
    { s 2} sphere
}


Hasta la próxima.

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