APPLICAZIONI
Sanguisughe solide


Mouse
ricomincia

Si evitano: quando avviene un incontro ravvicinato appare un cerchio azzurro.
 
Codice
int NUM=30,  // worm length
    DIM=8,   // max speed
    TOT=8,
    DIST;

Worm[] W=new Worm[TOT];

void setup()
{
  size(360, 240);
  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();
  }
}
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki