Crescita per diffusione con ostacoli

La crescita si ferma quando l’aggregato raggiunge il bordo.
Gli ostacoli deviano la crescita.

final float diametro=3;            
final float xx=0.5;
final color cFondo=color(255),
     	    cOstacolo=color(75, 0, 75);
final float cMin=0,
            cMax=200;

int     Xmin, Ymin,
	Xmax, Ymax,  
	X2, Y2,
	Xa, Ya,
	Xb, Yb;                  
color   cPianta, c;
float   rosso, verde, blu;
boolean rossoUP, bluUP;

void setup() 
{ 
  size(500, 500);
  smooth();
  strokeWeight(4);  

  // valori definitivi
  X2=width/2;
  Y2=height/2;
  Xmin=0;       Ymin=0;
  Xmax=width-1; Ymax=height-1;

  inizia();
} 

void mousePressed()
{
  inizia();
}

void inizia()
{ 
  background(cFondo);

  stroke(cOstacolo, 50);
  fill(cOstacolo);
  ellipse(0   , random(Ymin, Ymax), Xmax-25, Ymax);    
  ellipse(Xmax, random(Ymin, Ymax), Xmax-25, Ymax);    
  
  rosso=random(cMin, cMax);
  verde=125;
  blu=random(cMin, cMax);
  
  switch((int)random(4))
  {
	 case 0: bluUP=false; rossoUP=false; break;
	 case 1: bluUP=false; rossoUP=true;  break;
	 case 2: bluUP=true;  rossoUP=false; break;
	 case 3: bluUP=true;  rossoUP=true;  break;
  }

  nuovoColore();
  ellipse(X2, Y2, diametro, diametro);  

  loop();
}
 
void draw() 
{ 
   nuovoColore();
   daCapo();   
   do
   {
	  Xb=Xa;
	  Yb=Ya;
	  switch((int)random(4))
	  {
		  case 0: Xb=Xa-1; break;
		  case 1: Xb=Xa+1; break;
		  case 2: Yb=Ya-1; break; 
		  case 3: Yb=Ya+1; break;
	  }
	  c=get(Xb, Yb);    
	  if(c != cOstacolo)
	  {
		  Xa=Xb;
		  Ya=Yb;
	  }
   }
   while(c != cFondo);      
   
   ellipse(Xa, Ya, diametro, diametro);  
   
   if(Xa <= Xmin || Xa >= Xmax || Ya <= Ymin || Ya >= Ymax)
	  noLoop();
} 

void daCapo()
{   
   Xa=X2;
   Ya=Y2;
}

void nuovoColore()
{
   switch((int)random(2))
   {
       case 0: if(rossoUP) { rosso+=xx; if(rosso >= cMax) rossoUP=false; }
               else        { rosso-=xx; if(rosso <= 0)    rossoUP=true;  } break; 
       case 1: if( bluUP)  { blu+=xx;   if( blu >= cMax)  bluUP=false;   }
               else        { blu-=xx;   if(  blu <= 0)    bluUP=true;    } break;
   }
   cPianta=color(rosso, verde, blu);
   stroke(cPianta, 50);     
   fill(cPianta);   
}