Albero 3D di cubi

  • Mouse (verticale): rotazione intorno all’asse X
  • Mouse (orizzontale): rotazione intorno all’asse Y
  • Mouse (tasto): aumenta la ricorsione
  • Mouse (Ctrl+tasto): diminuisce la ricorsione
  • Applicazione Java
final int   maxRIC=5;
final float GAP=PI/6;
final float dim=120;

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

void setup() 
{ 
  size(500, 500, P3D); 
  frameRate(30);
  noStroke();

  Xc=width/2;    
  Yc=height/2;
  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]=50;  
  for(int i=RIC-1; i >=0; i--)
	colori[i]=colori[i+1]+30;

  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 mouseMoved() 
{   
   asseY = -map(mouseX, 0, +maxX, -HALF_PI-GAP, +HALF_PI+GAP);   
   asseX =  map(mouseY, 0, +maxY, -PI-GAP, +PI+GAP);   
   redraw(); 
} 
void draw()  
{    
   background(255);    
   lights();   
   translate(Xc, Yc);    
   rotateX(-asseX);    
   rotateY(-asseY);       
   cubo(RIC, 0, 0, 0); 
} 
void cubo(int n, float x, float y, float z) 
{   
   fill(25, colori[n], 50);    
   pushMatrix();   
   translate(x, y, z);   
   box(raggi[n]);   
   popMatrix();   
   if(n > 0)
   {      
	float prossimo=raggi[n-1];
	cubo(n-1, x-prossimo, y-prossimo, z-prossimo);
	cubo(n-1, x+prossimo, y-prossimo, z-prossimo);                  
	cubo(n-1, x-prossimo, y-prossimo, z+prossimo);
	cubo(n-1, x+prossimo, y-prossimo, z+prossimo);                  
   }
}