<< Chapter < Page Chapter >> Page >
Per una introduzione alla sintassi Java si veda Java Syntax Primer

Con il metodo draw() seguente si vuole dipingere lo sfondo della finestra di un grigio la cui intensità dipenda dalla posizione orizzontaledel puntatore del mouse. void draw() { background((mouseX/100)*255);} Il codice però non fa quello che ci si aspetta. Perché?

La variabile 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 .

Cosa stampa il seguente frammento di codice? 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 87 7

Il seguente sketch si pone l'obbiettivo di generare un set di 100 cerchi in movimento edi disegnare nella finestra di Processing tutte le corde congiungenti i due punti di intersezione di tutte le coppiedi cerchi a intersezione non nulla. /* 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); }

  • Completare la parte mancante inerente il calcolo delle intersezioni dei cerchi, per poter disegnare lecorde congiungenti le coppie di punti intersezione. E' possibile basarsi sul calcolo delle coordinate delleintersezioni in un sistema di riferimento ad hoc ( “Intersezione cerchio-cerchio” ) e poi riportare il risultato nelle coordinate della finestradi Processing.
  • Rendere le corde variabili nel tempo dando diverse velocità di spostamento ai cerchi.

/* 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); }

Rendere interattivo lo sketch di , facendo per esempio dipendere la quantità di spostamento dei cerchi dallaposizione lungo l'asse x del mouse.

/* 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); }

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Programmazione di artefatti interattivi. OpenStax CNX. Dec 09, 2010 Download for free at http://cnx.org/content/col10417/1.9
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?

Ask