Esercitazione di recupero del corso di
Interazione Uomo-Macchina: Interfacce Grafiche
Modalita' di lavoro
A gruppi composti da non piu' di tre persone.
I gruppi possono non essere gli stessi delle esercitazioni guidate.
Inoltre e' possibile farla a casa, anche per conto proprio
(non in gruppo).
Per favore segnalatemi la composizione dei gruppi.
Data di consegna
Indice
Lavoro da svolgere
Realizzare un'interfaccia grafica per un'applicazione per la
visualizzazione e
modifica interattiva di un modello di superficie (terreno)
basato su griglia regolare.
Descrizione dell'applicazione
L'applicazione lavora su dati altimetrici capionati su una griglia
regolare di rettangoli: ad ogni nodo (i,j) della griglia e'
associato un valore di quota z[i,j].
L'applicazione deve poter visualizzare tali dati in due
modalita':
-
in modalita' wireframe, sotto forma di un reticolo dove
ogni punto (i,j,z[i,j]) e' unito mediante segmenti ai suoi
vicini nei quattro punti cardinali, cioe' ai punti (i,j',z[i,j'])
con j'=+-j e (i',j,z[i',j]) con i'=+-i.
-
in modalita' solid, riempiendo ogni maglia della griglia con due
triangoli. Ogni maglia quadrata definita da quattro nodi
(i,j) (i+1,j) (i+1,j+1) (i,j+1) viene divisa in due triangoli
tracciando una delle due diagonali, tali triangoli sono poi
trasportati in 3 dimensioni aggiungendo i valori di quota
z[i,j], z[i+1,j], z[i+1,j+1], z[i,j+1] ai loro vertici.
Inoltre l'applicazione deve permettere all'utente di selezionare un
nodo (i,j) della griglia e cambiarne il valore di quota z[i,j].
L'applicazione ripercuote tale modifica mediante una qualche legge
su tutti gli altri nodi della griglia, ottenendo un effetto di
deformazione della superficie.
Funzionalita' dell'interfaccia
L'applicazione deve permettere di:
-
caricare una griglia contenuta in un file
(eventualmente rimpiazzandone
un altra precedentemente caricata)
-
visualizzare la griglia in 3D in modalita' wireframe o solid,
come spiegato sopra
-
compiere operazioni grafiche sulla griglia visualizzata (ved. dopo)
-
compiere operazioni di deformazione sulla griglia (ved. dopo)
-
selezionare la legge di propagazione da utilizzare per
la deformazione della griglia
-
salvare la griglia corrente (eventualmente modificata) in un file
L'interfaccia deve dare la possibilita' all'utente di
compiere sulla scena le sequenti operazioni grafiche:
-
muovere il punto di vista facendolo "orbitare" attorno alla scena
per vedere la scena da un'angolazione diversa (sempre in 3D)
-
visualizzare la proiezione della scena sul piano x-y
-
modificare il colore con cui viene visualizzata la griglia
nelle due modalita' wireframe e solid
-
variare il fattore di scala con cui sono visualizzate le quote
rispetto alle due coordinate piane x,y
La scena deve essere inizialmente visualizzata in 3D con
un rapporto di scala tra quote ed x,y e con
trasformazioni di vista e proiezione tali che la scena
sia chiaramente e completamente visibile e non troppo "lontana"
rispetto all'osservatore.
Poiche' e' prevista la possibilita' di visualizzare oggetti
in modalita' solid, dovranno anche usate una o piu'
luci per l'illuminazione.
L'interfaccia deve dare la possibilita' all'utente di
compiere sulla griglia
operazioni di deformazione, nel modo seguente:
-
l'utente sceglie un nodo, anche semplicemente introducendone
i due indici (i,j) nella griglia; il nodo deve essere un nodo
interno, ovvero non giacente sul contorno della griglia
-
l'interfaccia evidenzia nell'immagine
il punto P corrispondente al nodo scelto
-
a questo punto l'utente puo' introdurre un incremento o decremento
di quota
-
l'interfaccia evidenzia lo spostamento nell'immagine
(per es. visualizzando un segmento che unisce il punto P a
quella che sarebbe la sua nuova posizione)
-
se l'utente decide di eseguire, allora si effettua la modifica:
l'applicazione assegna al nodo (i,j)
la nuova quota e ricalcola per propagazione
le quote di tutti gli altri punti della griglia
-
a questo punto occorre rivisualizzare la griglia modificata
Materiale fornito
Viene fornita una classe Java Terreno che implementa
le strutture dati e le funzioni
dell'applicazione relative alla lettura e scrittura
del terreno e alla sua modifica.
La classe e' contenuta nel file Java (gia' compilato)
Terreno.class.
La classe Terreno e' cosi' strutturata.
Variabili
-
Costanti intere che indicano le possibili leggi di propagazione
delle modifiche:
- NO_LAW: nessuna propagazione
- LINEAR_LAW: propagazione con legge lineare
- QUADR_LAW: propagazione con legge quadratica
- SQROOT_LAW: propagazione con legge della radice quadrata
Metodi
- boolean loadGrid(String filename):
Carica una griglia di punti con relative quote dal file di
nome filename.
Ritorna true se il caricamento e' stato effettuato
con successo, false altrimenti.
- int numRows(), int numColumns():
Ritorna il numero di righe e colonne della griglia di punti.
Se I e J sono i valori ritornati dalle due funzioni, un nodo
della griglia e' identificato da una coppia di
interi (i,j) con i da 0 a I-1 e j da 0 a J-1.
- float getHeight(int i, int j):
Ritorna il valore di quota z[i,j] di un nodo (i,j) della griglia.
- float minHeight(), float maxHeight():
Restituisce la minima e la massima quota fra quelle associate
a nodi della griglia.
- boolean setHeight(int i, int j, float newZ):
Assegna un nuovo valore di quota al nodo (i,j) della griglia,
e propaga tale modifica ripercuotendola sulle quote degli altri
nodi della griglia in base alla legge di propagazione correntemente
selezionata. Il nodo (i,j) deve essere un nodo interno, non sul
contorno della griglia.
Ritorna true se l'operazione ha successo, false
altrimenti.
- boolean setLaw(int law):
Stabilisce la legge per la propagazione delle modifiche di quota.
Il parametro law puo' assumere come valore una
delle costanti NO_LAW, LINEAR_LAW, QUADR_LAW, SQROOT_LAW.
Ritorna true in caso di successo, false altrimenti.
Il valore di default, ristabilito automaticamente dall'applicazione
al caricamento di una griglia, e' NO_LAW.
- void unloadGrid():
Scarica la griglia eventualmente presente. Riporta la legge di
propagazione al suo valore di default, NO_LAW.
- boolean writeGrid(String filename):
Salva la griglia correntemente in memoria sul file di nome
filename.
Ritorna true in caso di successo, false altrimenti.
Sono anche forniti
alcuni file di input contenenti griglie che possono
essere caricate dall'applicazione:
Raccomandazioni
Questo e' un progetto di interfacce grafiche.
Pertanto, sara' tenuto conto non solo del fatto che tutte le
funzioni richieste siano presenti nell'interfaccia
sviluppata, ma anche e di quanto facile e gradevole
risulta l'uso dell'interfaccia stessa per l'utente.
Materiale da consegnare
-
Il sorgente .java ed il compilato .class di ciascuna classe
sviluppata per creare l'interfaccia.
-
Solo se necessarie,
brevissime istruzioni per l'uso scritte in formato di testo ASCII
o HTML.
Queste istruzioni devono essere pensate per una persona che
conosce bene l'applicazione e vuole imparare velocemente ad
usare l'interfaccia.
Il materiale puo' essere consegnato su dischetto o spedito per EMAIL
all'indirizzo magillo@disi.unige.it.
Indicare chiaramente i nomi dei componenti del gruppo
e l'elenco dei file.