generador de plantillas

publicado el 2018-09-03

parte del proyecto: tortilla-stories


escribí un pequeño generador de plantillas de estencil para las tortillas. la idea de automatizarlo tiene que ver con la parametrización pero más que nada con el hecho de facilitar la creación de los códigos numericos de acuerdo al protocolo usado por el detector.

utilicé processing y su generador de archivos svg.

imagen de una plantilla de estencil: una circunferencia con otra pequeña en el centro, y en la parte de arriba cinco círculos rellenos con diferentes distancias entre ellos

aquí un ejemplo, la plantilla para la tortilla con código 11 (once)

la ventaja es que ya con la plantilla parametrizada, solo es cuestión de un ciclo para generar todas (en este caso las 32 correspondientes a un tamaño de mensaje de cinco bits)

animación mostrando una secuencia de 32 códigos diferentes

los 32 códigos en secuencia; dato curioso, las secuencias binarias están 'de cabeza'

a continuación el programa que escribí:

// genera_plantillas.pde
import processing.svg.*;

final int N = 32; // num plantillas

final int s = 40; // scale factor
final int d_tortilla = 14*s;
final float d_centro = 0.5*s;

final float d_bit = 0.8*s;
final float d_margen = 0.25*s;

final int N_BITS = 5; // bits mensaje
final int N_BAUD = N_BITS + 3; // + paridad + bordes


final float l_codigo = d_bit*N_BAUD 
                       + d_margen*(N_BAUD-1);
float y_codigo, y_linea;

void setup(){
  size(560,560); // d_tortilla
  
  y_codigo = d_tortilla*0.18;
  y_linea = d_tortilla*0.275;

  for( int num = 0; num < N; num++){
  println("generando plantilla para... "+num);

  
  beginRecord(SVG,
	     String.format("plantilla-%03d.svg",
		            num));
    
    strokeWeight(1);
    stroke(255,0,0);
    noFill();
    
    pushMatrix();
    translate(width/2, height/2);
    ellipse(0,0, d_tortilla,d_tortilla);
    ellipse(0,0, d_centro, d_centro);
    popMatrix();

    pushMatrix();
    translate((width-l_codigo)/2 + d_bit/2,
		    y_codigo);
    dibujaCodigo(num);
    popMatrix();

    stroke(0,0,255);
    line(0, y_linea, width, y_linea);

    
  endRecord();
  println("listo");
  }
  exit();
}

void dibujaCodigo(int num){
  float x = 0;
  boolean [] b = bauds(num);
  fill(0);
  for(int i = 0; i<N_BAUD; i++){
    //dibuja en el orden opuesto
    if(b[N_BAUD-i-1]){
     ellipse(x,0,d_bit,d_bit);
    }
    x += d_margen + d_bit;
  }
}

boolean[] bauds(int num){
	boolean [] b = new boolean[N_BAUD];
	// orillas
	b[0] = true;
	b[N_BAUD-1] = true;

	int cuentaunos = 0;
	for(int i=0; i<N_BITS ; i++){
	  b[i+1] = 
		  ( ( num & 
		        (1<<(N_BITS-i-1)) ) 
		      != 0 );
	  if(b[i+1]){
		cuentaunos++;
	  }
	}

	b[N_BAUD-2] = (cuentaunos%2==0);

	return b;
}

y ya como dato curioso, para generar el gif animado ya con las plantillas generadas, usé imagemagick:

convert -loop 0 -delay 20 \
	-background '#ffccff' \
        *svg \
	-resize 200x200 \
	plantillas.gif

ahora la idea es usar las plantillas para complementarlas con los dibujos que corresponden a cada historia grabada en cada tortilla, y luego usar una máquina cnc para cortar los esténciles.