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