ContextFreeArt: Arte Gráfico Generado por una GLC

  • strict warning: Non-static method view::load() should not be called statically in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/views.module on line 906.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/handlers/views_handler_filter.inc on line 607.
  • strict warning: Declaration of views_handler_filter::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/handlers/views_handler_filter.inc on line 607.
  • strict warning: Declaration of views_handler_filter_boolean_operator::value_validate() should be compatible with views_handler_filter::value_validate($form, &$form_state) in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/handlers/views_handler_filter_boolean_operator.inc on line 159.
  • strict warning: Declaration of views_plugin_style_default::options() should be compatible with views_object::options() in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/plugins/views_plugin_style_default.inc on line 24.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/plugins/views_plugin_row.inc on line 134.
  • strict warning: Declaration of views_plugin_row::options_submit() should be compatible with views_plugin::options_submit(&$form, &$form_state) in /home/codecomp/public_html/codecompiling.net/mai.www/sites/all/modules/views/plugins/views_plugin_row.inc on line 134.

DONE

Encontré un uso "artístico" de las Gramáticas de Libre Contexto. Ya hay algunos antecedentes en computación gráfica sobre aplicaciones orientadas a generar arte (que lamentablemente no tengo a mano), pero este es el primero en el que veo que se utiliza una gramática de libre contexto.

La aplicación se llama Context Free Art, el enlace es:

http://www.contextfreeart.org/

Es interesante mencionar que la búsqueda realizada en Google por medio de la que llegué a Context Free Art fue “context free grammar graphics computing”.

Context Free Art tiene su tiene su origen (o está inspirado) en una aplicación llamada SCIgen (An Automatic CS Paper Generator), que como su título indica, no es más que un "Generador Automático de Artículos (científicos) de Ciencias de la Computación". Se puede encontrar más información sobre SCIgen en:

http://pdos.csail.mit.edu/scigen/

Esta última aplicación fue desarrollada por estudiantes de postgrado del MIT y no tengo claro aún, si lo hicieron sólo por diversión o con un objetivo científico/tecnológico concreto en mente. Aunque definitivamente suena a una buena broma. SCIgen también usa una gramática de libre contexto para generar de forma automática, imagino que dentro de ciertos parámetros y usando cierto lenguaje técnico codificado en la gramática, artículos científicos (con figuras, referencias y todo lo demás). Es evidente que, son artículos científicos totalmente inútiles, que no aportan nada. Sin embargo, es probable que alguien que no sepa mucho de computación (o un lector descuidado) caiga en la trampa y confunda un artículo generado por la aplicación por uno real. Por cierto que, el dolor de cabeza, el gran esfuerzo para tratar de entender un artículo generado por SCIgen y la frustración al no entender nada, probablemente son características que los artículos generados por esta aplicación comparten con muchos artículos científicos reales (¿humor académico?).

Inclusive, el grupo de SCIgen ha logrado que algunos de los artículos generados fuesen aceptados en conferencias (no es broma), y hasta han ido a las conferencias a defenderlos, según ellos, con una charla también completamente generada usando la misma técnica ¿curioso verdad? Los detalles de los artículos, e inclusive los detalles del arbitraje y la aceptación se pueden encontrar en el sitio web de SCIGen.

Volviendo a Context Free Art, la idea detrás de este generador de arte es definir una GLC que se utiliza para generar una figura (que usualmente está compuesta por otras figuras). Para lograr esto, al igual que en toda GLC hay una producción base y un conjunto de producciones alcanzadas desde la producción base, tal y como se muestra en el código del ejemplo 1:

S -> CIRCULO(55,55,5)RECTANGULO(50,50,10,10)ANIDAR(50,50,10/2,10/2)
ANIDAR(X,Y,W,H)     -> CIRCULO(X+W/2,Y+H/2,W/2)RECTANGULO(X,Y,W,H)
CIRCULO(X,Y,R)      -> terminal_circulo(X, Y, R)
RECTANGULO(X,Y,W,H) -> terminal_rectángulo(X,Y,W,H)
ANIDAR(X,Y,W,H)     -> vacío

(Código del Ejemplo 1)

El código anterior es una simplificación para poder explicar la idea, es decir, no está escrito aún usando la sintaxis de Context Free Art.

Excepto por los parámetros de las producciones, el código es muy similar a una GLC. La idea es que la gramática en lugar de generar un lenguaje formado por caracteres o símbolos, pueda generar un lenguaje formado por figuras. De esta forma, la gramática anterior genera el lenguaje de "todos los rectángulos que tienen un círculo inscrito dentro, y que a su vez, tienen recursivamente rectángulos y círculos de la mitad de tamaño del rectángulo padre". Esto suena algo complicado por lo que es mucho más fácil visualizarlo con una imagen, de modo que se puede decir que el resultado del ejemplo 1 muestra dos "palabras" que estarán incluidas en el lenguaje descrito por la gramática anterior.


(Resultado del Ejemplo 1)

El ejemplo 2, fue uno de mis intentos de lograr una imagen atractiva utilizando la sintaxis de Context Free Art. Logré obtener el conjunto de cuadrados que se muestran en el resultado del ejemplo 2. Aún estoy intentando, sin mucho éxito pero acercándome poco a poco, escribir el código para generar el resultado de mi ejemplo inicial. El texto que está precedido por “#” son mis comentarios.

startshape begin_here  # Esta es la forma/producción inicial
 
CF::Background = [hue 120 sat 1 b -0.5]
CF::MinimumSize = 0.1  # Esto establece el máximo de recursión
 
shape begin_here { # La producción inicial
# Invoca a otra producción, equivalente a begin_here -> some_rect
 some_rect [x 100 y 100 size 100]
}
 
# Invocada por la producción anterior y por si misma
shape some_rect{
 SQUARE [x -1 y -1 size 0.5]
# Se invoca a si misma, equivalente a some_rect -> some_rect
 some_rect [x -1 y -1 size 0.5]
}

(Código del Ejemplo 2)


(Resultado del Ejemplo 2)

Un aspecto interesante es que en el código del ejemplo 2 pareciera que hay una producción recursiva que nunca termina, es decir, some_rect -> some_rect. No hay una producción nula, como es el caso de ANIDAR(X,Y,W,H) -> vacío en el ejemplo 1. Para solucionar este problema, Context Free Art expande las reglas recursivamente, hasta que las formas generadas tienen un mínimo de tamaño. Este tamaño, en el ejemplo 2 se define por medio de CF::MinimumSize = 0.1, o al menos es lo que entiendo hasta los momentos.

Mi ejemplo es el de un aprendiz que apenas tiene algunas horas entendiendo la sintaxis de Context Free Art, pero con un poco más de práctica y conocimiento, es posible usar los mismos principios para crear imágenes más complejas, tales como la que se muestra en el ejemplo 3:


(Resultado del Ejemplo 2)

Usando código tan simple como el siguiente:

startshape CIRCLES
CF::Background = [b -1]
 
shape CIRCLES
{
   loop 12 [r 30] CONCENTRIC[x 100]
}
 
shape CONCENTRIC
{
   loop 720 [r 0.5 h 0.5] SQUARE [x 100 b 1 sat 1]
   CONCENTRIC[s 0.9 h 10]
}

(Código del Ejemplo 2)

Citas...

De Guiche, refiriendose al Quijote al atacar molinos de viento, intentando amenazar a Cyrano:

De Guiche: Pues, cuando se arremete contra ellos [los molinos], sucede a menudo...
Cyrano: ¿Ataco, entonces a gentes que giran según sopla el viento?
De Guiche: ...que las aspas del molino os lanzan al lodo.
Cyrano: ¡O bien, a las estrellas!

Edmond Rostand - Cyrano de Bergerac

Cursos