Le sanguisughe si evitano, se troppo vicine
- Mouse: ricomincia
- Applicazione Java
int NUM=30, // worm length DIM=8, // max speed TOT=16, DIST; Worm[] W=new Worm[TOT]; void setup() { size(500, 350); noStroke(); smooth(); frameRate(30); for(int i=0; i < TOT; i++) W[i]=new Worm(); } void mousePressed() { for(int i=0; i < TOT; i++) W[i]=new Worm(); } void draw() { background(0); for(int i=NUM-1; i >= 0; i--) { for(int j=0; j < TOT; j++) W[j].disegna(i); } for(int j=0; j < TOT; j++) W[j].aggiorna(j); } class Disco { float xpos, ypos; float raggio, raggio2; color colore; Disco(float xp, float yp, float ra, color co) { xpos=xp; ypos=yp; raggio=ra; colore=co; raggio2=raggio/2; } void limita() { xpos=min(xpos+raggio2, width-1); xpos=max(xpos-raggio2, raggio2+1); ypos=min(ypos+raggio2, height-1); ypos=max(ypos-raggio2, raggio2+1); } float distanza(Disco D) { return sqrt((xpos-D.xpos)*(xpos-D.xpos)+(ypos-D.ypos)*(ypos-D.ypos)); } void draw() { fill(colore); ellipse(xpos, ypos, raggio, raggio); } void draw2() { fill(color(0, 255, 255)); ellipse(xpos, ypos, raggio, raggio); } } // .................................................................... class Worm { Disco[] D=new Disco[NUM]; Worm() { for(int i=0; i < NUM; i++) D[i]=new Disco(width/2, height/2, i+10, color(255-6*i, 255-6*i, 6*i)); } Worm(int x) { for(int i=0; i < NUM; i++) D[i]=new Disco(DIST*(x+1), (x%2+5)*height/11, i+10, color(255-6*i, 255-6*i, 6*i)); } float distanza(Worm WW) { return D[0].distanza(WW.D[0]); } /* void aggiorna() { D[0].xpos+=random(-DIM, DIM); D[0].ypos+=random(-DIM, DIM); D[0].limita(); for(int i=1; i < NUM; i++) { D[i].xpos=(D[i-1].xpos+D[i].xpos)/2; D[i].ypos=(D[i-1].ypos+D[i].ypos)/2; D[i].limita(); } } */ void aggiorna(int x) { float oldX=D[0].xpos; float oldY=D[0].ypos; D[0].xpos+=random(-DIM, DIM); D[0].ypos+=random(-DIM, DIM); D[0].limita(); boolean OK=true; for(int i=0; i < TOT; i++) if(i!=x && distanza(W[i]) < 1.1*D[0].raggio) { OK=false; accendi(); W[i].accendi(); break; } if(OK) { for(int i=1; i < NUM; i++) { D[i].xpos=(D[i-1].xpos+D[i].xpos)/2; D[i].ypos=(D[i-1].ypos+D[i].ypos)/2; D[i].limita(); } } else { D[0].xpos=oldX; D[0].ypos=oldY; } } void disegna() { for(int i=NUM-1; i >= 0; i--) D[i].draw(); } void disegna(int x) { D[x].draw(); } void accendi() { D[0].draw2(); } }