•
Introduzione a Processing
Roberto Ranon
www.dimi.uniud.it/ranon/processing.html
1
Processing è, insieme, un ambiente e linguaggio di
programmazione per creare immagini, animazioni,
prodotti multimediali interattivi
•
open source e gratuito*
•
per GNU/Linux, Mac OS X, e Windows
•
creato nel 2001 al MIT Media Lab, oggi utilizzato da
migliaia di persone
•
basato su Java
* processing.org/download/
2
Video Musicale per “The Nest That Sailed The Sky” di Peter Gabriel
realizzato con Processing da Glenn Marshall
https://vimeo.com/3245120
Good Morning! di blprnt
Una visualizzazione di 11,000 tweet raccolti nell’arco di 24 ore e contenenti le parole
“good morning”
3
4
modalità di output (programma Java)
programma (sketch) in
esecuzione
editor di codice processing
console
Good Morning! di blprnt
Una visualizzazione di 11,000 tweet raccolti nell’arco di 24 ore e contenenti le parole
“good morning”
5
Processing Development Environment (PDE)
6
•
•
i programmi Processing si chiamano sketch, e sono
composti da:
•
una cartella su disco, col nome dello sketch,
contenente …
•
… un file .pde, col nome dello sketch
•
eventualmente, altri file .pde e altre risorse
all’interno della cartella
Forme e Colori
i programmi possono essere esportati come
applicazioni o pagine Web*
* con alcune limitazioni
7
8
Pixels
5
1.2 Simple Shapes
The vast majority of the programming examples in this book will be visual in nature. You may ultimately
learn to develop interactive games, algorithmic art pieces, animated logo designs, and (insert your own
category here) with Processing, but at its core, each visual program will involve setting pixels. The simplest
way to get started in understanding how this works is to learn to draw primitive shapes. This is not unlike
how we learn to draw in elementary school, only here we do so with code instead of crayons.
Let’s start with the four primitive shapes shown in Figure 1.4.
•
L’ordine delle istruzioni è, ovviamente, importante!
rect è una delle istruzioni che disegnano
•
Point
Line
Rectangle
gli argomenti di questo
tipo
di istruzioni
sono, di solito,Ellipse
in pixel
fig. 1.4
For each shape,
wepixel
will ask
information isProcessing
required to èspecify
the location
and size (and
• ogni
nellaourselves
finestra what
di un’applicazione
individuato
dalle sue
later color) ofcoordinate
that shape xand
e y:learn how Processing expects to receive that information. In each of the
diagrams below (Figures 1.5 through 1.11), assume a window with a width of 10 pixels and height of
10 pixels. This •isn’t
particularly
realistic
when we really start coding we will most likely work with
(0,0)
è il pixel in
alto a since
sinistra
much larger windows (10 ! 10 pixels is barely a few millimeters of screen space). Nevertheless for
(width-1,itheight-1)
il pixel
in smaller
basso anumbers
destra; width
e height
sonothe
variabili
demonstration• purposes,
is nice to èwork
with
in order
to present
pixels as they
sistema
might appear on di
graph
paper (for now) to better illustrate the inner workings of each line of code.
0
1
2
3
x-axis
4 5 6
7
8
9
0
1
2
3
4
y-axis
5
6
7
8
9
x
size(300,200);
rect(10,20,20,30);
ellipse(100,100,50,50);
rect(100,100,100,50);
y
Point (4,5);
9
fig. 1.5
A point is the easiest of the shapes and a good place to start. To draw a point, we only need an x and y
coordinate as shown in Figure 1.5. A line isn’t terribly difficult either. A line requires two points, as shown
in Figure 1.6.
0
1
2
0
1
2
3
4
y-axis
5
6
7
8
9
3
x-axis
4 5 6
7
8
9
Point B (8,3)
Point A
x y
Point B
x y
line (1,3,8,3);
Point A (1,3)
fig. 1.6
size(300,200);
rect(10,20,20,30);
rect(100,100,100,50);
ellipse(100,100,50,50);
10
line(x1, y1, x2, y2)
(x1,y1)
point(x, y)
(x2,y2)
(x,y)
point(x, y)
triangle(x1, y1, x2, y2, x3, y3)
point(x, y)
(x1,y1)
(x,y)
(x,y)
line(x1, y1, x2, y2)
(x1,y1)
(x2,y2) (x3,y3)
point(x, y)
(x2,y2)
line(x1, y1, x2,
y2)
(x1,y1)
(x1,y1)
(x1,y1) (x4,y4)
(x,y)
line(x1, y1, x2, y2)
quad(x1, y1, x2, y2, x3, y3, x4, y4)
triangle(x1,
y1, x2, y2, x3, y3)
(x2,y2)
(x2,y2)
(x1,y1)
(x2,y2) (x3,y3)
line(x1, y1, x2, y2)
point(x, y)
(x1,y1)
(x1,y1)
triangle(x1,
x2, y2, x3, y3)
(x2,y2)y1,
(x3,y3)
(x,y)
triangle(x1, y1, x2, y2, x3, y3)
rect(x, y, width, height)
•
(x1,y1)
(x,y)
(x2,y2)
(x1,y1) (x4,y4)
height
quad(x1,
x2, y2, x3, y3, x4, y4)
(x2,y2) y1,
(x3,y3)
colori:
•
point(x,y)
•
line(x1,y1,x2,y2)
line(x1, y1, x2, y2)
(x1,y1)
(x2,y2)
quad(x1,
y1, (x3,y3)
x2, y2,
(x1,y1)
in scala di grigi: un valore in [0,255]
•
(x2,y2) (x3,y3)
width
•
triangle(x1,y1,x2,y2,x3,y3)
•
triangle(x1, y1, x2, y2,quad(x1,
x3, y3) y1, x2, y2, x3, y3, x4, y4)
(x1,y1) (x4,y4)
x3, y3, x4, y4)
ellipse(x, y, width, height)
(x1,y1) (x4,y4)
•
(x2,y2)
height
rect(x,
width,
(x2,y2) y,
(x3,y3)
(x2,y2) (x3,y3)
(x,y)
•
height)
//
//
//
//
Setting
Setting
Setting
Drawing
•
•
(x2,y2) (x3,y3)
width
height
(x2,y2) (x3,y3)
(x1,y1)
(cx1,cy1)
height
•
•
rect(x,y,width,height)
(x2,y2) (x3,y3)
ellipse(x, y, width, height)
rectMode(CORNER)
width
(x,y)
width
height
(x2,y2)
(cx2,cy2)
background to white
outline (stroke) to black
interior of a shape (fill) to grey rectangle
fill(127,0,0);
// Dark red
ellipse(40,20,16,16);
fill(255,200,200);
// Pink (pale red)
ellipse(60,20,16,16);
height
• in scala di grigi, o RGB,
quad(x1,
x2, y2, x3,rect(x,
y3, x4,y,y4)
width, height)
triangle(x1, y1, x2, y2,
x3, y3)y1,
(x,y)
(x1,y1) (x4,y4)
• fill(0,0,255);
quad(x1,y1,x2,y2,x3,y3,x4,y4)
ellipse(x,y,width,height)
// No fourth
(x1,y1)
rect(x,
y,
width,
height)
• rect(0,0,100,200);
x2, y2)
(x,y)
ellipseMode(CENTER)bezier(x1, y1, cx1, cy1, cx2, cy2,
width
the
the
the
the
RGB: three values in [0,255]
•
(x,y)
background(255);
stroke(0);
fill(150);
rect(50,50,75,100);
•
•
più alfa
argument means 100% opacity
fill(255,0,0,255); // 255 means 100% opacity
rect(0,0,200,40);
fill(255,0,0,191); // 75% opacity
rect(0,50,200,40);
11
12
rect(x,
y, y4)
width, height)
ellipse(x, y, width, height)
quad(x1, (x,y)
y1, x2, y2, x3,
y3, x4,
(x1,y1) (x4,y4)
ellipse(x, y, width, height)
width
height
(x,y)
height
(x2,y2) (x3,y3)
width
(x,y)
(x1,y1)
width
(x1,y1) (cx1,cy1)
height
ellipse(x, y, width, height)
bezier(x1, y1, cx1, cy1, cx2, cy2, x2, y2)
rect(x, y, width, height)
(x1,y1)
(cx1,cy1)
height
(x,y)
Geometry primitives
Processing has seven functions to assist in making simple shapes. These images show the format for each. Replace
bezier(x1, y1, cx1, cy1, cx2, cy2, x2, y2)
width
the parameters
with numbers to use them within a program. These functions are demonstrated in codes 2-04 to 2-22.
(cx1,cy1)
bezier(x1,
y1, cx1, cy1, cx2, cy2, x2, y2)
(x,y)
(x2,y2)
(cx2,cy2)
height
Reas_01_001-084.indd Sec2:28
width
width
(x2,y2)
(cx2,cy2)
Geometry primitives
Processing has sevenbezier(x1,
functions to assist
making
simple
show the format for each. Replace
y1, in
cx1,
cy1,
cx2,shapes.
cy2, These
x2, images
y2)
ellipse(x,
y,(cx1,cy1)
width,with
height)
(x1,y1)
the parameters
numbers to use them within a program. These functions are demonstrated in codes 2-04 to 2-22.
Geometry primitives
(x,y)
Processing has seven functions to assist in making simple shapes. These images show the format for each. Replace
height
Geometry primitives
the parameters with numbers to use them within a program. These functions are demonstrated in codes 2-04 to 2-22.
Processing has seven functions to assist in making simple shapes. These images show the format for each. Replace
(x2,y2)
(cx2,cy2)
5/23/07 1:20:34 PM
•
stroke(color), strokeWeight(width), nostroke()
•
•
fill(color), nofill()
•
•
controllano il colore con cui viene disegnato il
contorno delle figure, lo spessore (in pixel), e la
presenza del contorno
Animazioni e Interattività
controllano il colore con cui viene disegnato l’interno
delle figure, o la presenza dell’interno
importante: queste istruzioni impostano lo stato che
viene utilizzato per disegnare, che resta attivo finché
altre istruzioni lo modificheranno
13
14
int diam = 20;
void setup()
{
size(500,300);
}
void setup()
{
size(500,300);
background(180);
stroke(0);
strokeWeight(3);
fill(255,50); }
eseguito all’avvio del programma
void draw ()
{
ellipse( width/2, height/2, diam, diam);
}
void draw ()
{
// Displays the frame count to the Console
println("I'm drawing");
println(frameCount);
}
alternativa 1
void draw ()
{
if (diam < 500) diam++;
ellipse( width/2, height/2, diam, diam);
}
alternativa 2
void draw ()
{
background(180);
if (diam < 500) diam++;
ellipse( width/2, height/2, diam, diam);
}
alternativa 3
void draw ()
{
ellipse( mouseX, mouseY, diam, diam);
}
eseguito dopo setup(). Il codice all’interno di
draw() viene eseguito ciclicamente fino alla
chiusura del programma
15
16
•
•
un programma può essere una lista di istruzioni, o di
funzioni;
•
nel primo caso, le istruzioni vengono eseguite, e il
programma si ferma;
•
nel secondo case, possiamo scrivere un
programma interattivo tramite le due funzioni setup()
e draw()
Aspettatevi l’inaspettato
la sintassi, i tipi di dato di base, gli operatori, …
funzionano esattamente come in Java
17
18
void setup()
{
size(500,300);
background(180);
stroke(0);
strokeWeight(3);
}
void draw()
{
fill(random(0,255));
ellipse ( random( width), random( height ), random( 50 ), random( 50 )); }
Un po’ di fisica?
random(n) genera un numero casuale tra 0 e n (non incluso)
random(low, high) genera un numero casuale tra low e high (non incluso)
19
20
float xPos,yPos, xVel, yVel, yAcc;
float radius = 20;
void setup()
{
size(500,500);
fill(0);
xPos = width/2;
yPos = radius;
xVel = 2;
yVel = 0;
yAcc = 1;
}
Popolazioni
void draw()
{
background(255);
yVel = yVel + yAcc;
xPos = xPos + xVel;
yPos = yPos + yVel;
if (xPos < 0 || xPos > width )
xVel = -xVel;
if (yPos < 0 || yPos > height )
yVel = -yVel;
ellipse(xPos, yPos, radius, radius);
}
21
22
float[]
float[]
float[]
float[]
float[]
xPos
yPos
xVel
yVel
yAcc
=
=
=
=
=
new
new
new
new
new
float[100];
float[100];
float[100];
float[100];
float[100];
float radius = 20;
void setup()
{
size(500,500);
fill(0);
for (int i=0; i<100; i++)
{
xPos[i] = random(width);
yPos[i] = random(radius, height/2);
xVel[i] = random(-2,+2);
yVel[i] = 0;
yAcc[i] = 1;
}
}
void draw()
{
background(255);
for (int i=0; i<100; i++)
{
yVel[i] = yVel[i] + yAcc[i];
xPos[i] = xPos[i] + xVel[i];
yPos[i] = yPos[i] + yVel[i];
if (xPos[i] < 0 || xPos[i] > width )
xVel[i] = -xVel[i];
if (yPos[i] < 0 || yPos[i] > height )
yVel[i] = -yVel[i];
ellipse(xPos[i], yPos[i], radius, radius);
}
}
23
Processing Particle Study by Reza
24
Scarica

Introduzione a Processing