- Mouse (posizione verticale): rotazione intorno all’asse x
- Mouse (tasto): visualizza una combinazione casuale degli spigoli
- Mouse (Ctrl+tasto): rivela tutti gli spigoli
- Applicazione Java
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ final int numDIM=4; final int numVertici=16; // ?????????????????? final int numSpigoli=32; // ?????????????????? //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Punto vertici [] =new Punto [numVertici]; boolean adiacenze[][]=new boolean[numVertici][numVertici]; Linea spigoli [] =new Linea [numSpigoli]; Linea cubo[] =new Linea [numSpigoli]; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void creaVertici() { for(int i=0; i < numVertici; i++) { int mask=1; float x[]=new float[numDIM]; for(int j=0; j < numDIM; j++) { int n=(i & mask); if(n != 0) x[j]=+1; else x[j]=-1; mask <<= 1; } vertici[i]=new Punto(x); } } void creaAdiacenze() { for(int i=0; i < numVertici; i++) for(int j=i+1; j < numVertici; j++) { int n=0; for(int k=0; k < numDIM; k++) if(vertici[i].x[k]==vertici[j].x[k]) n++; adiacenze[i][j]=(n == numDIM-1); adiacenze[j][i]=adiacenze[i][j]; } } void riduciVertici() { for(int i=0; i < numVertici; i++) { if(vertici[i].x[3] == -1) { for(int k=0; k < numDIM-1; k++) vertici[i].x[k]=vertici[i].x[k]/2; } } } void creaSpigoli() { int n=0; for(int i=0; i < numVertici; i++) for(int j=i+1; j < numVertici; j++) { if(adiacenze[i][j]) { spigoli[n]=new Linea(vertici[i], vertici[j]); n++; } } } void creaCubo0() { for(int i=0; i < numSpigoli; i++) cubo[i]=spigoli[i]; } void creaCubo() { for(int i=0; i < numSpigoli; i++) switch((int)random(3)) { case 0: case 1: cubo[i]=spigoli[i]; break; case 2: cubo[i]=null; break; } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void mousePressed() { if(keyPressed) creaCubo0(); else creaCubo(); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ final int CHIARO = 255; final int SCURO = 0; final int TRASP = 127; final color TRATTO = color(SCURO,SCURO,CHIARO, TRASP); final color SFONDO = color(CHIARO); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ final float DIM = 125; final int dimTRATTO = 4; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ final float deltaR = PI/200; float angoloR=0, WIDTH2 , HEIGHT2; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void setup() { size(500, 500, P3D); smooth(); stroke(TRATTO); strokeWeight(dimTRATTO); WIDTH2 =width/2; HEIGHT2=height/2; creaVertici(); creaAdiacenze(); riduciVertici(); creaSpigoli(); creaCubo0(); } void draw() { background(SFONDO); angoloR += deltaR; if(angoloR > TWO_PI) angoloR -= TWO_PI; translate(WIDTH2, HEIGHT2); rotateX(-map(mouseY, 0, width, 0, TWO_PI)); rotateY(angoloR); scale(DIM); for(int i=0; i<numSpigoli; i++) { if(cubo[i] != null) cubo[i].draw(); } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ class Punto { float x[]; Punto(float nx[]) { x=nx; } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ class Linea { Punto p1, p2; Linea(Punto np1, Punto np2) { p1=np1; p2=np2; } void draw() { line( p1.x[0], p1.x[1], p1.x[2], p2.x[0], p2.x[1], p2.x[2] ); } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++