domingo, 22 de febrero de 2015

Psicodelia

(es) Psicodelia

(eo) Psikedelo

Psicodelia

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

Descripción artística:

Un horizonte de colores psicodélicos, con colores predominantemente cálidos en el “cielo” y predominantemente fríos en la “tierra”.

Motivación:

La cultura Hippie de los años 60's que influyó enormemente en el desarrollo de la tecnología de finales del siglo 20.

Descripción técnica:

Una vista girada del conjunto de Mándelbrot en el que los puntos que no pertenecen al conjunto se dibujan como capas de colores variables en función del número máximo de iteraciones para determinar la no pertenencia y el valor del complejo final de la sucesión.
Mientras que para los puntos que sí pertenecen se dejaron los puntos negros.
El conjunto de Mándelbrot es el conjunto M de todos los puntos c del plano complejo tal que la sucesión z n+1 = z n 2 +c (con z 0 =0+0i ) no diverge (es decir, tal que es acotada).
El criterio usado para determinar si las sucesiones divergen o no, es si z k , con kN , tiene un módulo mayor que 2, es decir | z k |2 (procedimiento estándar para los conjuntos de Julia y de Mándelbrot). Puesto que no puede evaluarse hasta el infinito, se usa una cota: N . Si la sucesión no “diverge” antes de llegar al N -ésimo término de las sucesiones, se considera que no diverge, es decir que es acotada.

Código (CFDG):

# 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:
#$ cfdg -b 0 -s 1000 psicodelia.cfdg psicodelia.png


startshape mandelbrot_psicodelico_opt_color

LIMITE = 1000 #Resolución de la imagen generada

MAXPASOS = 100

LIMIZQ = -1.8
LIMDER = -1.6
LIMARRIBA = 0.1
LIMABAJO = -0.1

TAMX = (LIMDER-LIMIZQ)/(LIMITE-1)
TAMY = (LIMARRIBA-LIMABAJO)/(LIMITE-1)


pasos(numPasos,z_r,z_i,c_r,c_i) = 
 if((numPasos < MAXPASOS) && (z_r*z_r+z_i*z_i<4),
  pasos(numPasos+1, z_r*z_r - z_i*z_i + c_r, 2*z_r*z_i + c_i, c_r, c_i),
  numPasos)

vector3 pasos2(vector3 pri,number c_r, number c_i) = 
 if((pri[0] < MAXPASOS) && (pri[1]*pri[1]+pri[2]*pri[2]<4),
  pasos2((pri[0]+1, pri[1]*pri[1] - pri[2]*pri[2] + c_r, 2*pri[1]*pri[2] + c_i), c_r, c_i),
  pri)

#Optimización por simetria bilateral y con colores psicodélicos
shape mandelbrot_psicodelico_opt_color {
 loop i = (LIMITE/2) []  {
  c_i = (LIMARRIBA-LIMABAJO)*i/(LIMITE-1) + LIMABAJO #y
  loop j = LIMITE [] {
   c_r = (LIMDER-LIMIZQ)*j/(LIMITE-1) + LIMIZQ #x
   
   informacion = pasos2((0, 0.0, 0.0), c_r, c_i)
   numPasos = informacion[0]
   z_r = informacion[1]
   z_i = informacion[2]
   if (numPasos==MAXPASOS){
    SQUARE[ x c_r y c_i    size TAMX TAMY]
    SQUARE[ x c_r y (-c_i) size TAMX TAMY]
   }else {
    if (z_i<0){
     SQUARE[ x c_r y c_i    size TAMX TAMY sat 1 b 0.9 h tinte0(numPasos*z_r)]
     SQUARE[ x c_r y (-c_i) size TAMX TAMY sat 1 b 0.9 h tinte0(numPasos*z_i)]
    }else{
     SQUARE[ x c_r y c_i    size TAMX TAMY sat 1 b 0.9 h tinte0(numPasos*z_r)]
     SQUARE[ x c_r y (-c_i) size TAMX TAMY sat 1 b 0.9 h tinte0(numPasos*z_i)]
    }
   }
  }
 }
}

tinte0(n) = (360*n/MAXPASOS)
#tinte1(n) = (300*n/MAXPASOS)
#tinte2(n) = 240+n*(360-240)/MAXPASOS



#Optimización por simetria bilateral
shape mandelbrot_psicodelico_opt {
 loop i = (LIMITE/2) []  {
  c_i = (LIMARRIBA-LIMABAJO)*i/(LIMITE-1) + LIMABAJO #y
  loop j = LIMITE [] {
   c_r = (LIMDER-LIMIZQ)*j/(LIMITE-1) + LIMIZQ #x
   
   informacion = pasos2((0, 0.0, 0.0), c_r, c_i)
   numPasos = informacion[0]
   z_i = informacion[2]
   if (numPasos==MAXPASOS){
    SQUARE[ x c_r y c_i    size TAMX TAMY b 0]
    SQUARE[ x c_r y (-c_i) size TAMX TAMY b 0]
   }else {
    if (z_i<0){
     SQUARE[ x c_r y c_i    size TAMX TAMY b 0.9]
     SQUARE[ x c_r y (-c_i) size TAMX TAMY b 0.4]
    }else{
     SQUARE[ x c_r y c_i    size TAMX TAMY b 0.4]
     SQUARE[ x c_r y (-c_i) size TAMX TAMY b 0.9]
    }
   }
  }
 }
}

shape mandelbrot_psicodelico {
 loop i = LIMITE []  {
  c_i = (LIMARRIBA-LIMABAJO)*i/(LIMITE-1) + LIMABAJO #y
  loop j = LIMITE [] {
   c_r = (LIMDER-LIMIZQ)*j/(LIMITE-1) + LIMIZQ #x
   
   informacion = pasos2((0, 0.0, 0.0), c_r, c_i)
   numPasos = informacion[0]
   z_i = informacion[2]
   if (numPasos==MAXPASOS)
    CIRCLE[ x c_r y c_i size TAMX TAMY b 0]
   else {
    if (z_i<0)
     CIRCLE[ x c_r y c_i size TAMX TAMY b 0.9]
    else
     CIRCLE[ x c_r y c_i size TAMX TAMY b 0.4]
   }
  }
 }
}

No hay comentarios:

Publicar un comentario