Professional Documents
Culture Documents
Processing v1.2.1
Ral Lacabanne - 2011
Versin 41
Resumen de los tpicos bsicos del libro:
Processing: A Programming Handbook
for Visual Designers and Artists
de Casey Reas y Ben Fry. MIT Press, 2007.
Design By Numbers
Design By Numbers (DBN) fue
creado como una plataforma de
introduccin al diseo asistido
por ordenador para diseadores
visuales y artistas.
Conceptualizado por John
Maeda en el ACG (Aesthetics +
Computation Group) del MIT,
quien cree que la calidad del
diseo y arte de medios slo
puede mejorar a travs del
establecimiento de
infraestructuras educativas en
escuelas de arte y tecnologa
que fomenten la formacin de
individuos transdiciplinarios
competentes.
John Maeda. DBN. 1999-2001.
Processing
Processing es un lenguaje y
entorno de programacin de
cdigo abierto basado en Java,
de fcil utilizacin, y que sirve
como instrumento didctico
para la enseanza y
produccin de proyectos
multimedia e interactivos de
diseo digital. Fue iniciado por
Ben Fry y Casey Reas.
Processing es desarrollado por
artistas y diseadores como
una herramienta alternativa al
software propietario. Puede ser
utilizado tanto para
aplicaciones locales as como
aplicaciones para la web.
Casey Reas & Ben Fry. 2001.
Parte 1
Elementos de sintaxis
Descarga y descompresin
Dirigirse a la siguiente URL: http://www.processing.org/download/
y descargar la versin apropiada a su sistema operativo. Se
recomienda a los usuarios de Windows descargar la versin
Windows (a secas) y no la versin Windows (Without
Java).
Una vez descargado el archivo, descomprimirlo en alguna
carpeta del disco rgido, ej: el escritorio. Esto quiere decir que el
entorno de desarrollo Processing no necesita instalacin.
A continuacin abrir la carpeta descomprimida y ejecutar el
archivo correspondiente al icono:
Comentarios
En Processing tenemos dos formas de realizar comentarios.
El primero es un comentario simple:
// esto es un comentario...
// ...y esto tambin lo es
el segundo es un bloque de comentario:
/*
esto
tambin
es
un
comentario
*/
Funciones (I)
Las funciones permiten ejecutar algoritmos,
es decir, obtener un resultado a partir de un o
una serie de pasos lgicos y estructurados.
En general, el nombre de una funcin
comienza en minsculas y es seguido por un
par de parntesis.
Los elementos que se encuentran entre los
parntesis se llaman parmetros.
Funciones (II)
Ejemplo de funciones
size(200, 200)
background(102)
noCursor()
Sensibilidad a maysculas y
minsculas
b =/= B
size() =/= Size()
Espaciado
Processing es flexible a los espaciados. Sin
embargo se recomienda ser prudente con los
mismos para que la lectura del cdigo sea
cmoda.
Instrucciones (I)
Si utilizamos una metfora del lenguaje humano,
podemos entender a la instruccin como si fuera
una oracin.
Las instrucciones siempre se deben terminan con el
signo punto y coma (;).
Dentro de una instruccin se pueden realizar las
siguientes acciones:
definir una variable o array,
asignar un valor a una variable (o valores a un array),
ejecutar una funcin,
o construir un objeto
Instrucciones (II)
Ejemplo de un boceto que contiene un
conjunto de instrucciones:
size(200, 200); // Ejecuta la funcin size() con dos parmetros
background(102); // Ejecuta la funcin background() con un parmetro
noCursor();
// Ejecuta la funcin noCursor() con ningn parmetro
Lectura recomendada
Captulo Structure 1: Code Elements (pag. 17).
Reas, C. & Fry, B. "Processing: A Programming Handbook for
Visual Designers and Artists, MIT Press, 2007.
Informacin complementaria
Utilizacin de la consola
// Para imprimir un valor Uso de la funcin print()
print(10); // Imprime 10 en la consola
// Para imprimir un texto, coloque el mismo entre comillas
print(processing"); // Imprime processing a continuacin del dato anterior
// Para imprimir en lneas separadas Uso de la funcin println()
println(10); // Imprime 10 en la consola y salta a una nueva lnea
println(processing"); // Imprime processing y salta a una nueva lnea
Parmetros
MODE: Puede optar por ARROW, CROSS, HAND, MOVE, TEXT, WAIT
image PImage: cualquier variable del tipo PImage
x int: el punto activo horizontal del cursor
y int: el punto activo vertical del cursor
noCursor()
Parte 2
Coordenadas y
figuras primitivas
Coordenadas
En Processing, el origen se encuentra en el
margen superior izquierdo.
0, 0
+100
+100
Primitivas: punto
point(20,
point(30,
point(40,
point(50,
point(60,
20);
30);
40);
50);
60);
Primitivas: lnea
Primitivas: elipse
Primitivas: rectngulo
Orden de dibujo
En Processing, el orden de dibujo siempre es
secuencial, es decir, la primer instruccin se
representa primero, las siguientes por
encima, y la ltima por sobre todas estas.
rect(15, 15, 60, 60); // cuadrado inferior
rect(20, 20, 40, 40); // cuadrado intermedio
rect(25, 25, 20, 20); // cuadrado superior
Suavizado
smooth()
noSmooth()
Atributos: strokeWeight()
tamao de contorno
smooth();
strokeWeight(1); // por defecto
line(20, 20, 80, 20);
strokeWeight(4); // 4 pixeles
line(20, 40, 80, 40);
strokeWeight(10); // 10 pixeles
line(20, 70, 80, 70);
Atributos: strokeCap()
extremo de contorno
smooth();
strokeWeight(12.0);
strokeCap(ROUND); // redondeado
line(20, 30, 80, 30);
strokeCap(SQUARE); // plano
line(20, 50, 80, 50);
strokeCap(PROJECT); // proyeccin
line(20, 70, 80, 70);
Atributos: strokeJoin()
extremo de contorno
smooth();
strokeWeight(10);
strokeJoin(MITER); // mitra
triangle(50, 20, 80, 80, 20, 80);
smooth();
strokeWeight(10);
strokeJoin(BEVEL); // bisel
triangle(50, 20, 80, 80, 20, 80);
smooth();
strokeWeight(10);
strokeJoin(ROUND); // redondeada
triangle(50, 20, 80, 80, 20, 80);
Lectura recomendada
Captulo Shape 1: Coordinates, Primitives (pag. 23).
Informacin complementaria
Primitivas: tringulo
Primitivas: cuadriltero
Ejercicio 1
EJ01: Escribir un boceto con la finalidad de componer un cuadro, con una resolucin
de 300x300 pxeles, que contenga las siguientes figuras:
dos elipses, cuatro lneas y un rectngulo.
Comentar todas las instrucciones.
De aqu en ms adaptar el siguiente comentario (a modo de ttulo) e ingresarlo en el
lugar de la primera instruccin:
//
//
//
//
//
//
//
//
//
***********************************************
* Alumno: Nombre y apellido del alumno
*
* Legajo: xxxxx
*
* Ejercicio Nro: 01
*
* Asignatura: xxxx
*
* Carrera: xxxx
*
* Institucin: UNQ
*
* Ao: XXXX
Cuatrimestre: x *
***********************************************
Ejercicio 2
Parte 3
Modos de color.
Fondo, contorno y relleno
colorMode(modo)
colorMode(modo, rango)
int
colorMode(modo, rango1, rango2, rango3)
colorMode(modo, rango1, rango2, rango3 , alpha)
HSB o RGB
o float
int o float
int o float
Sintaxis de colorMode()
Sintaxis
colorMode(modo);
colorMode(mode, rango);
colorMode(modo, rango1, rango2, rango3);
colorMode(modo, rango1, rango2, rango3, alpha);
Parmetros
modo
range
rango1
rango2
rango3
alpha
RGB o HSB:
correspondientes a Red/Green/Blue y
Hue/Saturation/Brightness.
int o float: rango para todos los elementos de color
int o float: rango para el Rojo o Tono dependiendo del
modo de color actual.
int o float: rango para el Verde o Saturacin
dependiendo del modo de color actual.
int o float: rango para el Azul o Brillo dependiendo del
modo de color actual.
int o float: rango para Alpha (0 transparencia total,
mximo opacidad total).
Ejemplo de colorMode()
colorMode(HSB, 360, 100, 100);
Contorno = stroke()
Valor por defecto = 0 (negro)
Sin contorno = noStroke()
Relleno = fill()
Valor por defecto = 255 (blanco)
Sin relleno = noFill()
Sintaxis de background()
background(gray)
background(gray, alpha)
background(value1, value2, value3)
background(value1, value2, value3, alpha)
background(color)
background(color, alpha)
background(hex)
background(hex, alpha)
Ejemplos de background()
colorMode(HSB, 360, 100, 100);
background(51);
o bien:
colorMode(HSB, 360, 100, 100);
background(255, 204, 0);
Parmetros de versiones de
background(), stroke() y fill()
gray
alpha
value1
value2
value3
color
hex
Sintaxis de stroke()
stroke(gray)
stroke(gray, alpha)
stroke(value1, value2, value3)
stroke(value1, value2, value3, alpha)
stroke(color)
stroke(color, alpha)
stroke(hex)
stroke(hex, alpha)
Ejemplos de stroke()
stroke(153);
rect(30, 20, 55, 55);
o bien:
stroke(204, 102, 0);
rect(30, 20, 55, 55);
Sintaxis de fill()
fill(gray)
fill(gray, alpha)
fill(value1, value2, value3)
fill(value1, value2, value3, alpha)
fill(color)
fill(color, alpha)
fill(hex)
fill(hex, alpha)
Ejemplos de fill()
fill(153);
rect(30, 20, 55, 55);
o bien:
fill(204, 102, 0);
rect(30, 20, 55, 55);
Lectura recomendada
Captulo Color 1: Color by Numbers (pag. 85).
Ejercicio 3
Parte 4
Tipos de datos. Variables.
Datos
En general consisten de mediciones de
caractersticas fsicas.
Processing puede administrar distintos tipos de
datos:
nmeros,
letras,
colores,
imgenes,
tipografas
y valores booleanos.
Tamao
Rango de valores
boolean
1 bit
true o false
byte
8 bits
-128 a 127
char
16 bits
0 a 65535
int
32 bits
-2,147,483,648 a
2,147,483,647
float
32 bits
-3.40282347E+38 a
Variables (I)
Podemos entender una variable como un contenedor que
nos permite almacenar un tipo de dato.
Las variables permiten la reutilizacin de datos en un
programa tantas veces como se necesite.
Las variables constan de tres partes:
tipo de dato,
=> float
nombre de la variable => altura
y valor
=> 1.72
Variables (II)
En Processing, cuando trabajamos con variables, primero
debemos declararla y luego asignar el valor que
corresponda:
int x;
float y;
boolean b;
x = 50;
y = 12.6;
b = true;
//
//
//
//
//
//
declaracin de
declaracin de
declaracin de
asignacin del
asignacin del
asignacin del
Variables (III)
Los pasos de declaracin y asignacin pueden
ser resumidos en una sola lnea de cdigo:
int x = 50;
float y = 12.6;
boolean b = true;
// declaracin y asignacin
// declaracin y asignacin
// declaracin y asignacin
Instrucciones (III)
Otro ejemplo de boceto que contiene un
conjunto de instrucciones:
size(200, 200);
int x;
x = 102;
background(x);
//
//
//
//
Lectura recomendada
Captulo Data 1: Variables (pag. 37).
Parte 5
Aritmtica
Operadores aritmticos
bsicos en Processing
+
*
/
%
Suma
Resta
Multiplicacin
Divisin
Mdulo
Orden de ejecucin de
operaciones aritmticas
??? 3 + 4 * 5
1) * / %
2) + 3) =
Expresiones
Podemos pensar en una expresin como si fuera una frase.
Las expresiones contienen frecuentemente o bien un solo valor, o
combinaciones de valores y operadores matemticos y/o
relacionales.
Una expresin siempre tiene un valor determinado por la evaluacin
de su contenido:
Expresin
5
122.3 + 3.1
((3 + 2) * -10) + 1
6>3
54 < 50
Valor
5
125.4
-49
true
false
Lectura recomendada
Captulo Math 1: Arithmetic, Functions (pag. 43).
Informacin complementaria
Operador Mdulo %
El operador % calcula el resto de un cociente.
A menudo se lo utiliza para mantener los nmeros
dentro de un rango deseado.
Por ej.: si partimos de un contador ascendente
desde el nmero 0 y queremos obtener cuatro
valores que se reiteren (un ciclo de valores),
usamos la siguiente expresin:
x
10
11
12
x%4
Atajos aritmticos
Operador incremental ++
int x = 1;
println(x); // Imprime "1" en la consola
x++; // Equivale a x = x + 1
println(x); // Imprime "2" en la consola
x++
++x
x++
En este caso el valor es incrementado LUEGO de que se evala la
expresin.
int x = 1;
println(x++);
println(x);
++x
En este segundo caso se actualiza el valor ANTES de evaluar la
expresin.
int x = 1;
println(++x);
println(x);
Operadores de asignacin de
suma y substraccin
Se utilizan para realizar saltos de ms de un paso
(una unidad de valor).
Suma +=
int x = 1;
println(x);
x += 5;
println(x);
Resta -=
int y = 1;
println(y);
y -= 5;
println(y);
Operadores de asignacin de
multiplicacin y divisin
Se utilizan para realizar saltos de ms de un paso
(una unidad de valor).
Multiplicacin *=
int x = 4;
println(x);
x *= 2;
println(x);
Divisin /=
int y = 4;
println(y);
y /= 2;
println(y);
Operadores de negacin
Cambia el signo del valor.
Negacin
int x = 5; // Asigna 5 a x
x = -x; // Equivalente a x = x * -1
println(x); // Imprime "-5"
Ejercicio 4
Parte 6
Control: Decisiones
Expresiones relacionales
Las expresiones relacionales nos informan la condicin de
verdad de dicha expresin.
Una expresin relacional compara dos valores y evala si
el resultado es verdadero o falso.
Expresin Evaluacin
3>5
false
3<5
true
5<3
false
5>3
true
Operadores relacionales
Operador
>
<
>=
<=
==
!=
Significado
mayor a
menor a
mayor o equivalente a
menor o equivalente a
equivalente a
no equivalente a
Condicional: if
Ejemplo: if
Condicional: if/else
Ejemplo: if/else
boolean dibujoCirculo = true;
if (dibujoCirculo == true) {
ellipse(50, 50, 50, 50);
} else {
line(25, 25, 75, 75);
line(75, 25, 25, 75);
}
rect(30, 45, 40, 10);
Condicional: if/else if
Ejemplo: if/else if
Condicional: switch()
Funciona como una estructura if, sin
embargo es ms conveniente utilizar
switch() cuando usted necesita
seleccionar entre tres o ms alternativas.
Sintaxis
switch(expresin)
{
case etiqueta1:
instrucciones
case etiqueta2:
instrucciones
default:
instrucciones
}
//
//
//
//
Opcional
Opcional
Opcional
Opcional
Parmetros
expresin
byte, char o int
etiqueta
byte, char o int
instrucciones
una o ms
&&
||
!
Significado
AND (Y conjuncin)
OR (o disyuncin (disyuncin inclusiva))
NOT (no - negacin)
Evaluacin
true
false
false
false
true || true
true || false
false || true
false || false
true
true
true
false
!true
!false
false
true
}
//
//
//
if
}
La expresin "a > 15" es falsa, pero "b < 30" es verdadera.
Debido a que el operador AND requiere que ambas sean
verdaderas, no se ejecutar el cdigo del bloque.
((a > 15) && (b < 30)) {
ellipse(50, 50, 36, 36);
Operador lgico OR
El operador OR hace que una expresin relacional sea verdadera si
SLO una parte es verdadera.
int a = 10;
int b = 20;
// Cualquiera de las dos expresiones pueden ser verdaderas.
// Debido a que ambas son verdaderas, se ejecutar el cdigo del bloque.
if ((a > 5) || (b < 30)) {
line(20, 50, 80, 50);
}
// La expresin "a > 15" es falsa, pero "b < 30" es verdadera.
// Debido a que el operador OR requiere slo que una parte sea verdadera
// en toda la expresin, se ejecutar el cdigo del bloque.
if ((a > 15) || (b < 30)) {
ellipse(50, 50, 36, 36);
}
Lectura recomendada
Captulo Control 1: Decisions (pag. 51).
Ejercicio 5
EJ05: Realizar un boceto donde se declare una variable que, en funcin del
valor dibuje:
TRUE: un crculo con relleno negro.
FALSE: un crculo con relleno blanco.
Ejercicio 6
Ejercicio 7
EJ7: Realizar un boceto donde se declare una variable que en funcin del
valor dibuje:
un crculo sin relleno.
un crculo con relleno blanco.
un crculo con relleno negro.
Parte 7
Control: Iteraciones
size(200, 200);
size(200, 200);
line(20, 20, 20, 180);
for (int i = 20; i < 150; i += 10) {
line(30, 20, 30, 180);
line(i, 20, i, 180);
line(40, 20, 40, 180);
}
line(50, 20, 50, 180);
line(60, 20, 60, 180);
line(70, 20, 70, 180);
line(80, 20, 80, 180);
line(90, 20, 90, 180);
line(100, 20, 100, 180);
line(110, 20, 110, 180);
line(120, 20, 120, 180);
line(130, 20, 130, 180);
line(140, 20, 140, 180);
Estructura y funcionamiento
general de for
for (init; test; update) {
statements
}
Iteracin: for
Ejemplo: for
for (int i = 10; i <= 90; i += 5) {
line(i, 10, i, 90);
}
Iteraciones anidadas
La estructura for produce repeticiones en una dimensin. Si anidamos esta estructura
DENTRO de otra, combinando su efecto, crearemos iteraciones en dos dimensiones.
Ej. 1
Iteracin: while
La estructura while ejecuta una serie de
instrucciones de manera continua
mientras que la expresin sea
verdadera.
La expresin debe ser actualizada
durante la iteracin, de lo contrario
nunca saldremos del while.
Esta funcin puede resultar peligrosa ya
que el cdigo dentro del bucle while() no
se detendr hasta que la expresin
dentro del mismo resulte falsa.
Bloquear cualquier otro cdigo a ser
utilizado (los eventos de ratn no sern
actualizados, etc.). Por lo tanto debemos
ser cautelosos ya que podemos llegar a
inmovilizar el cdigo (y hasta a veces el
entorno Processing mismo) si se usa de
manera incorrecta.
Sintaxis
while (expresin) {
instrucciones
}
Parmetros
expresin
una expresin vlida
instrucciones
una o ms
Ejemplo: while
int i=0;
while(i < 80) {
line(30, i, 80, i);
i = i + 5;
}
Lectura recomendada
Captulo Control 2: Repetition (pag. 61).
Informacin complementaria
100; y += 10) {
< y; x += 10) {
y+6);
y+6);
Ejercicio 8
Parte 8
Aleatoriedad
Valores inesperados
La funcin random() es utilizada para crear valores
impredecibles dentro de un rango especificado por sus
parmetros.
Los nmeros devueltos por la funcin random() son siempre de
punto flotante.
random(valorAlto)
random(valorBajo, valorAlto)
random(5);
random(5.0);
random(-5.0, 10.2);
Ejemplos (I)
smooth();
strokeWeight(10);
stroke(0, 130);
line(0, random(100),
line(0, random(100),
line(0, random(100),
line(0, random(100),
line(0, random(100),
100,
100,
100,
100,
100,
random(100));
random(100));
random(100));
random(100));
random(100));
Ejemplos (II)
smooth();
strokeWeight(20);
float r = random(5, 45);
stroke(r * 5.6, 230);
line(0, r, 100, random(55, 95));
r = random(5, 45);
stroke(r * 5.6, 230);
line(0, r, 100, random(55, 95));
r = random(5, 45);
stroke(r * 5.6, 230);
line(0, r, 100, random(55, 95));
Ejemplos (III)
background(0);
stroke(255, 60);
for (int i = 0; i < 100; i++) {
float r = random(10);
strokeWeight(r);
float desplazamiento = r * 5.0;
line(i-20, 100, i+desplazamiento, 0);
}
randomSeed() - Semillas
Ya que el ordenador no puede inventar numeros al
azar, estos se obtienen con ms o menos
complejas ecuaciones. Por lo tanto son repetibles.
Para obtener cadenas de valores reiterados,
utilizamos una semilla mediante la funcin
randomSeed().
randomSeed(valor)
El valor debe ser siempre un int.
Ejemplo
int s = 6; // Valor de semilla, probar: s=6 o s=12
background(0);
stroke(255, 60);
randomSeed(s); // Produce los mismos nros cada vez
for (int i = 0; i < 100; i++) {
float r = random(10);
strokeWeight(r);
float desplazamiento = r * 5;
line(i-20, 100, i+ desplazamiento, 0);
}
Lectura recomendada
Captulo Math 4: Random (pag. 127).
Ejercicio 9
Ejercicio 10
Parte 9
Continuidad: de la imagen
esttica a la dinmica
Ejecucin continua
Todos los bocetos programados hasta el
momento son ejecutados por nica vez y
luego se detienen.
Programas animados o sensibles a
informacin en vivo deben ejecutarse
continuamente.
Funcin draw()
Los programas que se ejecutan continuamente
DEBEN incluir una funcin llamada draw().
El cdigo incluido en el bloque de la funcin draw()
se ejecuta en forma de BUCLE hasta que el usuario
presione el botn de detencin o cierre la ventana.
Un programa puede tener un nico draw().
Cada vez que el bloque draw() finaliza, dibuja un
nuevo cuadro (frame) y comienza nuevamente el
cdigo del bloque desde su primera lnea.
Funcin frameRate()
La funcin frameRate() determina el nmero mximo de cuadros
por segundo que renderizar el programa siempre y cuando no
exceda los valores posibles a realizar por el sistema.
Si utilizamos la variable de sistema frameCount podremos llevar
un registro de la cantidad de cuadros renderizados hasta el
momento:
void draw() {
frameRate(1);
println(frameCount);
}
Animacin (I)
Creamos animaciones cuando cambiamos
atributos visuales de un cuadro al otro:
float y = 0.0;
void draw() {
frameRate(30);
line(0, y, 100, y);
y = y + 0.5;
Animacin (II)
Debe ser observado que se define la variable
y por fuera del bloque draw(). Qu hubiera
pasado si la incluamos dentro?
void draw() {
frameRate(30);
float y = 0.0;
line(0, y, 100, y);
y = y + 0.5;
Animacin (III)
Para que tengamos una animacin la
variable y debe ser declarada fuera del
bloque, ya que de lo contrario esta se
redefinira y reasignara al MISMO valor cada
vez que se vuelve a iniciar el bucle.
Animacin (IV)
Como podemos observar, el fondo del lienzo va cambiando de color
de acuerdo a cada nueva lnea que aparece.
SI deseamos poder ver el avance de la lnea sobre el fondo,
debemos refrescar el fondo cada vez que reiniciemos el draw()
mediante la funcin background().
float y = 0.0;
void draw() {
frameRate(30);
background(204);
line(0, y, 100, y);
y = y + 0.5;
}
Animacin (V)
Incorporando una pequea expresin en los
parmetros de background(), la animacin va
ganando inters!
float y = 0.0;
void draw() {
frameRate(30);
background(y * 2.5);
line(0, y, 100, y);
y = y + 0.5;
}
Animacin (VI)
Y si incorporamos una pequea estructura de condicional
generamos ciclos visibles!
float y = 0.0;
void draw() {
frameRate(30);
background(204);
line(0, y, 100, y);
y = y + 0.5;
if (y > height) {
y = 0;
}
}
Animacin (VII)
O bien podemos volver a tomar la animacin IV y modificarla para obtener otro resultado visual:
int y = 0;
int direccion = 1;
void draw() {
frameRate(30);
background(204);
if (y > 100) {
direccion = -1;
}
if (y < 0) {
direccion = 1;
}
y = y + (1 * direccion);
line(0, y, 100, y);
}
Animacin (VIII)
Esta es otra manera de resolver la animacin anterior. No existen formas fijas de
resolver un problema, por suerte podemos abordar diferentes enfoques para la
resolucin del mismo:
int y = 0;
int direccion = 1;
void draw() {
frameRate(30);
background(204);
if (y > 100 || y < 0) {
direccion *= -1;
}
y = y + (1 * direccion);
line(0, y, 100, y);
}
Lectura recomendada
Captulo Structure 2: Continuous (pag. 173).
Ejercicio 11
Parte 10
Anatoma de un programa
estructurado
Funcin setup()
Para optimizar la programacin, nos damos cuenta que ciertas funciones slo
deben ser ejecutadas una vez. Exponemos como ejemplo la funcin
frameRate() de los bocetos anteriores.
float y = 0.0;
void setup() {
frameRate(30);
}
void draw() {
background(y * 2.5);
y = y + 0.5;
line(0, y, 100, y);
if (y > 100) {
y = 0;
}
}
Seccin de
inicializacin
Seccin de
dibujo
Ejemplo
float y = 0.0;
void setup() {
size(100, 100);
smooth();
fill(0);
}
void draw() {
background(204);
ellipse(50, y, 70, 70);
y += 0.5;
if (y > 150) {
y = -50.0;
}
}
Observaciones (I)
Las variables que cambian en cada repeticin del
bloque draw() DEBEN ser declaradas fuera de los
bloques de setup() y draw().
Si su programa dibuja un solo cuadro, puede
escribirlo por completo dentro del bloque setup():
void setup() {
size(100, 100);
smooth();
fill(0);
ellipse(50, 50, 66, 66);
}
Observaciones (II)
Otra manera de realizar un solo cuadro, es utilizar la
funcin noLoop() dentro del bloque setup().
void setup() {
size(100, 100);
smooth();
fill(0);
noLoop();
}
void draw() {
ellipse(50, 50, 66, 66);
}
// d variable global
void setup() {
size(100, 100);
int val = d * 2;
fill(val);
}
void draw() {
int y = 60;
line(0, y, d, y);
y -= 25;
line(0, y, d, y);
}
Lectura recomendada
Captulo Structure 2: Continuous (pag. 173).
Parte 11
Interactividad: ratn y teclado
Ejemplo de variables de
sistema mouseX y mouseY 1/6
void draw() {
frameRate(12);
println(mouseX + " : " + mouseY);
}
Ejemplo de variables de
sistema mouseX y mouseY 2/6
void setup() {
size(200, 200);
smooth();
noStroke();
}
void draw() {
background(126);
ellipseMode(CENTER);
ellipse(mouseX, mouseY, 33, 33);
}
Ejemplo de variables de
sistema mouseX y mouseY 3/6
void setup() {
size(200, 200);
smooth();
noStroke();
}
void draw() {
background(126);
ellipse(mouseX, 16, 33, 33);
ellipse(mouseX + 20, 50, 33, 33);
ellipse(mouseX - 20, 84, 33, 33);
}
Ejemplo de variables de
sistema mouseX y mouseY 4/6
void setup() {
size(200, 200);
smooth();
noStroke();
}
void draw() {
background(126);
ellipse(mouseX, 16, 33, 33);
ellipse(mouseX / 2, 50, 33, 33);
ellipse(mouseX * 2, 84, 33, 33);
}
Ejemplo de variables de
sistema mouseX y mouseY 5/6
void setup() {
size(200, 200);
smooth();
noStroke();
}
void draw() {
float x = mouseX;
float y = mouseY;
float ix = width - mouseX; // Inverso de X
float iy = mouseY - height; // Inverso de Y
background(126);
fill(255, 150);
ellipse(x, height/2, y, y);
fill(0, 159);
ellipse(ix, height/2, iy, iy);
}
Ejemplo de variables de
sistema mouseX y mouseY 6/6
void setup() {
size(200, 200);
smooth();
noStroke();
}
void draw() {
background(126);
float normX = mouseX / float(width);
ellipse(mouseX, 16, 33, 33);
ellipse(pow(normX, 4) * width, 50, 33, 33);
ellipse(pow(normX, 8) * width, 84, 33, 33);
}
Ejemplo de variables de
sistema keyPressed y key
// Dibuja una lnea si se mantiene
// presionada la tecla 'a' o 'A'.
void setup() {
size(100, 100);
smooth();
strokeWeight(4);
}
void draw() {
background(204);
if ((keyPressed == true) && ((key == 'a') || (key == 'A'))) {
line(50, 25, 50, 75);
}
else {
ellipse(50, 50, 50, 50);
}
}
int y = 35;
void setup() {
size(100, 100);
}
void draw() {
background(204);
line(10, 50, 90, 50);
if (key == CODED) {
if (keyCode == UP) {
y = 20;
}
else if (keyCode == DOWN) {
y = 50;
}
}
else {
y = 35;
}
rect(25, y, 50, 30);
}
mouseReleased()
El cdigo dentro de esta funcin se ejecuta una vez cuando se
libera un botn de ratn.
mouseMoved()
El cdigo dentro de esta funcin se ejecuta una vez cuando se
mueve un ratn.
mouseDragged()
El cdigo dentro de esta funcin se ejecuta una vez cuando se
mueve un ratn mientras se encuentra presionado un botn de
ratn.
keyReleased()
El cdigo dentro de esta funcin se ejecuta una vez
cuando se libera cualquier tecla.
Lectura recomendada
Captulo Input 1: Mouse I (pag. 205).
Captulo Drawing 1: Static Forms (pag. 217).
Captulo Input 2: Keyboard (pag. 223).
Captulo Input 3: Events (pag. 229).
Informacin complementaria
100) {
100) {
100) {
Ejercicio 12
Parte 12
Funciones de usuario
Introduccin 1/2
En Processing cualquier usuario puede programar sus propias funciones. Llamamos
a esto funcin de usuario.
Una funcin es un mdulo de programacin autocontenido.
Las funciones de usuario hacen ms conciso el cdigo redundante al extraer los
elementos comunes e incluirlos en bloques de cdigo para que puedan ejecutarse
tantas veces se quiera dentro del programa.
Esto permite una lectura ms fcil del cdigo y reduce las probabilidades de error al
actualizar el cdigo.
Las funciones generalmente tienen parmetros que definen sus acciones.
Las funciones pueden operar de forma diferente dependiendo del nmero de
parmetros usados.
Una funcin puede ser imaginada como una caja con mecanismos dentro que actan
sobre los datos ingresados y devuelven un resultado.
Introduccin 2/2
Convencionalmente posee una o varias entradas, un bloque de cdigo que procesa dichas
entradas, y finalmente una salida.
Abstraccin 1/2
En terminologa de software se llama abstraccin al proceso que permite esconder
los detalles de realizacin y concentrarnos en el resultado.
En realidad todas las funciones de sistema que hemos visto hasta el momento son,
tcnicamente, abstracciones: los autores han escondido los detalles de
implementacin para que el programador se concentre en los resultados.
Cuando construimos funciones estas podrn devolver un resultado o no. Depende
evidentemente de qu querramos hacer con ella. Pero en el caso de optar por la no
devolucin de un resultado deberemos comenzar por construir el bloque con la
palabra clave void.
Es por esto que todos los ejemplos que veremos a continuacin comienzan a
construirse con dicha palabra clave.
El
1)
2)
3)
4)
void setup() {
size(200, 200);
background(255);
}
void draw() {
// cuatro llamadas a la funcin definida por el usuario cross()
// el "origen del sistema de coordenadas" por defecto se encuentra en la esquina superior izquierda de la pantalla
cruz();
// esquina superior izquierda de la cruz en 0,0
translate(50, 50); // el "origen del sistema de coordenadas" se mueve 50 px a la derecha y 50 px abajo
cruz();
// esquina superior izquierda de la cruz en 50,50
translate(50, 50); // el "origen del sistema de coordenadas" se mueve otros 50 px a la derecha y 50 px abajo
cruz();
// esquina superior izquierda de la cruz en 100,100
translate(50, 50); // el "origen del sistema de coordenadas" se mueve otros 50 px a la derecha y 50 px abajo
cruz();
// esquina superior izquierda de la cruz en 150,150
}
void cruz() { // nuestra funcin definida por el usuario (podemos nombrarla como querramos)
noStroke();
fill(255, 0, 0); // rojo
rect(0, 10, 30, 10);
rect(10, 0, 10, 30);
}
// cuando dibujamos usando funciones es importante poder tener la posibilidad de dibujar una forma desde el centro...
void setup() {
size(200, 200);
background(255);
}
void draw() {
cruz();
//
//
//
//
el
el
el
el
centro
centro
centro
centro
de
de
de
de
la
la
la
la
cruz
cruz
cruz
cruz
se
se
se
se
encuentra
encuentra
encuentra
encuentra
en
en
en
en
0,0
50,50
100,100
150,150
}
void cruz(float ejeX, float ejeY) { // estamos usando dos parmetros (los nombramos como querramos)
noStroke();
fill(255, 0, 0);
rectMode(CENTER);
// ejeX y ejeY estn actuando como variables y han sido declaradas por fuera del bloque de la funcin
rect(ejeX, ejeY, 30, 10);
rect(ejeX, ejeY, 10, 30);
}
// cuando se programa es posible alcanzar los mismos resultados utilizando diferentes acercamientos!
void setup() {
size(200, 200);
background(255);
}
void draw() {
fill(255, 0, 0);
cruz(0, 0, 1);
fill(51, 153, 255);
cruz(50, 50, 3);
// rojo
// azul
void draw() {
peligro(50, 100);
peligro(75, 80);
peligro(100, 100);
peligro(125, 120);
peligro(150, 100);
}
// blanco
}
+
+
-
4,
4,
4,
4,
// ms grande
// ms pequeo
void setup() {
size(200, 200);
background(255);
}
void draw() {
peligro(50, 100, 1.3);
peligro(150, 100, 0.5);
}
void peligro(float x, float y, float sz) {
fill(0, 0, 0); // negro
pushMatrix();
translate(x, y);
scale(sz);
tubo();
popMatrix();
fill(255, 255, 255);
pushMatrix();
translate(x, y);
scale(sz);
burbujas();
popMatrix();
}
// blanco
void tubo() {
noStroke();
rectMode(DIAMETER);
ellipseMode(RADIUS);
rect(0, 0, 40, 100);
rect(0, - 50, 60, 10);
ellipse(0, 50, 20, 20);
}
void burbujas() {
noStroke();
ellipseMode(RADIUS);
ellipse(4, - 24, 10, 10);
ellipse(-4, 0, 9, 9);
ellipse(4, 24, 8, 8);
ellipse(-4, 48, 7, 7);
}
Sobrecarga de funciones
(Function overloading) 1/2
Se llama sobrecarga de funciones al procedimiento de crear diferentes versiones
de una misma funcin.
Las distintas versiones pueden compartir el mismo nombre de funcin siempre y
cuando tengan diferentes nmeros de parmetros o tipos de datos de los
mismos. Es decir, un programa puede tener dos funciones con el mismo nmero
de parmetros, pero slo si el tipo de dato de uno de sus parmetros es
diferente.
Processing identifica qu versin de funcin debe ejecutar al comparar el nmero
y el tipo de dato de sus parmetros.
Veamos el prximo ejemplo:
Sobrecarga de funciones
(Function overloading) 2/2
void setup() {
size(100, 100);
smooth();
}
void draw() {
dibujoX(255); // Ejecuta primer dibujoX()
dibujoX(5.5); // Ejecuta segundo dibujoX()
dibujoX(0, 2, 44, 48, 36); // Ejecuta tercer dibujoX()
}
// dibujoX con el valor de gris determinado por el parmetro
void dibujoX(int gris) {
stroke(gris);
strokeWeight(20);
line(0, 5, 60, 65);
line(60, 5, 0, 65);
}
// dibujoX negro con el valor ancho de contorno determinado por el parmetro
void dibujoX(float ancho) {
stroke(0);
strokeWeight(ancho);
line(0, 5, 60, 65);
line(60, 5, 0, 65);
}
// dibujoX con la posicin , el valor de gris, tamao y el ancho de
// contorno determinados por sus correspondientes parmetros
void dibujoX(int gris, int ancho, int x, int y, int s) {
stroke(gris);
strokeWeight(ancho);
line(x, y, x+s, y+s);
line(x+s, y, x, y+s);
}
Lectura recomendada
Captulo Structure 3: Functions (pag. 181).
Ejercicio 13
Ejercicio 14
Ejercicio 15
EJ15: Crear una forma interactiva que comunique la idea de "orden y caos".
Parte 13
Otras funciones
matemticas
float x = sq(1);
float y = sq(-5);
float z = sq(9);
// Asigna 81.0 a r
// Asigna 25.0 a s
// Asigna 1.0 a t
d
e
f
g
=
=
=
=
pow(1, 3);
pow(3, 4);
pow(3, -2);
pow(-3, 3);
//
//
//
//
Asigna
1.0
Asigna 81.0
Asigna
0.11
Asigna -27.0
a
a
a
a
d:
e:
f:
g:
equivalente
equivalente
equivalente
equivalente
a
a
a
a
1*1*1
3*3*3*3
1 / (3*3)
-3*-3*-3
Clculo
0.0 / 255.0
Valor normalizado
0.0
102.0
102.0 / 255.0
0.4
255.0
255.0 / 255.0
1.0
// Asigna 0.0 a x
// Asigna 0.4 a y
// Asigna 1.0 a z
0.0 a 255.0
x * 255.0
0.0 a 1.0
-1.0 a 1.0
(x * 2.0) - 1.0
0.0 a 1.0
-20.0 a 60.0
(x * 80.0) - 20.0
// Asigna -20.0 a r
// Asigna 20.0 a s
// Asigna 60.0 a t
// Asigna 35 a x
// Asigna 15 a y
// Asigna 90 a z
// Asigna 50.0 a r
// Asigna 90.0 a s
Orientacin 1/4
La funcin atan2() es usada para calcular el ngulo desde cualquier punto del rea de
representacin a la coordenada de origen (0, 0). Tiene dos parmetros:
atan2(y, x)
Donde los parmetro x e y corresponden a la coordenada de inters. Note que la posicin de
ambos parmetros se presentan en reverso comparado a cmo las usa otras funciones tales
como point().
Los valores de ngulo son regresados en radianes dentro del rango a .
Recordemos que un circulo mide 2* radianes, lo cual equivale en grados a 360. Por lo tanto,
un ngulo de 90 corresponde a /2 (1.5707964). Para convertir una medida de radianes a
grados utilizamos la funcin degrees().
Veamos un ejemplo donde aplicamos estas dos funciones:
Orientacin 2/4
// El ngulo se incrementa a medida de que el ratn
// se mueve desde la esquina superior-derecha de la
// pantalla a la esquina inferior-izquierda
void setup() {
size(100, 100);
frameRate(15);
fill(0);
}
void draw() {
float angulo = atan2(mouseY, mouseX);
float grados = degrees(angulo);
println(grados + "");
background(204);
ellipse(mouseX, mouseY, 8, 8);
rotate(angulo);
line(0, 0, 150, 0);
}
Orientacin 3/4
Por ltimo, para calcular la orientacin relativa a otro punto de referencia que no sea la
coordenada de origen (0, 0), utilizamos la funcin atan2() cuyos parmetros son substrados por
los valores correspondientes al otro punto de referencia que se desea fijar.
Veamos lo antedicho en el siguiente ejemplo:
Orientacin 4/4
// Rota el tringulo apuntando siempre
// a la posicin del puntero
float x = 50;
float y = 50;
void setup() {
size(100, 100);
noStroke();
smooth();
}
void draw() {
background(0);
float angulo = atan2(mouseY - y, mouseX - x);
pushMatrix();
translate(x, y);
rotate(angulo);
triangle(-20, -8, 20, 0, -20, 8);
popMatrix();
}
Lectura recomendada
Captulo Shape 2: Vertices (pag. 69).
Captulo Math 2: Curves (pag. 79).
Captulo Math 3: Trigonometry (pag. 117).
Captulo Transform 1: Translate, Matrices (pag. 133).
Captulo Transform 2: Rotate, Scale (pag. 137).
Captulo Shape 3: Parameters, Recursion (pag. 197).
Captulo Input 4: Mouse II (pag. 237).
Informacin complementaria
Reduccin de rango
Disponemos de cinco funciones bsicas:
ceil()
floor()
round()
min()
max().
ceil() - techo
Calcula el valor entero ms cercano que el valor
ms grande o igual del de su parmetro.
int w = ceil(2.0);
int x = ceil(2.1);
int y = ceil(2.5);
int z = ceil(2.9);
// Asigna 2 a w
// Asigna 3 a x
// Asigna 3 a y
// Asigna 3 a z
floor() - piso
Calcula el valor entero ms cercano que el valor
ms pequeo o igual del de su parmetro.
int w = floor(2.0); // Asigna 2 a w
int x = floor(2.1); // Asigna 2 a x
int y = floor(2.5); // Asigna 2 a y
int z = floor(2.9); // Asigna 2 a z
round() - redondeo
Calcula el valor entero ms cercano al valor de la
media de su parmetro.
int w = round(2.0);
int x = round(2.1);
int y = round(2.5);
int z = round(2.9);
// Asigna 2 a w
// Asigna 2 a x
// Asigna 3 a y
// Asigna 3 a z
min() - mnimo
int u = min(5, 9);
int v = min(-4, -12, -9);
float w = min(12.3, 230.24);
// Asigna 5 a u
// Asigna -12 a v
// Asigna 12.3 a w
max() - mximo
int x = max(5, 9);
int y = max(-4, -12, -9);
float z = max(12.3, 230.24);
// Asigna 9 a x
// Asigna -4 a y
// Asigna 230.24 a z
Parte 14
Movimientos simples
Movimiento
En esta seccin revisaremos tres clases de movimiento:
Movimiento implcito
Movimiento explcito
Movimiento mediante transformacin
// ***contina***
// Clculo de curva
y *= 100;
point(x, y);
}
Ejemplo 2:
for (int x = 0; x < 100; x++) {
float n = norm(x, 0.0, 100.0); // Rango 0.0 a 1.0
float y = pow(n, 0.4);
y *= 100;
point(x, y);
}
// Clculo de curva
// Rango 0.0 a 100.0
Movimiento mediante
transformacin 1/3
Las funciones de transformacin (translate(), rotate(), y scale()) tambin
pueden crear movimiento al cambiar los valores de sus parmetros. Antes de usar
las transformaciones para el movimiento, es importante remarcar que las
transformaciones se reinicializan al comienzo de cada bloque draw().
Por lo tanto, cuando se ejecuta translate(50, 0)dentro del bloque draw(), el
sistema de coordenadas se ajusta 50 pixeles a la derecha por nica vez hasta que se
detenga el programa.
void setup() {
size(100, 100);
smooth();
}
void draw() {
background(0);
translate(50, 0); // Se reinicia a 50 px cada vez que entra en draw
ellipse(0, 50, 60, 60);
}
Movimiento mediante
transformacin 2/3
Del mismo modo, las translaciones dentro del bloque setup() no tienen efecto en
las figuras producidas en el bloque draw().
void setup() {
size(100, 100);
smooth();
translate(50, 0); // No tiene efecto
}
void draw() {
background(0);
ellipse(0, 50, 60, 60);
}
Movimiento mediante
transformacin 3/3
Las funciones de transformacin pueden ser utilizadas para generar movimiento, sin
embargo su uso puede ser un poco engorroso.
float angulo = 0.0;
void setup() {
size(100, 100);
smooth();
noStroke();
}
void draw() {
fill(0, 12);
rect(0, 0, width, height);
fill(255);
angulo = angulo + 0.02;
translate(70, 40);
rotate(angulo);
rect(-30, -30, 60, 60);
}
Lectura recomendada
Captulo Motion 1: Lines, Curves (pag. 279).
Parte 15
Movimientos mecnico y
orgnico
// ngulo actual
void setup() {
size(100, 100);
noStroke();
smooth();
}
void draw() {
fill(0, 20);
rect(0, 0, width, height);
fill(255);
angulo += velocidad;
float sinval = sin(angulo);
float yoffset = sinval * rango;
ellipse(50, 50 + yoffset, 40, 40);
}
// ngulo actual
// Actualiza ngulo
Fase 1/3
La fase de una funcin corresponde a una iteracin completa a travs de todos sus
valores posibles.
El desplazamiento de fase ocurre cuando se comienza a recorrer una funcin desde
un lugar diferente al inicial:
Fase 2/3
float angulo = 0.0;
float velocidad = 0.1;
void setup() {
size(100, 100);
noStroke();
smooth();
}
void draw() {
background(0);
angulo += velocidad;
ellipse(50 + (sin(angulo + PI) * 5), 25, 30, 30);
ellipse(50 + (sin(angulo + HALF_PI) * 5), 55, 30, 30);
ellipse(50 + (sin(angulo + QUARTER_PI) * 5), 85, 30, 30);
}
Fase 3/3
float angulo = 0.0;
// ngulo
// Velocidad de crecimiento
void setup() {
size(100, 100);
noStroke();
smooth();
fill(255, 180);
}
void draw() {
background(0);
circuloFase(0.0);
circuloFase(QUARTER_PI);
circuloFase(HALF_PI);
angulo += velocidad;
}
void circuloFase(float fase) {
float diameter = 65 + (sin(angulo + fase) * 45);
ellipse(50, 50, diameter, diameter);
}
// coordenada X
float y = 80.0;
// coordenada Y
void setup() {
size(100, 100);
randomSeed(0);
background(0);
stroke(255);
}
void draw() {
x += random(-2, 2);
y += random(-2, 2);
point(x, y);
}
void setup() {
size(100, 100);
stroke(255, 204);
smooth();
}
void draw() {
background(0);
inc += 0.01;
float angulo = sin(inc)/10.0 + sin(inc*1.2)/20.0;
alga(18, 9, angulo/1.3);
alga(33, 12, angulo);
alga(44, 10, angulo/1.3);
alga(62, 5, angulo);
alga(88, 7, angulo*2);
}
// ***contina***
Lectura recomendada
Captulo Motion 2: Machine, Organism (pag. 291).
Parte 16
Arrays
Introduccin 1/5
El trmino array hace referencia a una agrupacin sistemtica de objetos.
Es posible encontrar en la bibliografa en espaol diversas traducciones del
antedicho trmino tales como arreglo, vector o matriz, siendo la primera una
traduccin literal, la segunda haciendo referencia al vector algebraico (generalmente
de una dimensin), y la tercera a una matriz algebraica (generalmente de dos).
Pocas veces es traducido como el objeto matemtico tensor (multidimensional).
En informtica llamamos array a un conjunto de elementos de datos, todos ellos
almacenados bajo un mismo nombre.
Los arrays pueden almacenar nmeros, caracteres, cadenas de texto, valores
booleanos, datos de posicin de vrtices correspondientes a una figura compleja,
teclas pulsadas, clics de botones de ratn, datos leidos de un archivo de texto, etc.
Introduccin 2/5
Veamos un ejemplo: queremos almacenar cinco datos (elementos), en este caso
cinco nmeros enteros, correspondientes a un conjunto ordenado de datos que
llamaremos fechas:
Los elementos de un array son numerados a partir del nmero cero. El primer
elemento se encuentra en la posicin [0], el segundo en la posicin [1], etc.
La posicin de cada elemento es determinada por el desplazamiento desde el inicio
del array. El primer elemento se encuentra en la posicin [0] ya que existe
desplazamiento; el segundo elemento se encuentra en la posicin [1] ya que su lugar
se encuentra desplazado un espacio desde el inicio del array.
La ltima posicin se calcula mediante la sustraccin de 1 a la longitud (cantidad
total de elementos) del array. En este ejemplo el ltimo elemento se encuentra en la
posicin [4] ya que tenemos un total de cinco elementos en el array.
Introduccin 3/5
Los arrays pueden facilitar mucho la programacin. Si bien su uso no es obligatorio,
son estructuras valiosas y eficaces para la administracin de datos.
A continuacin veremos, en un ejemplo concreto de aplicacin, algunos de los
beneficios de utilizar arrays en lugar de un gran nmero de variables:
Partimos de un conjunto de datos que determinan las coordenadas de posicin de
los vrtices que dibujan una figura estrella.
La estrella est conformada por 10 puntos vrtice, cada uno con 2 valores (pos. x e
y). Si quisieramos utilizar variables deberamos declarar 20 variables, cantidad
bastante considerable.
Introduccin 4/5
Si utilizsemos arrays, existen dos maneras de resolverlo: implementar 10 arrays
que integren los valores de las coordenadas xy para cada punto, o bien implementar
2 arrays que integren todos los valores de los puntos para cada eje (x e y).
Introduccin 5/5
Si bien el cdigo en el medio mejora notablemente la situacin, es posible optimizarlo
an ms. El cdigo en la derecha muestra cmo los elementos de datos pueden ser
agrupados de manera lgica en 2 arrays, uno para la abscisa y el otro para la
ordenada.
A continuacin veremos cmo es posible implementar el ejemplo y cmo acceder a
cada valor de los arrays mediante el uso de una estructura for:
void setup() {
int[] x = {50, 61, 83, 69, 71, 50, 29, 31, 17, 39};
int[] y = {18, 37, 43, 60, 82, 73, 82, 60, 43, 37};
beginShape();
// Lee un elemento de cada array por vez mediante el for()
for (int i = 0; i < x.length; i++) {
vertex(x[i], y[i]);
}
endShape(CLOSE);
}
// Declaracin
void setup() {
datos = new int[5]; // Creacin
datos[0] = 19;
// Asignacin
datos[1] = 40;
datos[2] = 75;
datos[3] = 76;
datos[4] = 90;
println(datos[1]);
}
int[] datos = {19, 40, 75, 76, 90};
// Asignacin
void setup() {
println(datos[1]);
}
Estos tres ejemplos asumen que los tres arrays estn siendo usados junto a
estructuras setup() y draw().
}
float y = i * offset; // Determina la posicin-y de la lnea
line(x[i], y, x[i]+offset, y+offset); // Dibuja la lnea
}
}
void draw() {
background(0);
// Desplaza los valores a la derecha
for (int i = num-1; i > 0; i--) {
x[i] = x[i-1];
y[i] = y[i-1];
}
void setup() {
size(100, 100);
noStroke();
smooth();
fill(255, 102);
}
void draw() {
background(0);
x[indicePosicion] = mouseX;
y[indicePosicion] = mouseY;
void setup() {
size(100, 100);
noStroke();
smooth();
fill(255, 102);
}
Funciones de array
Processing provee un grupo de funciones que permiten asistir en la gestin de los
arrays:
append()
shorten()
expand()
arrayCopy()
concat()
subset()
sort()
reverse()
splice()
arrayCopy(arrayOrigen, arrayDestino)
arrayCopy(arrayOrigen, arrayDestino, cantElementosACopiar)
arrayCopy(arrayOrigen, arrayOrigenPos, arrayDestino, arrayDestinoPos,
cantElementosACopiar)
Un array 2D es esencialmente una lista de arrays 1D. Debe ser primero declarado,
luego creado, y por ltimo asignado tal como un array 1D. A continuacin el cdigo:
int[][] puntos = { {50,18}, {61,37}, {83,43}, {69,60}, {71,82},
{50,73}, {29,82}, {31,60}, {17,43}, {39,37} };
println(puntos[4][0]); // Imprime "71"
println(puntos[4][1]); // Imprime "82"
println(puntos[4][2]); // ERROR! Este elemento se encuentra fuera de
rango
println(puntos[0][0]); // Imprime "50"
println(puntos[9][1]); // Imprime "37"
println(puntos[1]);
// Imprime "61" y "37"
Lectura recomendada
Captulo Data 4: Arrays (pag. 301).
Parte 17
Objetos
Introduccin 1/2
El paradigma planteado por la programacin estructurada tradicional define las variables (datos)
y las funciones (procedimientos) como los bloques bsicos de construccin. Distintas funciones
sern frecuentemente usadas en conjunto para trabajar sobre una serie determinada de
variables.
La programacin orientada a objetos (POO) fue desarrollada para hacer ms explcito este
proceso.
La POO utiliza clases y objetos como bloques bsicos de construccin.
Una clase define un grupo de mtodos (funciones) y campos (variables).
Un objeto es una nica instancia de una clase.
Los campos dentro de un objeto se acceden, tpicamente, slo a travs de sus propios mtodos,
permitiendo a un objeto ocultar su complejidad de otras partes del programa.
Introduccin 2/2
La POO difiere de la programacin estructurada tradicional, en la que los datos y los
procedimientos estn separados y sin relacin, ya que lo nico que se busca es el
procesamiento de unos datos de entrada para obtener otros de salida.
La programacin estructurada anima al programador a pensar sobre todo en
trminos de procedimientos o funciones, y en segundo lugar en las estructuras de
datos que esos procedimientos manejan.
En la programacin estructurada slo se escriben funciones que procesan datos. Los
programadores que emplean POO, en cambio, primero definen objetos para luego
enviarles mensajes solicitndoles que realicen sus mtodos por s mismos.
Programacin estructurada
Variable
Campo
Funcin
Mtodo
POO 1/3
Un programa modular est compuesto de mdulos de cdigo los cuales realizan,
cada uno, una tarea especfica.
El uso de variables es un medio fundamental para estudiar la reutilizacin de
elementos dentro de un programa. Permite que un determinado valor aparezca las
veces que se necesite dentro de un programa y que sea fcilmente cambiado.
Las funciones resumen una tarea especfica y permiten que bloques de cdigo sean
usados en todo el programa. Tpicamente, uno se concentra slo en qu es lo que la
funcin hace, no en cmo esta trabaja.
Todo esto permite que la mente se concentre en los objetivos del programa antes
que en las complejidades de la infraestructura.
POO 2/3
La programacin orientada a objetos ampla an ms la modularidad -el uso de
variables y escritura de funciones- al permitir la agrupacin de funciones
relacionadas.
Podemos asociar los objetos de la POO con artefactos concretos:
Clase
Manzana
Mariposa
Campo
color, peso
especie, genero
Mtodo
vatirAlas(), tomarTierra()
Clase
Radio
Auto
Campo
frecuencia, volumen
Mtodo
POO 3/3
Los objetos son creados a partir de una clase, y una clase describe un conjunto de
campos y mtodos.
Una instancia de una clase debe tener un nombre nico. Si ms de un objeto es
creado a partir de una clase, cada uno debe tener un nombre nico. Por ejemplo de
la clase Manzana podemos crear dos objetos con sus correspondientes valores de
campos:
Objeto
deliciosa
grannySmith
Campos
color: rojo
color: amarillo
peso: 200
peso: 230
float
float
diametro
En el prximo ejemplo veremos cmo aplicar la POO en el cdigo: moveremos los campos que pertenecen al
crculo a su propia clase.
El objeto circ es construido dentro de setup(), permitiendo as el acceso a sus campos. En las tres lneas
siguientes se asignan valores a los campos dentro de Circulo.
Se accede a estos valores dentro de draw() para determinar la posicin y el tamao del crculo.
El operador punto (.) se usa para asignar setup()- y acceder draw()- a las variables de la clase.
Circulo circ;
// Declaracin del objeto
void setup() {
size(100, 100);
smooth();
noStroke();
circ = new Circulo(); // Construccin del objeto
circ.x = 33;
// Asigna 33 al campo x
circ.y = 50;
// Asigna 50 al campo y
circ.diametro = 30;
// Asigna 30 al campo diametro
}
void draw() {
background(0);
ellipse(circ.x, circ.y, circ.diametro, circ.diametro); //Accede a los campos
}
class Circulo {
float x, y;
// Coordenadas xy
float diametro;
// Dimetro del crculo
}
La clase Circulo que hemos declarado no es muy til por el momento, sin embargo es un inicio. El prximo
ejemplo se construye sobre el anterior y agrega un mtodo a dicha clase.
El mtodo mostrar() ha sido agregado a la definicin de la clase para dibujar la figura en la pantalla.
La ltima lnea en draw() ejecuta el mtodo mostrar() delegado al objeto circ al escribir los nombres del
objeto y del mtodo conectados por un operador punto (.).
Note tambin que no se usa el nombre del objeto para acceder a los campos. Esto sucede as porque que la
funcin ellipse() se llama desde dentro de la clase Circulo. Ya que esta lnea es parte del mtodo
mostrar(), este puede acceder a sus propias variables sin especificar su propio nombre.
Circulo circ ;
void setup() {
size(100, 100);
smooth();
noStroke();
circ = new Circulo();
circ.x = 33;
circ.y = 50;
circ.diametro = 30;
}
void draw() {
background(0);
circ.mostrar();
}
class Circulo {
float x, y, diametro;
void mostrar() {
ellipse(x, y, diametro, diametro);
}
}
// Campos
// Mtodo
void setup() {
size(100, 100);
smooth();
noStroke();
circ = new Circulo(33, 50, 30);
}
void draw() {
background(0);
circ.mostrar();
}
class Circulo {
float x, y, diametro;
Circulo(float xpos, float ypos,
x = xpos;
// Asigna 33
y = ypos;
// Asigna 50
diametro = diam; // Asigna 30
}
// Campos
float diam) { // Constructor
a x
a y
a diametro
void mostrar() {
ellipse(x, y, diametro, diametro);
}
}
// Mtodo
void setup() {
size(100, 100);
smooth();
// Entradas: coord-x, coord-y, factor de balanceo y altura
humpty = new Huevo(50, 100, 8, 80); // Construccin del objeto
}
void draw() {
background(0);
humpty.balancear();
humpty.mostrar();
}
class Huevo {
// Campos
float
float
float
float
float
x, y;
inclinacion;
balanceo;
angulo;
altura;
//
//
//
//
//
coords-xy
Offset ngulo izquierda y derecha
Factor de balanceo
ngulo de balanceo
Altura del huevo
// Constructor
Huevo(int xpos, int ypos, float balFactor, float h) {
x = xpos;
y = ypos;
balanceo = balFactor;
altura = h / 100.0;
}
// *** contina ***
Ejercicio 16
Utilizar clases.
Lectura recomendada
Captulo Structure 4: Objects I (pag. 395).
Parte 18
Arrays de objetos
Introduccin
El trabajo con arrays de objetos es similar al trabajo con arrays de otros tipos de dato.
Como todo array, un array de objetos se distingue de cualquier objeto gracias a los corchetes.
Ya que cada elemento de array es un objeto, cada elemento del array debe ser creado antes de
que pueda ser accedido.
Los pasos para el trabajo con un array de objetos son los siguientes:
1. Declaracin del array
2. Creacin del array
3. Creacin de cada objeto del array
Veamos cmo se implementa en los prximos dos ejemplos:
Ejemplo 1 1/2
int numCirc = 6;
// Declaracin y creacin del array
Circulo[] circulos = new Circulo[numCirc];
void setup() {
size(100, 100);
smooth();
noStroke();
for (int i = 0; i < circulos.length; i++) {
float x = 10 + i*16;
float rate = 0.5 + i*0.05;
// Creacin de cada objeto del array
circulos[i] = new Circulo(x, 50, 16, rate);
}
}
void draw() {
fill(0, 12);
rect(0, 0, width, height);
fill(255);
for (int i = 0; i < circulos.length; i++) {
circulos[i].mover(); // Move each object
circulos[i].mostrar(); // Display each object
}
}
// *** contina ***
Ejemplo 1 2/2
class Circulo {
// Campos
float x, y, diametro;
float velocidad;
// Distancia movida en cada cuadro
int direccion = 1; // Direccin del movimiento (1 hacia abajo, -1
hacia arriba)
// Constructor
Circulo(float xpos, float ypos, float diam, float vel) {
x = xpos;
y = ypos;
diametro = diam;
velocidad = vel;
}
// Mtodos
void mover() {
y += (velocidad * direccion);
if ((y > (height - diametro/2)) || (y < diametro/2)) {
direccion *= -1;
}
}
void mostrar() {
ellipse(x, y, diametro, diametro);
}
}
// *** contina ***
Ejemplo 2 1/2
Anillo[] anillos;
Ejemplo 2 2/2
class Anillo {
float x, y;
// Coordenadas-xy
float diametro;
// Dimetro del anillo
boolean on = false; // Enciende o apaga la visualizacin
void iniciar(float xpos, float ypos) {
x = xpos;
y = ypos;
on = true;
diametro = 1;
}
void crecer() {
if (on == true) {
diametro += 0.5;
if (diametro > 400) {
on = false;
}
}
}
void mostrar() {
if (on == true) {
noFill();
strokeWeight(4);
stroke(155, 153);
ellipse(x, y, diametro, diametro);
}
}
}
Multiples archivos
Cuando un programa crece de sobremanera resulta ms conveniente dividirlo y separarlo en
mltiples archivos.
Esta prctica tambin es aconsejada cuando se desea reusar clases en otros programas.
Para realizar esto se recomienda primero guardar el cuerpo principal del programa en un archivo,
por ejemplo, anillos-main, y luego hacer clic en el botn del extremo derecho, en el sector de
lengetas.
Lectura recomendada
Captulo Structure 4: Objects I (pag. 395).
Parte 19
Objetos II
Herencia
Una clase puede ser definida usando otra clase como fundamento. En trminos de POO, una
clase puede heredar campos o mtodos de otra.
Un objeto que hereda de otro (heredero) es llamado subclase, mientras que el objeto del cual se
hereda (antecesor) es llamado superclase.
Una subclase extiende las capacidades de una superclase. Cuando una clase extiende a otra,
todos los campos y mtodos de la superclase resultan automticamente incluidos en la subclase.
Cuando se define la subclase se utiliza la palabra clave extends antecediendo el nombre de la
superclase.
Se puede agregar nuevos campos y mtodos a la subclase para poder trabajar sobre los datos y
los comportamientos de la superclase.
Si un nombre de mtodo es repetido dentro de la subclase, y adems tiene el mismo prototipo
(mismo nmero de parmetros y mismo tipo de datos) que el presente en la superclase, el
mtodo de la subclase anula el de la superclase, por lo tanto lo reemplaza.
Cuando un campo o mtodo de la superclase es llamado desde la subclase, el nombre es
antecedido por la palabra clave super para hacer saber a Processing que dicho campo o
mtodo es parte de la superclase.
El siguiente ejemplo refleja estos nuevos trminos y conceptos:
Herencia
Ejemplo (Giro: superclase)
class Giro {
float x, y, velocidad;
float angulo = 0.0;
Giro(float xpos, float ypos, float vel) {
x = xpos;
y = ypos;
velocidad = vel;
}
void actualizar() {
angulo += velocidad;
}
}
Herencia
Ejemplo (GiroLinea: subclase)
class GiroLinea extends Giro {
GiroLinea(float x, float y, float v) {
super(x, y, v);
}
void mostrar() {
strokeWeight(1);
stroke(0);
pushMatrix();
translate(x, y);
angulo += velocidad;
rotate(angulo);
line(0, 0, 100, 0);
popMatrix();
}
}
Herencia
Ejemplo (GiroCirculos: subclase)
class GiroCirculos extends Giro {
float dimen;
GiroCirculos(float x, float y, float v, float d) {
super(x, y, v);
dimen = d;
}
void mostrar() {
noStroke();
pushMatrix();
translate(x, y);
angulo += velocidad;
rotate(angulo);
ellipse(-dimen/2, 0, dimen, dimen);
ellipse(dimen/2, 0, dimen, dimen);
popMatrix();
}
}
Herencia
Ejemplo (animacion: main)
GiroCirculos circulos;
GiroLinea linea;
void setup() {
size(100, 100);
smooth();
linea = new GiroLinea(width/2, height/2, 0.01);
circulos = new GiroCirculos(width/2, height/2, -0.02, 33.0);
}
void draw() {
background(204);
linea.actualizar();
linea.mostrar();
circulos.actualizar();
circulos.mostrar();
}
Lectura recomendada
Captulo Structure 5: Objects II (pag. 453).
Parte 20
ArrayList
ArrayList
La clase Java ArrayList permite implementar arrays de tamao flexible, donde es
posible agregar o remover elementos del principio, mitad o final del array.
El uso de un ArrayList conceptualmente es similar al de un array estandar, pero lo
que difiere es la sintxis.
El siguiente ejemplo muestra el uso de ArrayList para crear una aplicacin que
genera un emisor de partculas.
Cada vez que presionamos el botn del mouse, la aplicacin genera una partcula en
cada fotograma mientras dure la presin del mouse.
ArrayList
Ejemplo (ArrayList: main)
//
//
//
//
Learning Processing
Daniel Shiffman
http://www.learningprocessing.com
Ejemplo 23-2: Sistema de partculas simple con ArrayList
ArrayList particulas;
void setup() {
size(200,200);
particulas = new ArrayList();
smooth();
}
void draw() {
// Cuando el botn del mouse es presionado, se agrega un nuevo
// objeto Particula al ArrayList en cada ciclo del draw().
if (mousePressed) {
particulas.add(new Particula());
}
background(255);
// Iteracin a travs del ArrayList y obtiene cada partcula.
// ArrayList mantiene un seguimiento del nmero total de partculas.
for (int i = 0; i < particulas.size(); i++ ) {
Particula p = (Particula) particulas.get(i);
p.ejecutar();
p.gravedad();
p.mostrar();
}
// Si ArrayList contiene ms de 100 elementos, eliminamos
// el primer elemento usando el mtodo remove().
if (particulas.size() > 100) {
particulas.remove(0);
}
}
ArrayList
Ejemplo (Particula: clase)
// Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com
// Ejemplo 23-2: Sistema de partculas simple con ArrayList
// Una clase de Partcula simple
class Particula {
float
float
float
float
x;
y;
xVelocidad;
yVelocidad;
Particula() {
x = mouseX;
y = mouseY;
xVelocidad = random(-1,1);
yVelocidad = random(-2,0);
}
void ejecutar() {
x = x + xVelocidad;
y = y + yVelocidad;
}
void gravedad() {
yVelocidad += 0.1;
}
void mostrar() {
stroke(0);
fill(0,75);
ellipse(x,y,10,10);
}
}
Lectura recomendada
Captulo 23 Java (pag. 423).
Shiffman, D. Learning Processing - A Beginners Guide to
Programming Images, Animation, and Interaction, Morgan Kaufman,
2008.
Ej 17
EJ17: Crear una superficie sensible a datos de entrada (mouse y/o teclado)
cuya programacin haga uso de las tcnicas, procedimientos y estructuras
aprendidas durante el curso.
FIN