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