Eloisa Herrera Imagen de puntitos

De Casiopea

Archivo:Impresionista.pdf


TítuloEloisa Herrera Imagen de puntitos
Tipo de ProyectoProyecto de Curso
Palabras Clavetarea 8
Período2012-2012
Del CursoImagen Escrita 2012,
CarrerasArquitectura
Alumno(s)Eloísa Herrera
ProfesorHerbert Spencer
/*

 Imagen Escrita 2012: Construcción de un trazo (algoritmo pictórico de la luz y el color) 

*/

import processing.pdf.*;

PImage ritoque;  // la foto: el encuadre, la escena, el paisaje
PFont font;      // la fuente tipográfica
String[] code;   // el texto del código

/*
Al exportar un PDF, Processing translada 
 las unidades de pixeles a puntos tipográficos.
 
 1 pt = 0.0352778 cm
 1 cm = 28.346438837 pt
*/
 
float margenIzquierda = 30; 
float margenArriba  = 20;
float margenDerecha = 20;
float margenAbajo   = 20;
float escala;

void setup() {

  ritoque = loadImage("impresionista.jpg");   // se carga la imagen, se "construye" el objeto PImage ritoque
  size(609, 765, PDF, "impresionista.pdf");  // tamaño carta

  // cálculos para escalar desde la imagen hacia el pincel

  float ancho = width - (margenIzquierda + margenDerecha);
  escala = ancho/(float)ritoque.width;

  noStroke();
  noLoop(); 
  background(255);

  font = createFont("Courier", 6); // construyo la tipografía a partir de una fuente de sistema
  textFont(font, 6);

  code = loadStrings("trazo.pde"); // cargo el código "trazo" (el pincel)
}



void draw() {

  float spacer = 5; // Reducción de spacer mejora la resolución de la imagen resultante
  int i = 1;
  boolean cir = true;
  
  // muestreo regular desde la foto, esto se puede modificar....
  for (int y = 0; y < ritoque.height; y += spacer) { 
    if (cir) { i = 0; } 
    for (int x = 0; x < ritoque.width; x += spacer) {

      // obtengo el color
      float plotX = map(x, 0, ritoque.width, margenIzquierda, width-margenDerecha);
      float plotY = map(y, 0, ritoque.height, margenArriba, margenArriba + (ritoque.height * escala));
      color c = ritoque.get(x, y); 

      trazo(plotX, plotY, c, spacer, i);
      
      if(i==1){i=0;}
      else {i=1;}
    }
    cir = cir == true ? false : true;
  }
  printCode();
  println("----->PDF done!");
  exit();
}

void printCode() {
  float interlinea = 0;
  for (int i = 0; i < code.length; i++) {
    // escribo cada línea de código en la pantalla
    text(code[i], width/4, 2 * margenArriba + ritoque.height * escala + interlinea);
    interlinea += 15;
  }
}

/*************************************** trazo ****************************************/
/* Eloísa Herrera*/ 

void trazo(float x, float y, color c, float amp, int i) {
  fill(c);
    if(i == 1){
      // al llamar al rectángulo, recentramos el dibujo (para que se alinee con los círculos); 
      // recalculamos el ancho y alto para que tengan la misma área final que tendría si fuese círculo.
      // llamamos al brillo del color elegido para los cuadrados
      rect(x-map(brightness(c), 0, 255, amp, 0)*sqrt(PI)/2*1/2*1/2, 
        y-map(brightness(c), 0, 255, amp, 0)*sqrt(PI)/2*1/2*1/2, 
        map(brightness(c), 0, 255, amp, 0)*sqrt(PI)/2*1/2, 
        map(brightness(c), 0, 255, amp, 0)*sqrt(PI)/2*1/2);
    } else {
      // las elipses seleccionan el hue del color elegido
      ellipse(x, y, map(hue(c), 0, 255, amp, 0)*1/2, 
        map(hue(c), 0, 255, amp, 0)*1/2);
    }}
// finalmente, los cuadrados realzan los brillos (lo que tiende a seleccionar colores mas oscuros)
// los círculos tienden a rescatar, con mayor probabilidad, colores brillantes