Albero interattivo

Mouse (verticale): lunghezza dei rami
Mouse (orizzontale): angolo tra i rami
Mouse (tasto): aumenta la ricorsione
Mouse (Ctrl+tasto): diminuisce la ricorsione
Applicazione Java

final int   numMax=10;
final float DIR=HALF_PI;

int   NUM;
float DIM;
float deltaDir;
float deltaDim;
float Dimensioni[];
float X0, Y0;
boolean scende=false;

void setup()
{
   size(500, 500);
   smooth();
   stroke(0);

   X0  = width/2;
   Y0  = 0.95*height; 
   DIM = height/2.4;
   Dimensioni=new float[numMax+1];

   NUM=5;
   aggiorna();        
   noLoop();
}

void aggiorna()
{
   deltaDim=map(mouseY, 0, height, 0.7, 0.01);
   deltaDir=map(mouseX, 0, width, +PI, -PI);

   Dimensioni[NUM]=DIM;   
   for(int i=NUM-1; i >=1; i--)
	  Dimensioni[i]=Dimensioni[i+1]*deltaDim;
}

void mouseMoved()
{
   aggiorna();   
   redraw();
}

void keyPressed()
{
   scende=true;
}
void keyReleased()
{
   scende=false;
}
void mousePressed()
{
   if(scende && NUM > 2)
	  NUM--;
   else if(!scende && NUM < numMax)  
	  NUM++;
	  
   aggiorna();
   redraw();
}

void draw()
{
   background(255);
   albero(NUM, X0, Y0, DIR);
}

void albero(int n, float x, float y, float angolo)
{
   float newX=x+Dimensioni[n]*cos(angolo);
   float newY=y-Dimensioni[n]*sin(angolo);
   line(x, y, newX, newY);

   if(n > 1)
   {
	  albero(n-1, newX, newY, angolo+deltaDir);
	  albero(n-1, newX, newY, angolo-deltaDir);
   }
}