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