Cubo 3D – Facce – Tre colori

  • Mouse (posizione verticale): rotazione intorno all’asse x
  • Mouse (tasto): visualizza una combinazione casuale delle facce
  • Mouse (tasto): si può accendere/spegnere la singola faccia cliccando sul quadratino corrispondente in alto a destra
  • Applicazione Java
final int numVertici = 8,  // è un cubo...
          numFacce   = 6;  // ............
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
final int CHIARO = 255;    // intensità componente colore
final int SCURO  = 0;
final int TRASP  = 127;    // valore di trasparenza (metà)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
color COLORI[]=
{
    color(CHIARO,  SCURO,  SCURO, TRASP),
    color( SCURO, CHIARO,  SCURO, TRASP),
    color( SCURO,  SCURO, CHIARO, TRASP)
};          

final color TRATTO = color(CHIARO/2);
final color SFONDO = color(CHIARO);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
color nuovoColore()
{
   return COLORI[(int)random(3)];
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
final int   DIM    = 125;    // dimensione dello spigolo
final float deltaR = PI/200; // velocità di rotazione asse y
float       angoloR=0,
            WIDTH2 ,         // CENTRO FINESTRA
            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 quadrato[][]={
                  { 0, 1, 3, 2 }, // 0
                  { 1, 5, 7, 3 }, // 1
                  { 5, 4, 6, 7 }, // 2
                  { 4, 0, 2, 6 }, // 3
                  { 2, 3, 7, 6 }, // 4
                  { 5, 1, 0, 4 }  // 5
                 };
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Faccia nuovaFaccia(int x)
{
    return new Faccia(
                      vertici[quadrato[x][0]],
                      vertici[quadrato[x][1]], 
                      vertici[quadrato[x][2]],
                      vertici[quadrato[x][3]], 
                      nuovoColore()
                     );  
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Faccia facce[]=new Faccia[numFacce];
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup()
{
   size(500, 500, P3D);
   stroke(TRATTO);
   lights();
   WIDTH2 =width/2;
   HEIGHT2=height/2; 
   creaFacce();
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void draw()
{
   background(SFONDO);
  
   angoloR += deltaR;
   if(angoloR >  TWO_PI)
       angoloR -= TWO_PI;
   pushMatrix();
   translate(WIDTH2, HEIGHT2);
   rotateX(-map(mouseY, 0, width, 0, TWO_PI));
   rotateY(angoloR);
   scale(DIM);
   for(int i=0; i<numFacce; i++)
   {
      if(facce[i]!=null)
          facce[i].draw();
   }
   popMatrix();
   visControllo();
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class Punto
{
  float x, y, z;
  
  Punto(float nx, float ny, float nz)
  {
      x=nx; 
      y=ny;
      z=nz;
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class Faccia
{
   Punto p1, p2, p3, p4;
   color c;
   Faccia(Punto np1, Punto np2, Punto np3, Punto np4, color nc)
   {
       p1=np1; p2=np2; p3=np3; p4=np4;
       c=nc;
   }
   void draw()
   {
       fill(c);
       beginShape(QUADS);
       vertex(p1.x,  p1.y,  p1.z);
       vertex(p2.x,  p2.y,  p2.z);
       vertex(p3.x,  p3.y,  p3.z);
       vertex(p4.x,  p4.y,  p4.z);
       endShape();
   }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
final int dimCONTR = 20;

int posControlli[][]=
{
  { 10, 30 , 10+dimCONTR, 30+dimCONTR },
  { 30, 30 , 30+dimCONTR, 30+dimCONTR },
  { 50, 30 , 50+dimCONTR, 30+dimCONTR },
  { 70, 30 , 70+dimCONTR, 30+dimCONTR },
  { 30, 50 , 30+dimCONTR, 50+dimCONTR },
  { 30, 10 , 30+dimCONTR, 10+dimCONTR }
};

void visControllo()
{
   for(int i=0; i < numFacce; i++)
   {
       if(facce[i]==null) fill(SFONDO);
       else               fill(facce[i].c);
       
       rect(posControlli[i][0], posControlli[i][1], dimCONTR, dimCONTR); 
   }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void mousePressed()
{
   int X=mouseX;
   int Y=mouseY;
   for(int i=0; i < numFacce; i++) 
   { 
      if(X > posControlli[i][0] && X < posControlli[i][2] && Y > posControlli[i][1] && Y < posControlli[i][3])
      {
         if(facce[i]==null) facce[i]=nuovaFaccia(i);
         else               facce[i]=null;
         return;
      }
   }
   creaFacce();
}
void creaFacce()
{
   for(int i=0; i < numFacce; i++)
   {
      switch((int)random(3))
      {
         case 0:
         case 1: facce[i]=nuovaFaccia(i); break;
         case 2: facce[i]=null;           break;
      }  
   }
}