Tre lancette

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

Lascia un commento