jueves, 17 de diciembre de 2015

Seguimos experimentando...

Quitando la función Non-stroke podemos conseguir este efecto tan bonito.


int verde = 656;
int tiempo = 0;
int diametro = 50;
 
void setup() {
  size(400, 400);
}

void draw() {
  tiempo = tiempo + 1;    
  verde = int(128 * (1 + sin(tiempo * 2 * PI / frameRate / 20)));
  diametro = int(50 * (1 + sin( tiempo * 2 * PI / frameRate / 5))); // Modifica el diametro del circulo con el paso del tiempo
            
  fill(verde, 567, 76, 765);  // Añade un 50% de transparencia al color
  ellipse(mouseX, mouseY, diametro, diametro);
}

Seguimos experimentando

 En el fondo de pantalla aparecerá un balón. A base de lineas repetidas de color azul claro sobre el fondo oscuro no toca el balon. Puede pintar en todos lados menos donde este el balón.



PImage im;

void setup() {
  size(400, 400);   // Hacemos el programa del tamaño de la imagen
  im = loadImage("balon.png");  // Nombre de la imagen
  background(8678);
line(0, 0, 10000, 10000);
stroke(0, 0, 785);
line(0, 100, 100, 0);
background(400);                                                                                  
line(0,0,100,100);
stroke(0,0,890);
line(0,100,100,0);
}

void draw() {
  image(im, 0, 0);  // Para mostrar la imagen en la pantalla, coordenadas 0, 0
   line(0,0,mouseX,mouseY);
}


EL LABERINTO

Este juego consiste en llevar la línea hasta el final del laberinto.

PImage im;
int colorr = 450;

void setup() {
  size(468, 412);   // Hacemos el programa del tamaño de la imagen
  im = loadImage("labe.png");  // Nombre de la imagen
  image(im, 0, 0);  // Para mostrar la imagen en la pantalla, coordenadas 0, 0
}

void draw() {
  colorr = colorr - 1;            // Hace el color rosa un poco mas obscuro
  if (colorr < 0){
    colorr = 450;              // Cuando llegue al maximo de obscuridad, pasa a otro color mas oscuro
  }
 
  noStroke();           
  fill(colorr, 45, 78);        
  ellipse(mouseX, mouseY, 30, 30);
}


 

miércoles, 16 de diciembre de 2015

Bloque 2 - RELOJ DE POST-IT



PROYECTO 2 - Reloj de Post-it

En este miniproyecto vamos a crear un reloj donde los números estarán hechos a partir de fotografías de notas adhesivas o Post-it.

1.- Inserta una imagen en tu programa.

En primer lugar vamos a aprender a insertar una imagen en tu programa. Este sketch abre una foto desde la ubicación donde este la foto. En este caso debemos poner la foto en la carpeta del sketch.

PImage im;



void setup() {

  size(400, 400);   // Hacemos el programa del tamaño de la imagen

  im = loadImage("foto.jpg");  // Nombre de la imagen

}



void draw() {

  image(im, 0, 0);  // Para mostrar la imagen en la pantalla, coordenadas 0, 0

}








Nuevos comandos:

  • PImage: Un tipo de datos que puede contener una imagen.
  • loadImage(image file): Carga la imagen image file localizada dentro del directorio actual del sketch. image file debe escribirse exactamente igual que con el nombre del fichero. Mira más abajo cómo colocar la imagen en la carpeta correcta.
  • image(imageName, x, y): Muestra la PImage imageName en las coordenadas xy. La esquina superior izquierda es el eje de coordenadas.

2.- Añadir imágenes

Para que el programa tenga acceso a la imagen, debes arrastrar el fichero de la imagen en el IDE de Processing, como muestra la siguiente captura:

Cuando ejecutes el programa, la imagen de abajo es lo que deberias ver, un collage con cuatro Post-its como imagen de fondo para tu ventana de programa:


3.- Mostrando dos imágenes

Para poner dos imágenes una al lado de la otra, debes declarar una variable con distinto nombre pero del mismo tipo PImage y cargar la segunda imagen en el programa. Deberás ajustar las coordenadas de esta segunda imagen.

PImage im;
PImage im2;
void setup() {
  size(800, 400);   // Hacemos el programa dos veces el tamaño de la imagen en ancho
  im = loadImage("foto.jpg"); 
  im2 = loadImage("foto2.jpg");  // Nombre de la segunda imagen
}
void draw() {
  image(im, 0, 0);
  image(im2, 400, 0);  // Para mostrar la segunda imagen en la pantalla, coordenadas 400, 0
}



 Vamos a experimentar añadiendo otras imágenes:

PImage im;
PImage im2;
void setup() {
  size(800, 400);   // Hacemos el programa dos veces el tamaño de la imagen en ancho
  im = loadImage("balon.jpg"); 
  im2 = loadImage("tenis.jpg");  // Nombre de la segunda imagen
}
void draw() {
  image(im, 0, 0);
  image(im2, 400, 0);  // Para mostrar la segunda imagen en la pantalla, coordenadas 400, 0
}


4.- Arrays

Cuando trabajamos con muchas imágenes podemos utilizar algo llamado arrays que permiten un acceso más fácil a ellas
Los arrays pueden ser de un cierto tipo como entero o int o una cadena como String. El máximo número de variables que pueden almacenar debe ser declarado con el array – 3 en el ejemplo de arriba. El siguiente programa, que es una modificación del anterior, muestra como usar un array del tipo PImage para almacenar dos imágenes.

PImage im[] = new PImage[2];

void setup() {

  size(800, 400);  

  // La primera imagen va a la primera posicion del array img[]

  im[0] = loadImage("foto.jpg");  

  // La segunda imagen va a la segunda posicion del array

  im[1] = loadImage("foto2.jpg"); 

}



void draw() {

  image(im[0], 0, 0);

  image(im[1], 400, 0); 

}

 

Nuevos comandos:

  • La declaración de las imágenes es un poco diferente: PImage im[] = new PImage[2], esto significa que declaramos un array del tipo PImage con dos bloques (o compartimentos) de datos.
  • Cuando mostramos y cargamos las imágenes, usamos img[0], para la primera posición del array, y img[1], para la segunda.

 

 

5.- Usando dos Arrays

Para en adelante simplificar la asignación de las variables imagen, el truco es almacenar los nombres de todas las imágenes en un array de strings (cadenas de texto). Aquí un ejemplo:
PImage im[] = new PImage[2];
String imFile[] = {"foto.jpg", "foto2.jpg"};  // Array de nombres de fichero

void setup() {
  size(800, 400);  
  im[0] = loadImage(imFile[0]);  // Primer fichero a la funcion 'loadImage()'
  im[1] = loadImage(imFile[1]);  // Segundo fichero
}

void draw() {
  image(im[0], 0, 0);
  image(im[1], 400, 0); 
}
Almacenamos los nombres de todas las imágenes en una array de strings( cadenas de texto). Aunque no parezca muy útil esto será de gran ayuda para futuros proyectos.



6.- El bucle for()

En este paso aumentaremos el número de imágenes que se muestran de 2 a 4. Todavía utilizaremos los 2 arrays de los pasos anteriores, pero para hacer el código más eficiente incluso, introduciremos una cosa nueva: el bucle for(). Esta es una de las funciones más prácticas y usadas en programación. Hace exactamente lo que parece, iterar, al igual que draw(). Veamos un ejemplo para seguir explicando como funciona.
PImage im[] = new PImage[4];   // Haz tu array mas grande para que le quepan 4 imagenes
String imFile[] = {"postit.jpg", "peninsula.jpg", "tortilla.jpg", "banana.jpg"};

void setup() {
  size(800, 800);  // Haz tu programa mas grande para acomodar todas las imagenes  
  for (int i = 0; i < 4; i = i + 1) {
    im[i] = loadImage(imFile[i]);  // Carga la imagen segun el contador 'i'
  }
}

void draw() {
  image(im[0], 0, 0);   // Muestra las imagenes
  image(im[1], 400, 0); 
  image(im[2], 0, 400); 
  image(im[3], 400, 400); 


Con estos comandos podemos abrir más imágenes, en este caso podemos abrir hasta 4 imágenes.

Nuevos comandos:

  • for(initiator; test; update){ statements }: Esta función permite repetir una pieza de código tantas veces como necesites. La primera cosa que sucede dentro del for() es la inicialización, initiator. En este ejemplo esta declaración es un entero, i. Luego comprueba si test es verdadero o falso, tal y como hicimos con el if en el proyecto anterior, ¿recuerdas?. En este ejemplo test comprueba si i es menor que 4. Si así es, el código entre llaves se ejecutará. A continuación, lo que ocurre es el update, en este caso se trata de incrementar una unidad. Después, test se comprueba de nuevo y si nuevamente es cierto, se repite lo anterior. Puesto que siempre actualizamos añadiendo 1 a i, en algún momento i será igual que 4, lo que significa que test será falsa (4 no es menor que 4). En ese momento, se abandonará el bucle.

7.- Múltiples imágenes

Puesto que el objetivo de este programa es crear un reloj, el siguiente paso es utilizar diferentes imágenes que representen los números y usarlas en nuestro programa. Para tu conveniencia, te damos una serie de imágenes hechas con notas de Post-It.
PImage im[] = new PImage[10];   // Array para 10 imagenes
String imFile[] = {"0.jpg", "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg"};

void setup() {
  size(700, 95);  // 10 imagenes de 70 pixels de ancho y 95 de alto  
  for (int i = 0; i < 10; i = i + 1) {
    im[i] = loadImage(imFile[i]); 
  }
}

void draw() {
  for (int i = 0; i < 10; i = i + 1) {
    image(im[i], 70 * i, 0);  // Muestra las imagenes en secuencia
  }
}



En este programa podemos abrir las 10 imágenes a la vez y horizontalmente.


8.- El Tiempo

En este paso te enseñaremos como mostrar el tiempo. Ya has aprendido como acceder a diferentes variables del sistema con Processing. Por ejemplo, ya hemos usado mouseX, mouseY y frameRate. Hay variables que podemos utilizar para obtener el tiempo actual; hour ()minute () y second (). Empecemos con cómo mostrar el tiempo por sólo las horas:
PImage im[] = new PImage[10];   // Array para 10 imagenes
String imFile[] = {"0.jpg", "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg"};

void setup() {
  size(140, 95);  // 2 digitos de 70 pixels de ancho y 95 de alto  
  for (int i = 0; i < 10; i = i + 1) {
    im[i] = loadImage(imFile[i]); 
  }
}

void draw() {
  int h = hour();             // Toma la hora del reloj del ordenador y almacenalo en una variable
  int h_dec = int(h / 10);    // Extrae el digito de mayor peso de la hora (decenas)
  int h_uni = h - h_dec * 10; // Extrae el digito de menor peso de la hora (unidades)
   
  image(im[h_dec], 0, 0);     // Muestra el digito de las decenas
  image(im[h_uni], 70, 0);    // Muestra el digito de las unidades
}

Nuevos comandos:

  • hour(): Devuelve la hora actual como un número de 0 a 23.
  • int(data): Convierte data a un entero. P.ej. int(2.545) devuelve 2,int(233.9999) devuelve 233 etc.


Como vemos, este programa es capaz de saber qué hora es gracias a nuestro ordenador, como son las 10, el programa coge los numeros 1 y 0 para formar el numero 10. Es un programa muy interesante pues podemos tener un reloj a base de imágenes.


9.- El reloj final

Este es el último paso del proyecto. En este paso vamos a añadir los minutos y los segundos a nuestro reloj utilizando el mismo método que en el paso anterior con las horas.
PImage im[] = new PImage[10];   // Array para 10 imagenes
String imFile[] = {"0.jpg", "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg"};

void setup() {
  size(140, 285);  // 6 digitos en tres filas y dos columnas  
  for (int i = 0; i < 10; i = i + 1) {
    im[i] = loadImage(imFile[i]); 
  }
}

void draw() {
  int h = hour();            
  int h_dec = int(h / 10);   
  int h_uni = h - h_dec * 10;
  
  image(im[h_dec], 0, 0);    
  image(im[h_uni], 70, 0);   
  
  int m = minute();           // Toma los minutos del reloj del ordenador y almacenalos en una variable
  int m_dec = int(m / 10);    // Extrae el digito de mayor peso de los minutos (decenas)
  int m_uni = m - m_dec * 10; // Extrae el digito de menor peso de los minutos (unidades)
  
  image(im[m_dec], 0, 95);    // Muestra el digito de las decenas
  image(im[m_uni], 70, 95);   // Muestra el digito de las unidades
  
  int s = second();           // Toma los segundos del reloj del ordenador y almacenalos en una variable
  int s_dec = int(s / 10);    // Extrae el digito de mayor peso de los segundos (decenas)
  int s_uni = s - s_dec * 10; // Extrae el digito de menor peso de los segundos (unidades)
  
  image(im[s_dec], 0, 190);   // Muestra el digito de las decenas
 

Esto es un reloj a base de imágenes de números, es el proyecto final de nuestro reloj programado para ver la hora con unas simples imágenes. En nuestras funciones, los segundos van cambiando y los minitos y las hora, pues le hemos puesto su retardo correspondiente.


Juntamos el bloque 1 con un poco del dos:
int tiempo = 0;

void setup() {
  size(400, 400);   // Hacemos el programa del tamaño de la imagen
  im = loadImage("tenis.jpg");  // Nombre de la imagen
  image(im, 0, 0);  // Para mostrar la imagen en la pantalla, coordenadas 0, 0
}

void draw() {
  tiempo = tiempo + 1;  // Incrementa el tiempo en una unidad
  rojo = int(55 * (1 + sin(tiempo * 2 * PI / frameRate / 20)));  // Cambia el rojo, repite el color cada 20s
  
  noStroke();            
  fill(rojo, 0, 0);         
  ellipse(mouseX, mouseY, 30, 30);
 
}
 

martes, 15 de diciembre de 2015

Bloque 1 - Serpiente

1.- En primer lugar, vamos a hacer una línea. Para ello escribimos el siguiente código:

line(0, 0, 100, 100);

Y aparecerá un línea en una pequeña ventanita.
 









Posteriormente, vamos a recortar la línea, mostrando solo la mitad. Para ello escribimos el siguiente código:

line(50, 50, 100,100);
 









2.- Vamos a escribir un programa que dibuje dos líneas de diferentes colores sobre un fondo blanco. Para ello escribimos el siguiente código:
background(255);                  
line(0,0,100,100);
stroke(0,0,255);
line(0,100,100,0);










  • background(gray): Establece el color de fondo desde 0 – negro, hasta 255 – blanco. También puedes utilizar background(red, green, blue)para establecer el color que tú quieras.
  • stroke(red, green, blue): Establece el color de la línea. Cada valor de color puede ser desde 0 hasta 255. En este caso, la línea es de color azul puesto que red=0, green=0 y blue=255.

Vamos a experimentar cambiando el color de las líneas:
background(400);                                                                                   
line(0,0,100,100);
stroke(0,0,350);
line(0,100,100,0);

 










3.- vamos a escribir un programa utilizando variables. Escribiremos un programa que dibuje, de nuevo, dos líneas, pero esta vez utilizaremos estas variables:
int value1 = 0;
int value2 = 100;
line(value1, value1, value2, value2);
line(value1, value2, value2, value1);












int variableName = value: Crea una variable del tipo integer, un número entero. Puedes llamarla con cualquier nombre de tu elección, pero para hacerlo más sencillo para tu futuro yo (quien probablemente leerá el código en el futuro y querrá entender lo que hizo en el pasado) asegúrate que el nombre va acorde con el contexto en el que se usa la variable. value es el valor que decides darle al contenido de tu variable.


4.- Tipos de datos

Los tipos de datos más comunes que utilizarás son los siguientes:
  • int: Número entero, p.ej., 2, 99 o 532.
  • float: Número decimal, p.ej., 2.76, 8.211 o 900.3.
  • boolean: Puede ser verdadero o falso.
  • char: Un caracter, p.ej. ‘r’, ‘2’ o ‘%’.
  • String: Una secuencia de carateres, p.ej. “hola”, “¡Me encanta programar!” o “&%!@¤”.

Processing incluye algunas variables de sistema para hacerlas más accesibles dentro de tus programas. Un ejemplo es width y height. Estas variables devuelven la anchura (width) y altura (height) de la ventana de tu programa. Éste es un pequeño ejemplo:
size(400, 200);
ellipse(width/2, height/2, width, height);

 










Comandos nuevos:
  • size(width, height): Establece el tamaño de la ventana en píxels.
  • ellipse(x, y, x diameter, y diameter): dibuja un elipse centrado en las coordenadas x e y. El tamaño se establece con x diameter e y diameter. Cuando estos dos parámetros son iguales, el resultado es un círculo.
  • width: la anchura de la ventana de programa.
  • height: la altura de la ventana de programa.

Se le puede dar el tamaño de la elipse que tú quieras.


5.- Setup y draw.


Los tipos de programas que hemos hecho hasta ahora son los llamados programas estáticos. Esto significa que nunca cambian. Se ejecutan una única vez y cuando llegan a la última línea de código, se paran.

Con Processing, puedes crear programas que se ejecuten continuamente utilizando la función draw(). Esta función repetirá el bloque de código una y otra vez hasta que el programa se pare. Sin embargo, no todo el código escrito necesita ser repetido continuamente. Para el código que sólo necesita ser ejecutado una única vez, debes usar la función llamada setup().



Vamos a escribir de nuevo un programa que dibuje una línea, pero esta vez utilizando las nuevas funciones:
void setup() {
  size(150,150);
}
void draw() {
  line(0,0,width,height);
}











Nuevos comandos:
  • setup(): El código dentro de las llaves se ejecuta una única vez cuando el programa empieza. Sólo necesitamos establecer el tamaño de la ventana una vez, al principio del programa.
  • draw(): El código entre llaves se ejecuta una y otra vez. Se ejecuta línea por línea, de arriba a abajo hasta la última línea, donde vuelve a empezar desde el principio.

6.- Este programa establece el tamaño de ventana a 300 x 300 pixels y luego dibuja una línea sobre toda la ventana una y otra vez. En este momento, todavía no se puede apreciar que esto esta pasando una y otra vez, así que vamos a escribir otro programa para hacerlo más visible.
void setup() {
  size(300,300);
}

void draw() {
  line(0,0,mouseX,mouseY);
}


















Las líneas se hacen desde el punto (0,0) hasta donde está el cursor. Vamos a cambiarle el color al fondo y a las líneas.

void setup() {
  size(300,300);
  background(400);                                                                                   
line(0,0,100,100);
stroke(0,0,350);
line(0,100,100,0);

}

void draw() {
  line(0,0,mouseX,mouseY);
}




















7.- Serpiente roja

// Vamos a hacer el proyecto de la serpiente roja

void setup() {
  size(400,400);
}

void draw() {
  noStroke();   //Dibuja formas sin borde
  fill(255,0,0);   //Las figuras son de color rojo
  ellipse(100,100,30,30);  // Círculo de 30 pixeles de diámetro
}



















Primero nos saldrá un punto rojo en nuestra pantalla:

Lo que el programa hace es primero establecer el tamaño de la ventana a 400 x 400 píxels. Nosotros decidimos no utilizar contornos y utilizar el color rojo para el relleno. Por último, dibuja un círculo en las coordenadas 100,100 con un diámetro de 30 píxels.



PASO 2:
void setup() {
  size(400, 400);
}

void draw() {
  noStroke();            
  fill(255, 0, 0);         
  ellipse(mouseX, mouseY, 30, 30); // Circulo de en funcion de las coordenadas del raton
}




PASO 3
int rojo = 255;
 
void setup() {
  size(400, 400);
}

void draw() {
  noStroke();            
  fill(rojo, 0, 0);         
  ellipse(mouseX, mouseY, 30, 30); // Circulo de en funcion de las coordenadas del raton
}



PASO 4

int rojo = 255;
  
void setup() {
  size(400, 400);
}

void draw() {
  rojo = rojo - 1;            // Haz el rojo un poco mas obscuro
  if (rojo < 0){
    rojo = 255;              // Cuando llegue al maximo de obscuridad, hazlo claro otra vez
  }
   
  noStroke();            
  fill(rojo, 0, 0);         
  ellipse(mouseX, mouseY, 30, 30);
}



Cada segundo el rojo se va haciendo más intenso. Llega a su punto más oscuro y vuelve a bajar el color al rojo primario.

Nuevos comandos:

  • if( test ){ statements }: Comprueba si test es cierto. En este ejemplo, si rojo es menor que 0. Si es así, los statements entre llaves son ejecutados. En este ejemplo, establece red a 255 de nuevo. Si por el contrario, test es falso, el programa procede a ejecutar el código después de las llaves. Utilizando declaraciones “if” te permite decir al programa que código ejecutar.

.

PASO 5


int rojo = 255;
int tiempo = 0;
  
void setup() {
  size(400, 400);
}

void draw() {
  tiempo = tiempo + 1;  // Incrementa el tiempo en una unidad
  rojo = int(128 * (1 + sin(tiempo * 2 * PI / frameRate / 20)));  // Cambia el rojo, repite el color cada 20s
   
  noStroke();            
  fill(rojo, 0, 0);         
  ellipse(mouseX, mouseY, 30, 30);
}


Nuevos comandos:

  • sin( angle ): Esta función se utiliza para calcular el seno de un ángulo. En nuestro caso, no tiene nada que ver con ángulos pero, ¿te acuerdas de la gráfica del seno de la clase de matemáticas? Bien, esa gráfica es el por qué es útil para nosotros. Siempre que quieras crear una oscilación suave y continua de un movimiento o, en este caso, un cambio de color, sin() es muy práctico de usar.
  • PI: Esto es una variable constante que contiene el valor del número pi.
  • frameRate: Esto es otra variable que te da el framerate (frecuencia de ejecución) del programa.




El tiempo de cambio de color es más largo y no vuelve a su punto inicial sino que sube y baja la intensidad del color, como vemos en la imagen.

PASO 6

int rojo = 255;
int tiempo = 0;
int diametro = 50;
  
void setup() {
  size(400, 400);
}

void draw() {
  tiempo = tiempo + 1;    
  rojo = int(128 * (1 + sin(tiempo * 2 * PI / frameRate / 20)));
  diametro = int(50 * (1 + sin( tiempo * 2 * PI / frameRate / 5))); // Modifica el diametro del circulo con el paso del tiempo
   
  noStroke();            
  fill(rojo, 0, 0, 50);  // Añade un 50% de transparencia al color
  ellipse(mouseX, mouseY, diametro, diametro);
}

En este ultimo paso, la el punto que sigue el cursor se agranda y disminuye a la vez que cambia la tonalidad del color rojo.
Vamos a cambiar el color de la serpiente y la velocidad de cambio de color:
int colorr = 130;
int tiempo = 0;
int diametro = 50;
 
void setup() {
  size(400, 400);
}

void draw() {
  tiempo = tiempo + 3;   
  colorr = int(400 * (1 + sin(tiempo * 2 * PI / frameRate / 20)));
  diametro = int(50 * (1 + sin( tiempo * 2 * PI / frameRate / 5))); // Modifica el diametro del circulo con el paso del tiempo
  
  noStroke();           
  fill(colorr, 54, 678, 25);  // Añade un 50% de transparencia al color
  ellipse(mouseX, mouseY, diametro, diametro);
}