- 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);
}
}