Inicio > Artículos, Programación > Ramas aleatorias en Context free

Ramas aleatorias en Context free

Viernes, 10 de diciembre de 2010
Citar este artículo 697 visitas
Ramas aleatorias en Context free

En el post anterior mostré algunos ejemplos de diseños creados con Context free, un programa que hace uso de gramáticas libre de contexto para generar imágenes a veces muy complejas.

Los elementos que entran en juego aquí, son transformaciones geométricas que se aplican recursivamente hasta cierto límite, y así se pueden obtener imágenes compuestas por miles o incluso millones de figuras.

Lo que voy a mostrar ahora, es una descripción paso a paso de la construcción de una “planta”, para ilustrar las procesos que combinan elementos determinísticos y aleatorios.

Context Free
http://www.contextfreeart.org

Visita la web de Context Free Art, para descargarlo (Windows, Linux o Mac).

Espiral de círculos

Código de la espiral

startshape espiral
rule espiral
{
CIRCLE{}
espiral{r 6 s .97 x .5}
}


Los ejemplos más ilustrativos para partir con Context Free, son las espirales. Una espiral es una trayectoria que combina giros y traslaciones, lo que en este ejemplo se aplica a un círculo hasta que es más pequeño que un pixel.

En este caso tenemos definida una regla, espiral, que consiste en un círculo CIRCLE{}, y luego se le aplican las siguientes transformaciones:

  • r 6: se gira en 6º
  • s .97: se reduce su tamaño a un 97%
  • x .5: Se traslada horizontalmente un 50% (de su diámetro)

Esta es una definición recursiva de la regla espiral, de manera que la “figura” llamada inicial es un círculo, luego 2, luego 4 y así sucesivamente.

Luego, a la forma “espiral”, se le pueden aplicar transformaciones, como si fuera una figura individual (de, hecho, ya lo es), que es el principio sobre el que se basan los siguientes ejemplos.

Construcciones: 1 | 2 | 3.1 | 3.2 | 4.1 | 4.2

Este navegador no es compatible con la etiqueta canvas. Para usar esta aplicación (Algorithm Ink), recomendamosFirefox.
Ejecutar código

1. Rama

En este espacio es posible modificar los códigos y observar los cambios, por ejemplo, cambiar los valores de la regla rama.

Las primeras dos líneas de código no son relevantes, es simplemente un ajuste para escalar la rama al tamaño del recuadro. En Context Free esto no sería necesario.

Luego tenemos la regla rama, toma la figura llamada base, definida más abajo, y le aplica recursivamente rotaciones de 2º, escalamientos al 97% y traslaciones verticales de un 25%.

Ahora bien, esto se aplicaría a lo que fuere la figura base, en este caso son dos círculos; uno de tamaño “1″ y el siguiente de tamaño .98 y blanco (b controla el brillo, entre 0 y 1). Lo que se logra es aparentemente una circunferencia, cuando en realidad son dos círculos, uno blanco y otro negro.

Ejecutar código

2. Rama aleatoria

Uno de los recursos más potentes de este tipo de lenguajes, es la aleatoriedad. Esto se puede organizar definiendo de varias formas una misma regla.

En este caso la regla rama está definida de tres formas diferentes. La primera definición considera giros en 7º, la segunda; giros en -7º; y la tercera introduce una reflexión respecto al eje Y (o mejor dicho, una reflexión respecto a una recta que forma 90º con la horizontal.)

Luego, en cada iteración, se elige una de estas definiciones al azar. Nótese que la tercera definición de rama, incluye un número, algo así como el peso de la regla. Las primeras dos tienen peso 1, la tercera regla tiene peso 0,1; de manera que la probabilidad de que se seleccionen es su peso dividido el total (1 + 1 + 0,1).

Luego se obtiene esta generación estocástica de la rama, que en cada ejecución es distinta y no pareciera seguir ningún patrón en particular.

Ejecutar código

3.1 Planta: Rotaciones y homotecias

Aprovechando la idea anterior, tratamos la rama aleatoria como si fuera una sola figura. Así, se introduce una nueva regla planta, que reduce a un 99% de su tamaño cada rama, y la gira en 30º.

Esta nueva regla se repetirá hasta que los últimos elementos tengan un tamaño menor a 1 pixel; y como depende de la rama aleatoria, en cada ejecución se obtiene una planta distinta.

Es interesante modificar los elementos numéricos para obtener distintas variedades, por ejemplo:

  • Modificar el peso de las reglas rama, escribiendo: rule rama 2, por ejemplo, para peso 2.
  • Modificar la escala de la regla planta, especialmente entre 0.9 y 1 con varios decimales
  • Modificar los ángulos de giro en las reglas rama
  • Modificar el ángulo del eje de simetría, en la última regla rama, a valores menores que 90
Ejecutar código

3.2 Planta: Rotaciones y homotecias (color)

Para controlar los colores se recurre a tres características: tinte, saturación y brillo.En este típico gráfico circular de colores, el tinte (“hue” o “h”, entre 0 y 360), corresponde al ángulo de giro para elegir un color; mientras que la saturación (“sat” entre 0 y 1) corresponde a qué tan cerca del centro se está. Además se debe seleccionar un brillo (“b”), entre 0 y 1.

En este ejemplo, la figura inicial tiene un color verde, mientras que la única transformación de color que se sigue, es en la regla planta, que incrementa el tinte en 1 (h 1).

El manejo de colores en Context Free guarda un cierto paralelismo con las transformaciones geométricas que se utilizan. Así, pequeñas modificaciones de color (tinte, en este caso), permiten darle incluso una sensación de la intensidad de las iteraciones, lo que es muy propio de los colores con los que se utilizan para los fractales.

Pero esta es una de tantas formas de aplicar colores.

Ejecutar código

4.1 Planta: Traslaciones y homotecias

La “planta” anterior correspondía a la aplicación de rotaciones y homotecias a la rama aleatoria. Esta es otra opción.

La regla planta, en este caso, consiste en la reducción a un 99% de su tamaño (de la rama aleatoria), y una pequeña traslación vertical (10% hacia arriba). Además, hay un giro de 1º, lo que determina una forma un tanto espiral.

Lo interesante en este punto, es que la regla planta es muy similar a las reglas rama, que toman esta forma de espiral. Ambas aplican esencialmente las mismas transformaciones, rotaciones y homotecias; sólo que la planta se aplica a una rama aleatoria; y la rama se aplica a un círculo (o dos).

Ejecutar código

4.2 Planta aleatoria

Finalmente en una lógica equivalente a la que se ocupa para crear la rama aleatoria, es posible definir la regla planta varias veces, con giros en distintas direcciones y reflexiones.

Así la primera regla planta gira en 1 grado, mientras que la segunda gira en -1º; y la tercera voltea verticalmente. Luego la selección de la regla es aleatoria, en cada caso con una probabilidad de 1/3 de aplicarse.

En consecuencia, tenemos aleatoriedad aplicada en dos niveles,:

  • primero para generar la rama, que se “curva” al azar incluso volteándose verticalmente.
  • segundo, para trasladar y reducir ramas, con pequeños giros y volteos en cada caso.

Context free nos entrega un conteo de figuras generadas, y este algoritmo generaría cerca de 64.000 círculos.

Es interesante ver de manera práctica cómo lo determinístico y aleatorio se combinan para generar una apariencia “natural”. Si se prueba generando varias veces estas “plantas”, sin modificar el código, se observa cómo en cada caso se logra un diseño distinto, pero que en esencia es el mismo; o si se quiere, de la misma familia.

Mandelbrot en muchas ocasiones describía lo fractal de la naturaleza como algo generado por una gran repetición de reglas esencialmente simples; este es también el caso, pero el aspecto natural también se obtiene por el control de la aleatoriedad. Este último es un elemento distintivo del arte generativo.

Recursos adicionales

Artículos, Programación , , ,

  1. Sin comentarios aún.
  1. Sábado, 24 de septiembre de 2011 a las 23:03 | #1

Artículo publicado en http://www.geometriadinamica.cl/2010/12/ramas-aleatorias-en-context-free/.