Cubo 4D – Spigoli 1

  • 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] ); 
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++