Si continua dai file dell'esercitazione precedente.
Inoltre (per la terza tappa) i file datafun.h
e datafun.c
definiscono la classe DataFunction che implementa una
funzione graficabile costruita per interpolazione da un insieme di
dati di rilevamento. I dati di rilevamento devono essere letti da file
usando un metodo apposito della classe DataFunction.
Dividete l'area di lavoro in due parti, entrambe visualizzano il grafico della stessa funzione sotto l'influsso di diverse trasformazioni di proiezione:
Inizialmente cercate di produrre due viste dello stesso grafico
sotto le stesse trasformazioni, quelle usate nell'esercizio 5.
Successivamente (ved. tappa 2) imposterete le trasformazioni come
richiesto.
Mostrate un titoletto su ciascuna delle due parti che dica di che vista si tratta.
Mettete il disegno del grafico in una display list che sara'
chiamata per disegnare tutte le viste usando in ciascuna vista
le trasformazioni opportune.
La funzione di disegno nella classe "disegnatrice" ora
non disegna piu' il grafico ma genera la display list,
e va chiamata una sola volta all'inizio.
Le funzioni di disegno delle due viste (per ora una)
chiameranno la display list gia' creata.
Realizzate ora la vista ortogonale e quella prospettica.
Nella vista ortogonale visualizzate in sovraimpressione
la semiretta radiale diretta
dal centro della scena verso la posizione del punto di vista.
Questo aiuta a capire da che parte stiamo guardando il grafico.
Perche' si veda sempre, anche quando il punto di vista e' sotto al
grafico, potete disegnarla con z = il massimo.
Permettete all'utente di cambiare a run-time la funzione di cui si visualizza il grafico. Questa puo' essere una funzione analitica (per es. le due suggerite nell'esercizio precedente) oppure una funzione da dati campionati (nuova classe DataFunction) letta da file.
Per le funzioni campionate l'utente deve specificare il nome del file da cui caricare i dati. Inizialmente potete prevedere una scelta obbligata fra un insieme prefissato di nomi. Potete mettere un menu' con una voce "scegli funzione" e un sotto-menu' contenente le varie opzioni (equazioni o nomi di file).
Sono dati due file di esempio:
data10.txt (contiene 10x10 punti di fantasia) e
marcy100.txt (contiene 100x100 punti
campionati da Mount Marcy, USA).
Notate che il numero di righe e colonne della griglia usata per la
visualizzazione puo' essere scelto
indipendentemente dal numero di punti contenuti nel file.
Pero' e' meglio che la griglia NON sia piu' fitta
dei dati, altrimenti avremo un effetto a scalini dovuto al
fatto che vertici adiacenti ricevono per interpolazione
lo stesso valore.
Il numero di punti campionati lungo la x e la y si puo' ottenere con
apposite funzioni della classe DataFunction.
Permettete la presenza contemporanea di piu' grafici.
Potete prevedere un massimo per es. di 5 grafici e tenerli in un array
(come facevate con le primitive nel caso 2D).
L'utente puo' selezionare un grafico alla volta e
mostrarlo / nasconderlo,
cambiare la funzione, cambiare gli attributi.
Inizialmente selezionate il grafico corrente da
menu' in base a sua etichetta numerica, successivamente
permettete di selezionarlo anche mediante click del mouse.
Inserite nella finestra un'area messaggi che mostra informazioni di stato:
(1)
Permettete all'utente di digitare il nome del file da cui caricare
una funzione campionata.
Quando l'utente seleziona questa opzione,
si attiva una keyboard callback che accetta un carattere alla volta,
formando man mano il nome del file (che viene mostrato all'utente
nell'area messaggi),
fino alla pressione del ritorno a capo.
Quando l'utente preme il ritorno a capo, il programma prova a caricare
la funzione dal file. In caso di successo, mostra il grafico.
In ogni caso, mostra nell'area messaggi un messaggio con
l'esito dell'operazione (successo o fallimento).
(2)
Permettete all'utente di sottoporre a trasformazioni un grafico:
Le trasformazioni sono di modellazione,
agiscono sul grafico selezionato e non sugli altri.
Le trasformazioni impostate permangono dopo che il solido e' stato
disselezionato.
A tale scopo la classe "disegnatrice" dovra' memorizzare i parametri
di queste trasformazioni.
Ricordate che l'ordine in cui applicate le trasformazioni e' rilevante!