Orologio analogico 3D

Utilizza

  • Mouse: attiva la finestra grafica
  • LEFTRIGHT: rotazione dell’asse y
  • UPDOWN: rotazione dell’asse x
  • AZ: rotazione dell’asse z
  • SPACE: ritorna alla posizione standard.
  • Applicazione Java
float    dimA=PI/100,
         PI6=PI/6,
         Xc, Yc,
         angoloX=0, angoloY=0,angoloZ=0,
         raggio, diametro;
color    blu, verde, rosso, grigio, grigio1, grigio2;
Lancetta LS, LM, LH;
float    S,  M,  H;
Ora[]    LeOre=new Ora[12];

void setup()
{
  size(500, 500, P3D);
  frameRate(30);
  noStroke();
  smooth();
  Xc=width/2; Yc=height/2;
  diametro=0.8*min(width, height);
  raggio=diametro/2;

  blu    =color(  0,   0, 255);
  verde  =color(  0, 255,   0);      
  rosso  =color(255,   0,   0);
  grigio1=color(  0,   0,   0);
  grigio2=color(127, 127, 127);

  for(int i=0; i < 12; i++)
      LeOre[i]=new Ora(i);

  LH = new Lancetta(diametro*0.3, diametro*0.06, blu  , -5);
  LM = new Lancetta(diametro*0.4, diametro*0.04, verde,  0);
  LS = new Lancetta(diametro*0.5, diametro*0.02, rosso, +5);
}

void keyPressed()
{
       if(keyCode==RIGHT)                   angoloY += dimA;
  else if(keyCode==LEFT)                    angoloY -= dimA;
  else if(keyCode==UP)                      angoloX += dimA;
  else if(keyCode==DOWN)                    angoloX -= dimA;
  else if(keyCode=='a' || keyCode == 'A')   angoloZ -= dimA;
  else if(keyCode=='z' || keyCode == 'Z')   angoloZ += dimA;
  else                           
  {
      angoloX=0;
      angoloY=0;
      angoloZ=0;
  }
}

void draw()
{
  background(255);
  lights();

  translate(Xc, Yc, 0);
  rotateX(angoloX);
  rotateY(angoloY);
  rotateZ(angoloZ);

  for(int i=0; i < 12; i++)
      LeOre[i].disegna();

  S=second();
  M=minute()+S/60;
  H=hour()+M/60;

  LH.aggiorna((TWO_PI/12)*H-HALF_PI);
  LM.aggiorna((TWO_PI/60)*M-HALF_PI);
  LS.aggiorna((TWO_PI/60)*S-HALF_PI);
}

class Ora
{
   int h;

   Ora(int cheOra) { h = cheOra; }

   void disegna()
   {
	 if(h==0)  fill(grigio1);
	 else      fill(grigio2);
	 pushMatrix();
	 rotateZ(h*PI6-HALF_PI);
	 translate(raggio, 0, 0);
	 box(20,12,4);
	 popMatrix();
   }
}

class Lancetta
{
  float lunga, alta, livello;
  color colore;

  Lancetta(float lun, float alt, color col, float liv)
  {
	 lunga=lun;
	 alta=alt;
	 colore=col;
	 livello=liv;
  }

  void aggiorna(float angolo)
  {
      fill(colore);
      pushMatrix();
      rotateZ(angolo);
      translate(lunga/2-alta, 0, livello);
      box(lunga, alta, 4);
      popMatrix();
  }
}