Un orologio molto movimentato…
- Versione originale: http://www.sandermulder.com/
- Versione con Arduino: LED Pong Clock
In questa versione
- la palla si sincronizza con l’orologio del tuo computer al primo cambio dei minuti
- successivamente la palla segnala
- i secondi, ogni volta che urta una paletta
- i minuti, quando va fuori e riparte dalla parte opposta con una nuova traiettoria
Il movimento delle palette potrebbe essere reso ancora più naturale.
final float dimPalla=5;
float minX, maxX, minY, maxY, dimX, dimY, lineaP;
color lineaS;
BARRA barra_s, barra_d;
float barraB, barraH;
PALLA palla;
float xp, yp;
int h, m, m2, s, mm, ritardo;
PFont font;
void setup()
{
size(500, 350);
rectMode(CENTER);
smooth();
strokeWeight(2);
font=loadFont("C20.vlw");
textFont(font);
textAlign(CENTER);
lineaP=width/2;
lineaS=color(200, 200, 100);
barraB=width/40;
barraH=height/8;
minX=1.5*barraB;
minY=dimPalla;
maxX=width-minX;
maxY=height-dimPalla;
dimX=maxX-minX;
dimY=maxY-minY;
barra_s=new BARRA(barraB, height/2, barraB, barraH);
barra_d=new BARRA(width-barraB, height/2, barraB, barraH);
palla=new PALLA();
ritardo=0;
}
void draw()
{
background(0);
// linea verticale
stroke(lineaS);
line(lineaP, minY, lineaP, maxY);
// orologio digitale
h=hour();
m2=minute();
s=second();
mm=millis();
if(m2 != m)
{
palla=new PALLA();
m=m2;
ritardo=mm;
if(m%2 == 0)
ritardo-=1000;
}
mm=mm-ritardo;
fill(255);
text(nf(h, 2), lineaP-20, 20);
text(nf(m, 2), lineaP+20, 20);
palla.aggiorna();
xp=palla.x();
yp=palla.y();
barra_s.aggiorna(xp, yp);
barra_d.aggiorna(xp, yp);
}
class BARRA
{
final color coloref=color(50, 150, 150);
final color colores=color(25, 75, 75);
float x, y;
float B, H;
float minYb, maxYb;
BARRA(float nx, float ny, float nB, float nH)
{
x=nx;
y=ny;
minYb=barraH/2+dimPalla;
maxYb=height-barraH/2-dimPalla;
}
void aggiorna(float nx, float ny)
{
if(s < 59)
{
if(x < lineaP && nx < lineaP || x > lineaP && nx > lineaP)
{
if(ny > maxYb)
y=maxYb;
else if(ny < minYb)
y=minYb;
else
y=(y+ny)/2;
}
}
stroke(colores);
fill(coloref);
rect(x, y, barraB, barraH);
}
}
class PALLA
{
final color colores=color(200, 100, 100);
final color coloref=color(255, 200, 100);
final float minANG=PI/20, maxANG=PI/2.5;
float diametro;
float x, y;
float Y0, dx, dy, seno;
PALLA()
{
diametro=dimPalla;
Y0=random(dimY);
seno=sin(random(minANG, maxANG));
}
void aggiorna()
{
if(s < 59) { dx=mm*dimX/1000.0; dy=Y0+seno*dx; dx=dx%dimX; if((mm/1000) % 2 == 0) x=minX+dx; else x=maxX-dx; y=dy%(2*dimY); if(y > dimY)
y=2*dimY-y;
y+=minY;
stroke(colores);
fill(coloref);
ellipse(x, y, diametro, diametro);
}
}
float x() {
return x;
}
float y() {
return y;
}
}