Cubo 3D – Spigoli – Tre colori

  • 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   numVertici=8,
            numSpigoli=12;

Linea  spigoli[]=new Linea[numSpigoli];
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 = 8;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
final float deltaR = PI/200;            
float       angoloR=0,
            WIDTH2 ,
            HEIGHT2;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Punto vertici[]= 
{
  new Punto( 1, 1, 1), // 0
  new Punto( 1, 1,-1), // 1
  new Punto( 1,-1, 1), // 2
  new Punto( 1,-1,-1), // 3
  new Punto(-1, 1, 1), // 4
  new Punto(-1, 1,-1), // 5
  new Punto(-1,-1, 1), // 6
  new Punto(-1,-1,-1)  // 7
};

int adiacenze[][]=
{
  //    0,1,2,3,4,5,6,7
  {     0,1,1,0,1,0,0,0   }  , // 0
  {     1,0,0,1,0,1,0,0   }  , // 1
  {     1,0,0,1,0,0,1,0   }  , // 2
  {     0,1,1,0,0,0,0,1   }  , // 3
  {     1,0,0,0,0,1,1,0   }  , // 4
  {     0,1,0,0,1,0,0,1   }  , // 5
  {     0,0,1,0,1,0,0,1   }  , // 6
  {     0,0,0,1,0,1,1,0   }    // 7
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void creaSpigoli0()
{
  int n=0;
  for(int i=0;   i < numVertici; i++)
  for(int j=i+1; j < numVertici; j++)
  {
      if(adiacenze[i][j] == 1)
      {
          spigoli[n]=new Linea( vertici[i], vertici[j]);
          n++;
      }
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void creaSpigoli()
{
  int n=0;
  for(int i=0;   i < numVertici; i++)
  for(int j=i+1; j < numVertici; j++)     
  {       
      if(adiacenze[i][j] == 1)       
      {           
         switch((int)random(3))           
         {             
             case 0:
             case 1: spigoli[n]=new Linea( vertici[i], vertici[j]); break;             
             case 2: spigoli[n]=null;                               break;           
         }           
         n++;       
      }     
  } 
} 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
void mousePressed()  
{    
    if(keyPressed) 
        creaSpigoli0();     
    else           
        creaSpigoli();  
} 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
void setup() 
{   
  size(500, 500, P3D);   
  smooth();   
  stroke(TRATTO);   
  strokeWeight(dimTRATTO);   
  WIDTH2 =width/2;   
  HEIGHT2=height/2;   
  creaSpigoli0(); 
} 
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(spigoli[i] != null)
       spigoli[i].draw();
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class Punto
{
  float x, y, z;
  Punto(float nx, float ny, float nz) { x=nx; y=ny; z=nz; }
}
class Linea
{
  Punto p1, p2;
  Linea(Punto np1, Punto np2) { p1=np1; p2=np2; } 
  void draw()                 { line( p1.x, p1.y, p1.z,  p2.x, p2.y, p2.z ); }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++