Visualizza ore, minuti e secondi, dell’orologio di sistema del computer, come tre lancette in movimento.
Versione 1
Riprende il codice della lancetta dei secondi aggiungendo due sezioni per i minuti e le ore.
Web VPython 3.2
RAGGIO = 10.0 # Arbitrario
SPAZIO = 1.1*RAGGIO
#---------------------------------------------------------
g = graph(width=480, height=480,
xmin=-SPAZIO, ymin= -SPAZIO,
xmax=+SPAZIO, ymax= +SPAZIO)
g_ore = gcurve(color=color.red , width=20)
g_min = gcurve(color=color.green, width=15)
g_sec = gcurve(color=color.blue , width=10)
#---------------------------------------------------------
RAGGIO_ORE = 0.50*RAGGIO
RAGGIO_MIN = 0.75*RAGGIO
RAGGIO_SEC = 1.00*RAGGIO
PI_2 = pi/ 2
TAU_12 = 2*pi/12
TAU_60 = 2*pi/60
#---------------------------------------------------------
while(True):
rate(10)
adesso = Date()
millesimi = adesso.getMilliseconds()
secondi = adesso.getSeconds() + millesimi/1000
angolo_sec = PI_2 - secondi*TAU_60
x_sec = RAGGIO_SEC*cos(angolo_sec)
y_sec = RAGGIO_SEC*sin(angolo_sec)
g_sec.data = []
g_sec.plot(0, 0)
g_sec.plot(x_sec, y_sec)
#------------------------------------------------
minuti = adesso.getMinutes() + secondi/60
angolo_min = PI_2 - minuti*TAU_60
x_min = RAGGIO_MIN*cos(angolo_min)
y_min = RAGGIO_MIN*sin(angolo_min)
g_min.data = []
g_min.plot(0, 0)
g_min.plot(x_min, y_min)
#------------------------------------------------
ore = adesso.getHours() + minuti/60
angolo_ore = PI_2 - ore*TAU_12
x_ore = RAGGIO_ORE*cos(angolo_ore)
y_ore = RAGGIO_ORE*sin(angolo_ore)
g_ore.data = []
g_ore.plot(0, 0)
g_ore.plot(x_ore, y_ore)
Versione 2
Per migliorare la leggibilità del codice le istruzioni simili sono scritte vicine e/o in colonne.
Web VPython 3.2
RAGGIO = 10.0 # Arbitrario
SPAZIO = 1.1*RAGGIO
#---------------------------------------------------------
g = graph(width=480, height=480,
xmin=-SPAZIO, ymin= -SPAZIO,
xmax=+SPAZIO, ymax= +SPAZIO)
g_ore = gcurve(color=color.red , width=20)
g_min = gcurve(color=color.green, width=15)
g_sec = gcurve(color=color.blue , width=10)
#---------------------------------------------------------
RAGGIO_ORE = 0.50*RAGGIO
RAGGIO_MIN = 0.75*RAGGIO
RAGGIO_SEC = 1.00*RAGGIO
PI_2 = pi / 2
TAU_12 = 2*pi / 12
TAU_60 = 2*pi / 60
#---------------------------------------------------------
while(True):
rate(10)
adesso = Date()
millesimi = adesso.getMilliseconds()
secondi = adesso.getSeconds()+millesimi/1000
minuti = adesso.getMinutes()+secondi / 60
ore = adesso.getHours() +minuti / 60
angolo_ore = PI_2 - ore *TAU_12
angolo_min = PI_2 - minuti *TAU_60
angolo_sec = PI_2 - secondi*TAU_60
x_ore = RAGGIO_ORE*cos(angolo_ore); y_ore = RAGGIO_ORE*sin(angolo_ore)
x_min = RAGGIO_MIN*cos(angolo_min); y_min = RAGGIO_MIN*sin(angolo_min)
x_sec = RAGGIO_SEC*cos(angolo_sec); y_sec = RAGGIO_SEC*sin(angolo_sec)
g_ore.data = []; g_ore.plot(0, 0); g_ore.plot(x_ore, y_ore)
g_min.data = []; g_min.plot(0, 0); g_min.plot(x_min, y_min)
g_sec.data = []; g_sec.plot(0, 0); g_sec.plot(x_sec, y_sec)
Versione 3
Aggiungi le tacche…
Versione 4
Quando alcune variabili si comportano come oggetti con dati in parallelo e comportamenti in comune… è il momento di passare alla programmazione a oggetti!
Web VPython 3.2
#---------------------------------------------------------
RAGGIO = 10.0 # Arbitrario
SPAZIO = 1.1*RAGGIO
#---------------------------------------------------------
g = graph(width = 480, height=480,
xmin = -SPAZIO, ymin = -SPAZIO,
xmax = +SPAZIO, ymax = +SPAZIO)
#---------------------------------------------------------
class Lancetta:
PI_2 = pi/2 # COSTANTI
TAU_12 = 2*pi/12
TAU_60 = 2*pi/60
def __init__(self, tipo, colore, spessore, lunghezza):
self.tipo = tipo
self.grafico = gcurve()
self.grafico.color = colore
self.grafico.width = spessore
self.lunghezza = lunghezza
def aggiorna(self, valore):
self.valore = valore
if(self.tipo == "h"):
self.angolo = self.PI_2 - self.valore * self.TAU_12
elif(self.tipo in ("m", "s")):
self.angolo = self.PI_2 - self.valore * self.TAU_60
self.x = self.lunghezza * cos(self.angolo)
self.y = self.lunghezza * sin(self.angolo)
def disegna(self):
self.grafico.data = []
self.grafico.plot(0, 0)
self.grafico.plot(self.x, self.y)
#---------------------------------------------------------
lancetta_ore = Lancetta("h", color.red , 15, 0.50*RAGGIO)
lancetta_min = Lancetta("m", color.green, 10, 0.75*RAGGIO)
lancetta_sec = Lancetta("s", color.blue , 5, 1.00*RAGGIO)
#---------------------------------------------------------
#---------------------------------------------------------
while(True):
rate(10)
adesso = Date()
millesimi = adesso.getMilliseconds()
secondi = adesso.getSeconds() + millesimi/1000
minuti = adesso.getMinutes() + secondi / 60
ore = adesso.getHours() + minuti / 60
lancetta_ore.aggiorna(ore)
lancetta_min.aggiorna(minuti)
lancetta_sec.aggiorna(secondi)
lancetta_ore.disegna()
lancetta_min.disegna()
lancetta_sec.disegna()
Una Lancetta ha gli attributi
- tipo, per distinguere le ore in un giro (12) dai minuti e secondi (60)
- colore (red, green, blue)
- spessore (15, 10, 5)
- lunghezza
e due metodi
- aggiorna, riceve il valore attuale e lo utilizza per calcolare l’angolo e quindi le coordinate x, y
- disegna, cancella il disegno precedente e disegna un tratto dal centro all’estremo x, y