Volver al inicio

Lenguaje CFDG para generar imágenes Context Free

CFDG — un lenguaje para Context Free que permite generar imágenes a través de gramáticas libres de contexto. Describe construcciones básicas, transformaciones y ejemplos: fractales, arcoíris, texto, escenas animadas, árboles. Adecuado para generación procedural en IT.

Generación de imágenes en CFDG: fractales y árboles en Context Free
Advertisement 728x90

CFDG: Gramática Libre de Contexto para Generación Procedural de Imágenes

Context Free utiliza el lenguaje CFDG (Context Free Design Grammar) para describir la generación procedural de imágenes. Este lenguaje específico de dominio cuenta con una gramática libre de contexto, donde los primitivos básicos son CIRCLE (círculo) y SQUARE (cuadrado). El renderizado está impulsado por la biblioteca Anti-Grain Geometry. Las reglas definen transformaciones recursivas de formas con parámetros como rotación (r), escalado (s), traslación (x, y), color (hue, sat, b), transparencia (a) y más.

El lenguaje permite generar estructuras fractales intrincadas a partir de descripciones simples. Cada ejemplo a continuación muestra scripts reales de CFDG que producen composiciones visuales impresionantes.

Ejemplo Básico: Patrón Fractal

Este primer script crea un patrón simétrico sobre un fondo negro con círculos repetidos y degradados.

Google AdInline article slot
startshape T
background{b -1}
tile {s 2.5}
rule T {3*{r 120 hue 30}S{x .3}}
rule S 3{CIRCLE{hue 30}4*{r 20 b.007 sat .1}S[s.3.7y.9]}
rule S {CIRCLE{hue 15}9*{r 20 b.05 hue -3}S[s.3.7y.9]}
rule S {S{flip 90}}

Aquí, la regla T inicia tres ramas rotadas 120°, cada una transformando S. Las reglas S agregan círculos con degradados de brillo (b) y saturación (sat), luego escalan recursivamente hacia abajo (s 0.37) y desplazan hacia arriba (y 0.9).

Efecto Arcoíris con Sombras

Este script genera una esfera brillante con sombras y reflejos usando reglas anidadas.

startshape START
rule START {
CIRCLE{}
RAINBOW_SPLIT{hue 0 sat 0 b 0}
RAINBOW_SPLIT{r 180 hue 120 sat 0}
}
rule RAINBOW_SPLIT{
RAINBOW{}
}
rule RAINBOW_SPLIT{
RAINBOW_MINI{alpha -.9 y -.4 s .2 flip 1 b -1}
RAINBOW{}
}
rule RAINBOW{
SHADOW{}
CIRCLE{}
HIGHLIGHT{
RAINBOW_SPLIT{hue 1.5 sat .1 s .99 b .001 x .09 r 2.8}
}
}
rule RAINBOW_MINI{
SHADOW{}
CIRCLE{}
HIGHLIGHT{}
RAINBOW_MINI{alpha .1 hue 2 s .98 x .3 r 2.8}
}
rule RAINBOW_MINI .04{
SHADOW{}
CIRCLE{}
HIGHLIGHT{}
RAINBOW_MINI{flip 1 alpha .1 hue 5 s .99 x .3 r 2.8}
}
rule SHADOW {
CIRCLE{hue 3 b -1 sat -.6 s 1.1 y .04 alpha -.7}
}
rule HIGHLIGHT {
CIRCLE{ hue 3 b .7 sat -.3 s .98 y .05}
CIRCLE{ hue 3 b 2 sat -.7 s .9 y .01}
}

Transformaciones clave: RAINBOW_SPLIT crea un degradado arcoíris, mientras que SHADOW y HIGHLIGHT simulan iluminación. La recursión en RAINBOW_MINI con probabilidad 0.04 detiene la ramificación.

Google AdInline article slot

Simulación de Textos Antiguos

Este script imita texto escrito a mano usando trazos y símbolos.

background { hue 40 sat 0.2 b -0.2}
startshape LINES
rule LINES {
20 * {y -90} NEWLINE {hue 90 sat 0.7 b 0.2 a -0.5}
}
rule NEWLINE {
LINE {y 0}
}
rule NEWLINE {
LINE {y 20}
}
rule NEWLINE {
LINE {y 30}
}
rule LINE {
50 * {x 36} CHAR {}
}
rule CHAR 0.3 { }
rule CHAR {
2 * {x 20 flip 180} STROKE {r 90}
2 * {y 20 flip 180} STROKE {}
}
rule CHAR {
4 * {r 60} STROKE {}
}
rule CHAR {
STROKE {r 90}
3 * {y 10 flip 180} STROKE {}
}
rule STROKE {
B {}
}
rule STROKE {
B {flip 90}
}
rule B 30 {
MARK {}
B {x .6 r 10}
}
rule B 30 {
MARK {}
B {x .6 r 3}
}
rule B 250 {
MARK {}
B {x .9}
}
rule B 10 {
MARK {}
B {flip 90}
}
rule B 10 { }
rule MARK 3 {
CIRCLE {}
}
rule MARK {
CIRCLE {s 2}
}
rule MARK {
SQUARE {s 3}
}
rule MARK {
CIRCLE {s 4}
}
rule MARK 0.01 {
CIRCLE {s 7}
}

Estructura: LINES genera filas de NEWLINE, cada una con 50 CHAR. CHAR combina STROKE con rotaciones y volcadizos. B dibuja trazos recursivamente usando MARK (CIRCLE/SQUARE).

Escena Animada con Árboles

Este script modela una escena dinámica con animación basada en tiempo.

Google AdInline article slot
background{b -1} startshape init
rule init{time{z 0 r -90 sat .5 |h 220}}
rule time 40 {draw{} time{r 1 s .9991 b .1| a .1|}}
rule time    {slow{|b -1 |a 1 |sat 1}}
rule time    {slow{|b 1 |a -1 |sat 1}}
rule slow 20 {draw{} slow{ r 1 s .9991 b .03| a .03| h -1}}
rule slow    {time{|sat -1}}
rule draw{
SQUARE[z 0 x 1 s .27 .018 x -.5 a 1 h 1|]
stars{z 1 x .91}
cloud[z 2 x .83 s .17 x .5 h .7| a 1 sat .3|]
ground[z 3 x .73 s .1 x .5]
}
// ... (reglas restantes para ground, stuff, block, bush, tree, stars, cloud abreviadas para el ejemplo)

Las reglas time y slow controlan la animación: rotación, desvanecimiento (a), brillo (b). draw compone capas por orden Z.

Ejemplo Avanzado: Árbol Procedural

El script más complejo genera un árbol realista con ramas y hojas, usando funciones y bucles.

startshape MAIN
CF::Background = [hue 0 sat 0.84 b -0.9]
CF::MinimumSize = 1
// Constantes y funciones globales: GTreePartMove, MaxTrunkDepth() = randint(10,40), RandRange, etc.
shape MAIN {
rule 1 {
SKY [ z -2 s 100 ]
SUN [ z -1 s 400 ]
TREE [ x -0.1 y -0.75 ]
GRASS [ x -1 y -1 ]
}
}
// ... (código completo con TRUNK, LEAFBUNCH, LEAFSTEM etc. define ramificación recursiva con randint y rand)

Funciones como MaxTrunkDepth() y NewBranchRotation() agregan aleatoriedad. TRUNK crece recursivamente hasta EndDepth, luego ramifica. LEAFBUNCH simula follaje con giros.

Construcciones Básicas de CFDG

  • Reglas (rule): rule Shape { ... } con probabilidades (p. ej., rule S 3 {..}).
  • Transformaciones: s (escala), r (rotación), x/y (traslación), flip, z (capas).
  • Color y Efectos: hue, sat, b (brillo), a (alfa).
  • Funciones: randint(min,max), rand(min,max), loop N.
  • Condicionales: if/else para recursión.
  • Inicio: startshape NAME, background{}.

Ideas Clave

  • CFDG es una gramática libre de contexto, ideal para fractales y sistemas L sin dependencias contextuales.
  • La recursión con probabilidades y aleatoriedad asegura variedad.
  • Soporta Z-buffering para escenas 2.5D.
  • Licencia GPL, multiplataforma (Windows/Mac/Linux).
  • Alternativas: Structure Synth para 3D.

— Editorial Team

Advertisement 728x90

Leer después