Albero di quadrati

L’albero viene disegnato utilizzando dei quadrati
Mouse (tasto): aumenta la ricorsione
Mouse (Ctrl+tasto): diminuisce la ricorsione
Applicazione Java

final int   maxRIC=7;
final float dim=200;

int     RIC;
boolean scende;
float   raggi[];
int     colori[];
float   Xc, Yc;
int     maxX, maxY;

void setup() 
{ 
  size(500, 350); 
  noStroke();
  smooth();
  rectMode(CENTER);
  Xc=width/2;    
  Yc=0.7*height;
  maxX=width-1;  
  maxY=height-1;

  colori=new   int[maxRIC+1];
  raggi =new float[maxRIC+1];

  RIC=3;
  scende=false;
  inizializzaRIC();  
  noLoop();
} 

void inizializzaRIC()
{
  colori[RIC]=25;  
  for(int i=RIC-1; i >=0; i--)
	colori[i]=colori[i+1]+25;

  raggi[RIC]=dim;  
  for(int i=RIC-1; i >=0; i--)
	raggi[i]=raggi[i+1]/2;
}

void keyPressed()
{
  scende=true;
}
void keyReleased()
{
  scende=false;
}
void mousePressed()
{
  if(scende && RIC > 0)
  {
	RIC--; 
	inizializzaRIC(); 
	redraw();
  }
  else if(!scende && RIC < maxRIC)  
  {
	RIC++; 
	inizializzaRIC(); 
	redraw();
  }
}

void draw() 
{ 
  background(255); 
  translate(Xc, Yc); 
  piano(RIC, 0, 0, HALF_PI);
}

void piano(int n, float x, float y, float angolo)
{
  fill(50, colori[n], 25); 

  pushMatrix();
  translate(x, y);
  rotate(angolo);  
	 rect(0, 0, raggi[n], raggi[n]);
  popMatrix();

  if(n > 0)
  {      
	float prossimo=raggi[n-1]*sqrt(2);
	float nx, ny;
		angolo +=PI/4;
	nx = x+prossimo*cos(angolo);
	ny = y-prossimo*sin(angolo);  piano(n-1, nx, ny, angolo);
		angolo-=HALF_PI;
	nx = x+prossimo*cos(angolo);
	ny = y-prossimo*sin(angolo);  piano(n-1, nx, ny, angolo);
  }
}