Cubo 4D – Spigoli 2

  • 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]+.5;
      }
      else
      {         
          for(int k=0; k < numDIM-1; k++)
             vertici[i].x[k]=vertici[i].x[k]-.5;
      }
  }
  
}
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 = 80; 
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] ); 
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++