Summary: Lezione introduttiva sulla utilizzazione del linguaggio e ambiente Processing per l'insegnamento dell'elaborazione di media e dell'interaction design.
| Modi di Programmazione | ||||
| Basic | - | Sequenza di comandi per il
disegno di primitive grafiche --
| ||
| Intermediate | - | Programmazione procedurale --
| ||
| Complex | - | Programmazione Orientata agli
Oggetti (Java) --
| ||
applet:
int, float, ecc.) oppure
ad oggetti o array (tabelle di elementi di un tipo primitivo). b = a produce
a in
b.int[] arrayDiInteri = new int[10];
if (i == NMAX) {
println("finito");
}
else {
i++;
}
int i = 0; //contatore intero
while (i < 10) { //scrivi i numeri da 0 a 9
println("i = "+ i);
i++;
}
for (int i = 0; i < 10; i++) { //scrivi i numeri da 0 a 9
println("i = "+ i);
}
int MAX = 10;
float[] tabella = new float[MAX];
for (int i = 0; i < MAX; i++)
tabella[i] = random(1); //random numbers between 0 and 1
println(tabella.length + " elementi:");
println(tabella);
setup() e
draw(), usabili all'interno della
setup() e della draw().
int raddoppia(int i) {
return 2*i;
}
int)raddoppia)i)return 2*i)
Dot myDot;
void setup() {
size(300,20);
colorMode(RGB,255,255,255,100);
color tempcolor = color(255,0,0);
myDot = new Dot(tempcolor,0);
}
void draw() {
background(0);
myDot.draw(10);
}
class Dot
{
color colore;
int posizione;
//****CONSTRUCTOR*****//
Dot(color c_, int xp) {
colore = c_;
posizione = xp;
}
void draw (int ypos) {
rectMode(CENTER);
fill(colore);
rect(posizione,ypos,20,10);
}
}
Dot)colore, posizione)Dot())draw())Dot myDot;)myDot = new Dot(tempcolor,0))myDot.draw(10);)draw()
seguente si vuole dipingere lo sfondo della finestra di un
grigio la cui intensità dipenda dalla posizione orizzontale
del puntatore del mouse.
void draw() {
background((mouseX/100)*255);
}
Il codice però non fa quello che ci
si aspetta. Perché?
mouseX è di
tipo int, e quindi la divisione a cui è
sottoposta è di tipo intero. E' necessario fare un type
casting da int a float
mediante (float)mouseX. int[] a = new int[10]; a[7] = 7; int[] b = a; println(b[7]); b[7] = 8; println(a[7]); int c = 7; int d = c; println(d); d = 8; println(c);
7 8 7 7
/*
Structure 3
A surface filled with one hundred medium to small sized circles.
Each circle has a different size and direction, but moves at the same slow rate.
Display:
A. The instantaneous intersections of the circles
B. The aggregate intersections of the circles
Implemented by Casey Reas <http://groupc.net>
8 March 2004
Processing v.68 <http://processing.org>
modified by Pietro Polotti
28 March, 2006
Processing v.107 <http://processing.org>
*/
int numCircle = 100;
Circle[] circles = new Circle[numCircle];
void setup()
{
size(800, 600);
frameRate(50);
for(int i=0; i<numCircle; i++) {
circles[i] = new Circle(random(width),
(float)height/(float)numCircle * i,
int(random(2, 6))*10, random(-0.25, 0.25),
random(-0.25, 0.25), i);
}
ellipseMode(CENTER_RADIUS);
background(255);
}
void draw()
{
background(255);
stroke(0);
for(int i=0; i<numCircle; i++) {
circles[i].update();
}
for(int i=0; i<numCircle; i++) {
circles[i].move();
}
for(int i=0; i<numCircle; i++) {
circles[i].makepoint();
}
noFill();
}
class Circle
{
float x, y, r, r2, sp, ysp;
int id;
Circle( float px, float py, float pr, float psp, float pysp, int pid ) {
x = px;
y = py;
r = pr;
r2 = r*r;
id = pid;
sp = psp;
ysp = pysp;
}
void update() {
for(int i=0; i<numCircle; i++) {
if(i != id) {
intersect( this, circles[i] );
}
}
}
void makepoint() {
stroke(0);
point(x, y);
}
void move() {
x += sp;
y += ysp;
if(sp > 0) {
if(x > width+r) {
x = -r;
}
} else {
if(x < -r) {
x = width+r;
}
}
if(ysp > 0) {
if(y > height+r) {
y = -r;
}
} else {
if(y < -r) {
y = height+r;
}
}
}
}
void intersect( Circle cA, Circle cB )
{
float dx = cA.x - cB.x;
float dy = cA.y - cB.y;
float d2 = dx*dx + dy*dy;
float d = sqrt( d2 );
if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) {
return; // no solution
}
// calculate the two intersections between the two circles cA and cB, //
// whose coordinates are (paX, paY) and (pbX, pbY), respectively. //
stroke(255-dist(paX, paY, pbX, pbY)*4);
line(paX, paY, pbX, pbY);
}
/*
Structure 3
A surface filled with one hundred medium to small sized circles.
Each circle has a different size and direction, but moves at the same slow rate.
Display:
A. The instantaneous intersections of the circles
B. The aggregate intersections of the circles
Implemented by Casey Reas <http://groupc.net>
8 March 2004
Processing v.68 <http://processing.org>
modified by Pietro Polotti
28 March, 2006
Processing v.107 <http://processing.org>
*/
int numCircle = 100;
Circle[] circles = new Circle[numCircle];
void setup()
{
size(800, 600);
frameRate(50);
for(int i=0; i<numCircle; i++) {
circles[i] = new Circle(random(width),
(float)height/(float)numCircle * i,
int(random(2, 6))*10, random(-0.25, 0.25),
random(-0.25, 0.25), i);
}
ellipseMode(CENTER_RADIUS);
background(255);
}
void draw()
{
background(255);
stroke(0);
for(int i=0; i<numCircle; i++) {
circles[i].update();
}
for(int i=0; i<numCircle; i++) {
circles[i].move();
}
for(int i=0; i<numCircle; i++) {
circles[i].makepoint();
}
noFill();
}
class Circle
{
float x, y, r, r2, sp, ysp;
int id;
Circle( float px, float py, float pr, float psp, float pysp, int pid ) {
x = px;
y = py;
r = pr;
r2 = r*r;
id = pid;
sp = psp;
ysp = pysp;
}
void update() {
for(int i=0; i<numCircle; i++) {
if(i != id) {
intersect( this, circles[i] );
}
}
}
void makepoint() {
stroke(0);
point(x, y);
}
void move() {
x += sp;
y += ysp;
if(sp > 0) {
if(x > width+r) {
x = -r;
}
} else {
if(x < -r) {
x = width+r;
}
}
if(ysp > 0) {
if(y > height+r) {
y = -r;
}
} else {
if(y < -r) {
y = height+r;
}
}
}
}
void intersect( Circle cA, Circle cB )
{
float dx = cA.x - cB.x;
float dy = cA.y - cB.y;
float d2 = dx*dx + dy*dy;
float d = sqrt( d2 );
if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) {
return; // no solution
}
float a = (cA.r2 - cB.r2 + d2) / (2*d);
float h = sqrt( cA.r2 - a*a );
float x2 = cA.x + a*(cB.x - cA.x)/d;
float y2 = cA.y + a*(cB.y - cA.y)/d;
float paX = x2 + h*(cB.y - cA.y)/d;
float paY = y2 - h*(cB.x - cA.x)/d;
float pbX = x2 - h*(cB.y - cA.y)/d;
float pbY = y2 + h*(cB.x - cA.x)/d;
stroke(255-dist(paX, paY, pbX, pbY)*4);
line(paX, paY, pbX, pbY);
}
/*
Structure 3
A surface filled with one hundred medium to small sized circles.
Each circle has a different size and direction, but moves at the same slow rate.
Display:
A. The instantaneous intersections of the circles
B. The aggregate intersections of the circles
Implemented by Casey Reas <http://groupc.net>
8 March 2004
Processing v.68 <http://processing.org>
modified by Pietro Polotti
28 March, 2006
Processing v.107 <http://processing.org>
*/
int numCircle = 100;
Circle[] circles = new Circle[numCircle];
void setup()
{
size(800, 600);
frameRate(50);
for(int i=0; i<numCircle; i++) {
circles[i] = new Circle(random(width),
(float)height/(float)numCircle * i,
int(random(2, 6))*10, random(-0.25, 0.25),
random(-0.25, 0.25), i);
}
ellipseMode(CENTER_RADIUS);
background(255);
}
void draw()
{
background(255);
stroke(0);
if(mousePressed){
for(int i=0; i<numCircle; i++) {
circles[i].sp = mouseX*random(-5, 5)/width;
}
}
for(int i=0; i<numCircle; i++) {
circles[i].update();
}
for(int i=0; i<numCircle; i++) {
circles[i].move();
}
for(int i=0; i<numCircle; i++) {
circles[i].makepoint();
}
noFill();
}
class Circle
{
float x, y, r, r2, sp, ysp;
int id;
Circle( float px, float py, float pr, float psp, float pysp, int pid ) {
x = px;
y = py;
r = pr;
r2 = r*r;
id = pid;
sp = psp;
ysp = pysp;
}
void update() {
for(int i=0; i<numCircle; i++) {
if(i != id) {
intersect( this, circles[i] );
}
}
}
void makepoint() {
stroke(0);
point(x, y);
}
void move() {
x += sp;
y += ysp;
if(sp > 0) {
if(x > width+r) {
x = -r;
}
} else {
if(x < -r) {
x = width+r;
}
}
if(ysp > 0) {
if(y > height+r) {
y = -r;
}
} else {
if(y < -r) {
y = height+r;
}
}
}
}
void intersect( Circle cA, Circle cB )
{
float dx = cA.x - cB.x;
float dy = cA.y - cB.y;
float d2 = dx*dx + dy*dy;
float d = sqrt( d2 );
if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) {
return; // no solution
}
float a = (cA.r2 - cB.r2 + d2) / (2*d);
float h = sqrt( cA.r2 - a*a );
float x2 = cA.x + a*(cB.x - cA.x)/d;
float y2 = cA.y + a*(cB.y - cA.y)/d;
float paX = x2 + h*(cB.y - cA.y)/d;
float paY = y2 - h*(cB.x - cA.x)/d;
float pbX = x2 - h*(cB.y - cA.y)/d;
float pbY = y2 + h*(cB.x - cA.x)/d;
stroke(255-dist(paX, paY, pbX, pbY)*4);
line(paX, paY, pbX, pbY);
}
Comments, questions, feedback, criticisms?