![]() |
![]() Sincronizza Indice |
![]() Scarica il progetto |
![]() Testo dell'articolo |
![]() Stampa l'articolo |
La domanda mi è stata posta tantissime volte che date le numerose richieste ho deciso di realizzarne un articolo accessibile a tutti; per una corretta comprensione si raccomanda una conoscenza sommaria della geometria del cerchio.
Per rendere l'orologio più realistico abbiamo fatto in modo che lo spostamento della lancetta delle ore avvenisse gradualmente, in maniera legata ai minuti, anziché scattare da un'ora all'altra con uno spostamento di 30° (360/12) per volta. Lo stesso procedimento è stato applicato alla lancetta dei minuti, sincronizzata con l'avanzare dei secondi. Quasi tutto il codice si trova all'interno di una routine richiamata dall'evento Timer del controllo tmrTimer ma prima di vederla in dettaglio affrontiamo quei piccoli accorgimenti necessari alla preparazione della superficie su cui si muoveranno le lancette:
La costante PI rappresenta semplicemente il PI greco, fondamentale per qualsiasi operazione basata sulle ellissi. Incredibile a dirsi in Visual Basic questa costante non esiste da nessuna parte. Le altre due costanti intCenterX e intCenterY indicano la posizione del centro dell'orologio. Saranno utilizzate per il posizionamento delle tre lancette.
All'avvio del form sarà opportuno assicurare la posizione delle lancette sull'asse Z, ponendo quella delle ore sotto tutte e quella dei secondi sopra tutte le altre, per evitar in tal modo che la lancetta delle ore copra parte di quella dei minuti o dei secondi. Alle righe 11 e 12 sarà disegnato un semplice cerchio all'interno del quale si muovono le nostre lancette; il cerchio ha un raggio poco superiore al raggio della lancetta dei secondi, la più lunga delle tre. Sarà immediatamente richiamato l'evento Timer per posizionare subito le nostre lancette e non dover attendere il passaggio del primo secondo per aggiornare lo schermo.
Ad ogni secondo scatterà questa routine che si occuperà di richiamare la funzione RefreshLine che ridisegnerà la lancetta specificata nel primo argomento; ogni lancetta sarà disegnata autonomamente e successivamente saranno indicati nella Label lblOre data e ora correnti.
Il calcolo da effettuare è molto semplice: determinato l'angolo semplicemente dividendo l'angolo giro (doppio PI greco) in tante parti quante indicate in Divisor e moltiplicando per il valore, sottraiamo 90° (PI / 2) per spostare l'origine alle ore 12, anziché alle ore 3, origine del cerchio. Ottenuto sngAngle, con due semplici operazioni saranno determinate le coordinate X e Y finali della lancetta; alle righe 30 e 31 sono posizionate le origini, quindi, in funzione che l'angolo sia positivo o negativo, sarà calcolata la coordinata finale, aggiungendo, in caso di segno positivo, al centro la distanza data da raggio per il seno dell'angolo (coordinata Y) o sottraendola in caso di angolo negativo; per quanto riguarda la coordinata X basterà moltiplicare il raggio per il coseno dello stesso angolo. Questa procedura verrà ripetuta per tutte e tre le lancette, ed ognuna delle quali verrà posizionata al suo corrispondente punto. Il risultato è quello mostrato nella figura a fianco. |
Si tratta di un problema a prima vista difficile ma una semplice conoscenza della geometria di base delle ellissi è in grado di risolvere il problema con estrema semplicità. Fibia
FBI
|
![]() |