Albero 3D

  • 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 float DIR      = HALF_PI;
final float deltaDir = PI/4;
final float deltaDim = 0.59;
final int   maxRIC   = 10;
final float GAP      = PI/6;

float   DIM;
int     RIC=10;
boolean scende;
float   asseX, asseY; 
int     Xc, Yc;
int     maxX, maxY;
float   Dimensioni[];

void setup() 
{ 
  size(500, 500, P3D); 

  Xc     = width/2;    
  Yc     = height/2;
  maxX   = width-1;
  maxY   = height-1; 
  RIC    = 4;
  DIM    = width*0.19;
  scende = false;
  
  Dimensioni = new float[maxRIC+1];
  inizializzaRIC();

  noLoop();
} 

void inizializzaRIC()
{
  Dimensioni=new float[RIC+1];
  Dimensioni[RIC]=DIM;
  for(int i=RIC-1; i >=1; i--)
      Dimensioni[i]=Dimensioni[i+1]*deltaDim;
}

void keyPressed()
{
  scende=true;
}
void keyReleased()
{
  scende=false;
}
void mousePressed()
{
  if(scende && RIC > 1)
  {
      RIC--; 
      inizializzaRIC(); 
      redraw();
  }
  else if(!scende && RIC < maxRIC) 
  { 
      RIC++; 
      inizializzaRIC(); 
      redraw(); 
  } 
} 
void mouseMoved() 
{ 
  asseY =  map(mouseX, 0, +maxX, -HALF_PI, +HALF_PI); 
  asseX = -map(mouseY, 0, +maxY, -PI,      +PI); 
  redraw(); 
} 
void draw() 
{ 
  background(255); 
  stroke(0); 
  fill(0, 25); 
  translate(Xc, Yc); 
  rotateX(asseX); 
  rotateY(asseY); 
  box(10); 
  albero(RIC, 0, 0, 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);
  }
}