Cubo 3D – Facce – Un colore

  • 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,
   	    numFacce   = 6;

Faccia facce[]=new Faccia[numFacce];
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
final int   CHIARO = 255;
final int   SCURO  = 0;
final int   TRASP  = 127;
final color COLORE = color(SCURO, CHIARO,  SCURO, TRASP);
final color TRATTO = color(CHIARO/2);
final color SFONDO = color(CHIARO);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
final int   DIM    = 125;
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 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]], 
                      COLORE 
                     );  
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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(COLORE);

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