Orologio NEOLOG

Le 5 barre verticali indicano rispettivamente

  1. ore, da 0 a 12
  2. minuti (decine), da 0 a 5
  3. minuti (unità), da 0 a 9
  4. secondi (decine), da 0 a 5
  5. secondi (unità), da 0 a 9

Nell’orologio originale (si tratta di un prodotto commerciale) non compare l’indicazione dei secondi.

color sfondo, 
      spento, 
      acceso;

neolog orologio;

void setup()
{
  size(500, 240);  
  frameRate(4); 

  orologio=new neolog(100, 200);
  sfondo=color(255);
}
void draw()
{
  background(sfondo);
  orologio.aggiorna();
}

class neolog
{
  int posX,
      posY;

  tratto[] tratti;

  color acceso, 
        spento;
  int   alto,  largo, 
        distX, distY;

  neolog(int x, int y)
  {
	  posX=x;
	  posY=y;
	  tratti=new tratto[40];       
	  acceso=color(255, 0, 255);
          spento=color(100, 0, 100);

          largo=55;   alto=6;
          distX=5;   distY=5;                                    

	  setta();
  }
  void setta()
  {
	 // ore

	 tratti[ 0]=new tratto(acceso, spento, 0, -(   alto         ), largo, alto);
	 tratti[ 1]=new tratto(acceso, spento, 0, -( 2*alto+   distY), largo, alto);
	 tratti[ 2]=new tratto(acceso, spento, 0, -( 3*alto+ 2*distY), largo, alto);

	 tratti[ 3]=new tratto(acceso, spento, 0, -( 5*alto+ 4*distY), largo, alto);                  
	 tratti[ 4]=new tratto(acceso, spento, 0, -( 6*alto+ 5*distY), largo, alto);
	 tratti[ 5]=new tratto(acceso, spento, 0, -( 7*alto+ 6*distY), largo, alto);                  

	 tratti[ 6]=new tratto(acceso, spento, 0, -( 9*alto+ 8*distY), largo, alto);                  
	 tratti[ 7]=new tratto(acceso, spento, 0, -(10*alto+ 9*distY), largo, alto);
	 tratti[ 8]=new tratto(acceso, spento, 0, -(11*alto+10*distY), largo, alto);                  

	 tratti[ 9]=new tratto(acceso, spento, 0, -(13*alto+12*distY), largo, alto);                  
	 tratti[10]=new tratto(acceso, spento, 0, -(14*alto+13*distY), largo, alto);
	 tratti[11]=new tratto(acceso, spento, 0, -(15*alto+14*distY), largo, alto);                  

	 // minuti decine

	 tratti[12]=new tratto(acceso, spento, largo+distX, -(   alto         ), largo, alto);
	 tratti[13]=new tratto(acceso, spento, largo+distX, -( 2*alto+   distY), largo, alto);
	 tratti[14]=new tratto(acceso, spento, largo+distX, -( 3*alto+ 2*distY), largo, alto);

	 tratti[15]=new tratto(acceso, spento, largo+distX, -( 5*alto+ 4*distY), largo, alto);                  
	 tratti[16]=new tratto(acceso, spento, largo+distX, -( 6*alto+ 5*distY), largo, alto);

	 // minuti unità

	 tratti[17]=new tratto(acceso, spento, 2*(largo+distX), -(   alto         ), largo, alto);
	 tratti[18]=new tratto(acceso, spento, 2*(largo+distX), -( 2*alto+   distY), largo, alto);
	 tratti[19]=new tratto(acceso, spento, 2*(largo+distX), -( 3*alto+ 2*distY), largo, alto);

	 tratti[20]=new tratto(acceso, spento, 2*(largo+distX), -( 5*alto+ 4*distY), largo, alto);                  
	 tratti[21]=new tratto(acceso, spento, 2*(largo+distX), -( 6*alto+ 5*distY), largo, alto);
	 tratti[22]=new tratto(acceso, spento, 2*(largo+distX), -( 7*alto+ 6*distY), largo, alto);                  

	 tratti[23]=new tratto(acceso, spento, 2*(largo+distX), -( 9*alto+ 8*distY), largo, alto);                  
	 tratti[24]=new tratto(acceso, spento, 2*(largo+distX), -(10*alto+ 9*distY), largo, alto);
	 tratti[25]=new tratto(acceso, spento, 2*(largo+distX), -(11*alto+10*distY), largo, alto);                          

	 // secondi decine

	 tratti[26]=new tratto(acceso, spento, 3*(largo+distX), -(   alto         ), largo, alto);
	 tratti[27]=new tratto(acceso, spento, 3*(largo+distX), -( 2*alto+   distY), largo, alto);
	 tratti[28]=new tratto(acceso, spento, 3*(largo+distX), -( 3*alto+ 2*distY), largo, alto);                 
	 tratti[29]=new tratto(acceso, spento, 3*(largo+distX), -( 5*alto+ 4*distY), largo, alto);                  
	 tratti[30]=new tratto(acceso, spento, 3*(largo+distX), -( 6*alto+ 5*distY), largo, alto);

	 // secondi unità

	 tratti[31]=new tratto(acceso, spento, 4*(largo+distX), -(   alto         ), largo, alto);
	 tratti[32]=new tratto(acceso, spento, 4*(largo+distX), -( 2*alto+   distY), largo, alto);
	 tratti[33]=new tratto(acceso, spento, 4*(largo+distX), -( 3*alto+ 2*distY), largo, alto);

	 tratti[34]=new tratto(acceso, spento, 4*(largo+distX), -( 5*alto+ 4*distY), largo, alto);                  
	 tratti[35]=new tratto(acceso, spento, 4*(largo+distX), -( 6*alto+ 5*distY), largo, alto);
	 tratti[36]=new tratto(acceso, spento, 4*(largo+distX), -( 7*alto+ 6*distY), largo, alto);                  

	 tratti[37]=new tratto(acceso, spento, 4*(largo+distX), -( 9*alto+ 8*distY), largo, alto);                  
	 tratti[38]=new tratto(acceso, spento, 4*(largo+distX), -(10*alto+ 9*distY), largo, alto);
	 tratti[39]=new tratto(acceso, spento, 4*(largo+distX), -(11*alto+10*distY), largo, alto);                          

	}

  void aggiorna()
  {
	int h, md, mu, sd, su;

	h=hour();    if(h > 12) h=h-12;
	md=minute(); mu=md%10; md=md/10; 
	sd=second(); su=sd%10; sd=sd/10; 

	pushMatrix();    
	translate(posX, posY);    

	fill(25);
	stroke(75);    

	rect(-distX, -15*alto-15*distY, 5*largo+6*distX, 15*alto+16*distY);
	// ore
	for(int i=0; i < h; i++)
		tratti[i].accendi();
	for(int i=h; i < 12; i++)
		tratti[i].spegni();

	// minuti decine        
	for(int i=0; i < md; i++)
		tratti[12+i].accendi();
	for(int i=md; i < 5; i++)
		tratti[12+i].spegni();

	// minuti unità
	for(int i=0; i < mu; i++)
		tratti[17+i].accendi();
	for(int i=mu; i < 9; i++)
		tratti[17+i].spegni();

	// secondi decine        
	for(int i=0; i < sd; i++)
		tratti[26+i].accendi();
	for(int i=sd; i < 5; i++)
		tratti[26+i].spegni();

	// secondi unità
	for(int i=0; i < su; i++)
		tratti[31+i].accendi();
	for(int i=su; i < 9; i++)
		tratti[31+i].spegni();

	popMatrix();
  }
}

class tratto
{
  color colore,
	colore_on,
	colore_off;
  int   posX,
	posY,
	largo,
	alto;

  tratto(color on, color off, int x, int y, int l, int a)
  {
	 colore_on=on;
	 colore_off=off;
	 posX=x;
	 posY=y;
	 largo=l;
	 alto=a;
	 spegni();
  }

  void accendi()
  {
	 colore=colore_on;
	 disegna();
  }
  void spegni()
  {
	 colore=colore_off;
	 disegna();
  }
  void disegna()
  {
	 fill(colore);
	 stroke(colore);
	 rect(posX, posY, largo, alto);
  }
}