Wednesday, February 12, 2014

La demo di Indianapolis

Nel post precedente ho allegato la demo di un circuito automobilistico, realizzato con lo strumento Canvas di Tkinter, Alcune tecniche utilizzate nel programma possono farvi risparmiare qualche ora di ricerca su Google.

Vi ho anticipato che per usare immagini fotografiche serve la libreria pillow. Nel giochino viene ridimensionata l'immagine fotografica della Porsche Carrera, ruotata verso l'alto in posizione di partenza.

La classe Carrera fornisce due metodi: il primo

def __init__
crea l'immagine come oggetto di canvas (istanza di Canvas, widget di Tkinter) e l'altro
def update
consente di sostituire l'immagine con una nuova, ruotata diversamente, per seguire logicamente il cambio di direzione dell'automobile quando percorre il circuito.

L'altra classe è la solita class myApp che contiene la parte grafica e quello logica del software.

Quando create una variabile preceduta da self. nel costruttore della classe, la sua visibilità (scope) si estende automaticamente ai metodi, cioè alle funzioni; il valore di default di self.eccentricità, per esempio, compare molto precocemente e puo' essere utilizzato ovunque nel codice.

La creazione dei widget comuni come Label e Button, compresa l'istruzione command, dovrebbe esservi familiare.

Per Canvas vediamo le cose più importanti:

  • i parametri width e height fissano rispettivamente la larghezza e l'altezza. Qui sono stati inizializzati come variabili di istanza, perchè vengono usati spesso nel programma
  • per disegnare gli ovali che costituiscono i bordi della pista di Indianapolis nel giochino, ho usato un piccolo espediente: dato che, a differenza di linee e punti, la funzione create_oval richiede le coordinate del box che li contiene, ho creato la funzione coord_ell. Questa funzione, con l'aiuto della geometria analitica, passati come parametri il valore di eccentricità (diciamo il grado di schiacciamento dell'ellisse, compreso tra 0 e 1), i limiti dimensionali della Canvas, un valore angolare e percentuale, restituisce una tupla contenente gli estremi del box (x1,y1,x2,y2) e le coordinate x,y di un punto dell'ellisse dato il valore dell'angolo al centro, utile se devo tracciare punti o posizionare, come in questo caso, un'immagine. Il valore percentuale stabilisce un correttivo per creare ellissi a varia distanza dal centro. Il bordo interno della pista, per esempio, è all'80% con una eccentricità di 0.8, il bordo esterno al 100% sempre con eccentricità 0.8.
  • La traiettoria della Carrera, invece ha una eccentricità del 90%, per cui risulta un ellisse più schiacciata, dando l'illusione di un derapage agli estremi e di un percorso sul bordo interno nel tratto 'rettilineo'. Ovviamente è solo un espediente geometrico, non c'è "Car Physics", niente attriti, niente resistenza dell'aria, nessuna inclinazione della pista. Se volete divertirvi un po', provate a fissare l'eccentricità al valore 1.0, vedrete l'auto percorrere il diametro maggiore, avanti e indietro, ruotando in modo abbastanza divertente durante il tragitto.
  • Nella sequenza preceduta da #Car, potete vedere come si carica un'immagine dal disco fisso, e come si ridimensiona a 50x50 pixel. Potete modificare la grandezza, se volete. Nel 'resize' è stata aggiunta l'opzione ANTIALIAS, che serve a limitare i danni sull'immagine che inevitabilmente la trasformazione produce. mantenendo un buon effetto fotorealistico.
  • Il timer non esiste come widget in Tkinter, volendo si può usare il timing della libreria thread, ma tutto sommato può bastare il metodo .after, applicato all'istanza di root, che attiva una funzione di callback (in questo caso 'muovi') dopo un certo numero di millisecondi. Questo metodo funziona una volta sola, per cui è necessario rilanciarlo dall'interno della funzione chiamata, indicando, come già si fa per il command dei button, solo il nome della funzione, non la sua istanza, cioè evitando di usare le parentesi () dopo il nome: il programma andrebbe in crash velocemente per superamento della profondità di ricorsione.

Dal prossimo post ritorniamo ad occuparci un po' di software astrologico, partendo dalle variabili di tempo e da come si possono integrare con l'uso dell'Olsen database, il database delle ore legali in vigore in varie epoche in molti, se non tutti i paesi del mondo e il database delle località che abbiamo creato per SQLite. Alla prossima

No comments:

Post a Comment

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...