jueves, 5 de marzo de 2015

Las mariposas de El Mozote

(es) Las mariposas de El Mozote

(eo) Papilioj de El Mozote

Las mariposas de El Mozote

http://dx.doi.org/10.13140/RG.2.2.34092.90243

Descripción artística:

Las mariposas del perdón revoloteando en el cielo azul con nubes blancas.

Motivación:

Un capítulo de la amarga historia de nuestro querido El Salvador.

Descripción técnica:

Se han dibujado una serie de mariposas –con la ecuación polar m( θ )= e cos θ -2 cos ( 4 θ )+ ( sin θ 12 ) 5 , con 0 θ 10 π – sobre una nube generada por un algoritmo recursivo probabilístico.

Archivos

Código (CFDG):

#!/usr/bin/cfdg -o salida.png

# Copyright 2015 Eduardo Adam Navas López
# Este archivo es Software Libre liberado bajo la licencia GNU GPLv3 o su versión más reciente:
# http://www.gnu.org/licenses/gpl.html

#Para generar la imagen ejecute la siguiente línea:
#$ cfdg -x 0.5 -b 0 -s 8000 -v YSLAJF mariposas.cfdg mariposas.png

#ADVERTENCIA: Generar una imagen tan grande requiere al menos 4GB de RAM, 2GB de intercambio y mucho tiempo de procesamiento.
#Si no tiene tales recursos se recomienda cambiar el parámetro -s a un valor como 1000.

NUMSEG = 2500 #Número de segmentos para formar la curva
LIMITE = 40 #Intervalo de dibujo de las mariposas: [-lim,lim]
LIMITENUBE = 20
LIM_ANG = 360*5
NUMCURVAS = 75 #Número de mariposas a dibujar
MAX_BRILLO = 0.8 #Para las mariposas
MIN_TAM = 0.1
MAX_TAM = 0.5

CF::Background = [h 215 sat 0.37 b 1]
CF::Size = [s (2*LIMITE) (2*LIMITE)]

startshape principal

shape principal{
 nube[]
 mariposas[z 1]
}

funcion(th) = exp(cos(th))-2*cos(4*th)+sin(th/12)^5

path mariposa {
 theta = 0
 radio = funcion(theta)
 xpunto = radio*cos(theta)
 ypunto = radio*sin(theta)
 MOVETO(xpunto, ypunto)
 loop i = NUMSEG []  {
  theta = i*LIM_ANG/(NUMSEG-1)
  radio = funcion(theta)
  xpunto = radio*cos(theta)
  ypunto = radio*sin(theta)
  LINETO(xpunto, ypunto)
 }
 STROKE(CF::RoundCap)[]
 
}

shape mariposas{
 loop i = NUMCURVAS []{
  mariposa[
   x rand(-LIMITE,LIMITE) 
   y rand(-LIMITE,LIMITE) 
   s (MIN_TAM+i*(MAX_TAM-MIN_TAM)/(NUMCURVAS-1)) 
   r randint(70,110) 
   sat 1 
   b (i*MAX_BRILLO/(NUMCURVAS-1)) 
   h randint(30,380)
  ]
 }
 
}

#La gramática de la nube fue adaptada de:
#http://www.contextfreeart.org/gallery/view.php?id=1400

shape nube{
 nube0[]
 nube0[x (-20) y (-20)]
 nube0[x (20)  y (-20)]
 nube0[x (-20) y (20)]
 nube0[x (20) y (20)]
}

shape nube0{
 loop 4 [x (randint(-LIMITENUBE/2,LIMITENUBE/2))]{
  loop 4 [y (randint(-LIMITENUBE/2,LIMITENUBE/2))]
   nube1[s 0.7 b 3]
 }
}

shape nube1
rule {
 nube2[]
 nube1[x 4] 
 #nube1[x (if(randint(),-LIMITENUBE/5,LIMITENUBE/5))]
}
rule {
 nube2[]
 #nube1[y 4]
 nube1[y (if(randint(),-LIMITENUBE/10,LIMITENUBE/10))]
}
rule 0.3 {
 nube1 [r 80]
 nube1 [r -80]
}
rule {
 nube1[s 0.85]
}

shape nube2 {
 nube3[a -100]
}

shape nube3 {
 #Al cambiar la escala aquí cambia la densidad de la nube:
 #s>15 genera una nube espesa y redondeada en los bordes
 #s<5 genera una nube tipo humo
 CIRCLE[b 1 a 0.03  s 10]
}

No hay comentarios:

Publicar un comentario