Università di Salerno Corso di FONDAMENTI DI INFORMATICA Corso di Laurea Ingegneria Meccanica & Ingegneria Gestionale Mat. Pari Docente : Ing. Secondulfo Giovanni Anno Accademico 2009-2010 APPENDICE I RAFICA VANZATA IN Materiale Didattico predisposto con la collaborazione dell Ing. Paolo Finelli
Grafica Avanzata MATLAB fornisce un insieme di funzioni di basso livello che consentono di creare e manipolare linee, superfici ed altri oggetti grafici. Questo sistema è chiamato Handle Graphics. Gli oggetti grafici sono le primitive alla base del sistema Handle Graphics di MATLAB. Gli oggetti sono organizzati in una struttura gerarchica ad albero. Questo riflette l interdipendenza degli oggetti grafici. Ad esempio, l oggetto Line richiede l oggetto Axes come frame di riferimento. Di conseguenza, l oggetto Axes esiste solo all interno di un oggetto Figure. Graphics Objects Ci sono 12 tipi di oggetti nel sistema Handle Graphics: L oggetto Root è al vertice della gerarchia. Corrisponde allo schermo del computer. MATLAB automaticamente crea l oggetto Root all inizio della sezione. Gli oggetti Figure sono le finestre sullo schermo principale aldila della finestra di comando. Gli oggetti Uicontrol sono le interfaccie utente di controllo che eseguono una funzione quando gli utenti attivano l oggetto. Queste interfaccie includono pulsanti di vario tipo, barre, ecc. Gli oggetti Axes definiscono una regione in una finestra figure e orientano tutti le successive istruzioni ad operare in tale regione. Gli oggetti Uimenu sono interfaccie grafiche utente, si tratta di menu che risiedono al di sopra della finestra figure. Gli oggetti Image sono oggetti bi-dimensionali che MATLAB mostra utilizzando gli elementi di un array rettangolare come indice in una colormap. Gli oggetti Line sono la primitiva base per la maggior parte dei grafici bi-dimensionali. Gli oggetti Patch sono poligoni bordati pieni. Una singola Patch può contenere più faccie, ognuna colorata indipendentemente dalle altre con colori pieni o interpolati. Gli oggetti Surface sono delle rappresentazioni tri-dimensionali di dati matriciali creati tracciando il valore dei dati come l altezza al di sopra del piano x-y. Gli oggetti Text sono stringhe di caratteri. Gli oggetti Light definiscono la sorgente luminosa che illumina tutti gli oggetti nella zona definite da Axes. Object Handles Ogni singolo oggetto ha un unico identificatore, chiamato handle, che matlab assegna all oggetto quando questo viene creato. Alcuni grafici, come quelli ottenuti dalla sovrapposizione di più linee, sono composti da più oggetti, ognuno dei quali ha il suo proprio handle. Al posto di tentare di leggere l handle dallo schermo e di ridisegnarlo, si può provare ad immagazzianre il valore dell handle in una variabile e passare questa variabile ogni volta che l handle è richiesto. L handle dell oggetto root è sempre zero. Quello di una figura è un intero che, per default, è mostrato nel titolo della finestra. Handle di altri oggetti sono numero in virgola mobile che contengono le informazioni usate da MATLAB. Ad esempio, sia A, la matrice magica di Durer >> h = plot(a) crea un grafico che è un insieme di quattro linee, una per ogni colonna di A. E restituisce anche il vettore degli handle 2
h = 9.00024414062500 6.00048828125000 7.00036621093750 8.00036621093750 I valori numerici in se sono irrilevanti e variano da sistema a sistema. Questi numeri sono importanti perché rappresentano gli handle dei singoli grafici: h(n) è l handle della n-ma linea. MATLAB mette a disposizione diverse funzioni per accedere agli handle degli oggetti: gcf gca gco Si possono usare queste funzioni come argomenti di input per alter funzioni che necessitano di handle per figure e axes. Tutte le funzioni MATLAB che creano oggetti restituiscono l handle (o un vettore di handle) dell oggetto creato. Per rimuovere un oggetto bisogna utilizzare la funzione delete, passandogli l handle dell oggetto come argomento. Ad esempio, per eliminare l axes corrente (e tutti I suoi eventuali figli) si usa l istruzione: delete(gca) Funzioni per la creazione degli oggetti Per creare un certo oggetto bisogna richiamare il nome dell oggetto con gli opportuni parametri. Per esempio, la funzione text crea l oggetto text, la funzione figure crea l oggetto figure, e cosi via. Le funzioni MATLAB di alto livello (come plot e surf) richiamano le opportune funzsioni di basso livello per tracciare i rispettivi grafici. Le funzioni di basso livello non fanno altro che creare uno degli undici oggetti grafici definiti da MATLAB con l eccezione dell oggetto root, che è l unico oggetto che solo MATLAB può creare. Propietà degli oggetti Tutti gli oggetti hanno delle proprietà che controllano come sono visualizzate. MATLAB fornisce due meccanismi per settare il valore delle propietà. Le proprietà degli oggetti possono essere settate dalle stesse funzioni che creano gli oggetti, o possono essere cambiate con la funzione set dopo che l oggetto è stato già creato. Ad esempio, queste istruzioni creano tre oggetti e sovrascrivono alcune delle proprietà di default. days = ['Su';'Mo';'Tu';'We';'Th';'Fr';'Sa'] temp = [21.1 22.2 19.4 23.3 23.9 21.1 20.0]; f = figure a = axes('ylim',[16 26],'Xtick',1:7,'XTickLabel',days) h = line(1:7,temp) 3
Esempio delle proprietà degli oggetti Days è un array di caratteri contenente le abbreviazioni per i giorni della settimana mente temp è un array numerico contenente le temperature. La finestra figure è creata chiamando figure senza specificare nessun argomento, in tal modo essa avrà le proprietà di default. Gli assi (axes) esistono dentro la figura (figure) ed hanno uno specifico insieme di valori per: la scala dell asse y, e per l incremento sull asse x. La linea (line) esiste all interno dell asse ed ha uno specifico valore per le coordinate x-y. I tre handle degli oggetti (f,a,h) sono salvati per un successivo uso. set e get Le proprietà degli oggetti sono specificate referenziando gli oggetti dopo la loro creazione.. Per farlo, si utilizzando gli handle restituiti dalla funzione che li crea. La funzione set consente di settare ogni proprietà dell oggetto specificando l handle e la coppia proprietà valore. Ad esempio, per cambiare il colore e lo spessore della linea dell esempio precedente, >> set(h,'color',[0.8.8],'linewidth',3) To see a list of all settable properties for a particular object, call set with the object's handle: >> set(h) Color EraseMode: [ {normal} background xor none ] LineStyle: [ {-} -- : -. none ] LineWidth Marker: MarkerSize 4
... XData YData ZData Per vedere la lista di tutte le impostazioni correnti per un particolare oggetto, bisogna richiamare la funzione handle con parametro l handle dell oggetto: >> get(h) Color = [0 0.8 0.8] EraseMode = normal LineStyle = LineWidth = [3] Marker = none MarkerSize = [6]... XData = [ (1 by 7) double array] YData = [ (1 by 7) double array] ZData = [] Per interroggare il valore di una proprietà, si utilizza get con il nome della proprietà: >> get(h,'color') ans = 0 0.8000 0.8000 L oggetto axes ha un insieme di proprietà dettagliate dei grafici. Ad esempio, il titolo è un altro figlio di axes. Le istruzioni: t = get(a,'title'); set(t,'string','temperature','fontangle','oblique') specificano un titolo particolare. La funzione title fornisce un altra interfaccia con le stesse proprietà. GUI Interfaccia Grafica Utente Segue un esempio che mostra come usare l Handle Graphics per costruire un interfaccia utente. Le istruzioni b = uicontrol('style','pushbutton',... 'Units','normalized',... 'Position',[.5.5.2.1],... 'String','click here'); creano un pulsante (pushbutton) al centro della figure window e restituiscono un handle per il nuovo oggetto. Ma cliccando il pulsante nulla accade. L istruzione s = 'set(b,''position'',[.8*rand.9*rand.2.1])'; crer una stringa contenente un commando che altera la posizione del pulsante. Un esecuzione ripetuta di eval(s) muove il pulsante in una posizione casuale. In fine, set(b,'callback',s) 5
installa s come un pulsante con la funzione callback, cosi ogni volta che si clicca su un bottone, questo viene spostato in una nuova posizione. Animazioni MATLAB fornisce diversi modi per generare movimento, animazione, grafica. Si può utilizzare la proprietà EraseMode per sequenze lunghe di grafici semplici i cui cambiamenti da frame a frame sono minimi. Quello che segue è un esempio simulato di moto Browniano. Specificando il numero di punti, n = 20 e la temperatura o la velocità, s =.02 Il miglior valore per questi due parametri dipendono dalla velocità dello specifico computer sul quale viene eseguita la simulazione. Si generano n punti con le coordinate (x,y) casualmente comprese tra -1/2 +1/2 x = rand(n,1)-0.5; y = rand(n,1)-0.5; Si tracciano i punti in un quadrato con i lati che vanno da 1 a 1. Si salva l handle per il vettore di punti e si setta EraseModo a XOR. Queste fa si che il sistema grafico di MATLAB non ritracci l intero grafico ma soltanto le coordinate dei punti che sono cambiati, tuttavia per cancellare i punti gia tracciati utilizzando l operatore "exclusive or". h = plot(x,y,'.'); axis([-1 1-1 1]) axis square grid off set(h,'erasemode','xor','markersize',18) Adesso si incomincia con l animazione. Segue un loop infinito while, questo si può eventualmente bloccare digitando <ctrl>-c. Ogni volta nel ciclo, si aggiunge un piccolo disturbo alle coordinate dei punti. È questo direttamente sulle coordinate dei punti. while 1 x = x + s*randn(n,1); y = y + s*randn(n,1); set(h,'xdata',x,'ydata',y) end Filmati Se si incrementa il numero di punti nell esempio del moto Browniano portandolo n=300, il movimento non sarà fluido; occorrerà del tempo per tracciarlo ad ogni singolo passo. E più efficiente salvare un predeterminato numero di frame come come bitmap e lo salva come un filmato. Primo, si fissa un numero di frame nframes = 50 poi, si inizializzano i punti come fatto in precedenza, eccetto che per l uso di EraseMode. x = rand(n,1)-0.5; y = rand(n,1)-0.5; 6
h = plot(x,y,'.') set(h,'markersize',18) axis([-1 1-1 1]) axis square grid off Ora, si alloca abbastanza memoria per salvare completamente il filmato, M = moviein(nframes) Questo alloca una grande matrice con un numero di colonne pari a nframes. Ogni colonna è lunga abbastanza per salvarci un frame. L ammontare totale di memoria è proporzionale al numero di frames, e all area degli assi; ma è indipendente dalla particolare complessità del grafico. Ad esempio per 50 frame e una dimensione degli assi di default, occorrono più di 7.5 megabytes di memoria. Questo esempio utilizza assi quadrati, che sono leggermente più piccoli, cosi sono necessari solo 6 megabytes di memoria. Si genera il filmato e si usa getframe per catturare ogni frame. for k = 1:nframes x = x + s*randn(n,1); y = y + s*randn(n,1); set(h,'xdata',x,'ydata',y) M(:,k) = getframe; end In fine si riproduce la sequenza di fotogrammi come filmato: movie(30) 7