SECONDO PROGETTO DI INTERFACCE - A.A. 2001-2002 - VECCHIO ORDINAMENTO
SECONDO PROGETTO DI RECUPERO
CORSO DI INTERFACCE - A.A. 2001-2002
VECCHIO ORDINAMENTO
OBIETTIVO
Creare un programma che legge un file di input contenente un istogramma
tridimensionale, lo visualizza, e
consente all'utente di agire sulla scena visualizzata.
Un istogramma tridimensionale e' rappresentato da una griglia
di NX x NY caselle quadrate ciascuna delle quali
ha associato un numero non negativo.
Il numero rappresenta l'altezza z dell'istogramma su quella casella.
FUNZIONALITA' DEL PROGRAMMA
-
Visualizzare l'istogramma come un insieme di prismi retti a
base quadrata, ciascuno costruito su una casella quadrata
della griglia con altezza proporzionale al valore associato
alla casella.
L'istogramma deve essere visualizzato
sotto l'influsso di una trasformazione di proiezione
ortogonale o prospettica (come preferite), il punto
di vista non puo' giacere nel semispazio sotto l'istogramma.
-
Illuminarli con una sorgente all'infinito che emetta luce ambiente e
luce diffusa, in modo da creare effetto 3D.
Prevedere le modalita' di visualizzazione "flat shading"
(facce piatte).
-
Permettere varie modalita' di colorazione dei prismi:
-
modalita' in cui ciascun prisma e' colorato con un colore a caso,
d'ora in poi chiamata colorazione casuale
-
modalita' in cui ciascun prisma e' colorato con un colore
dipendente dal valore numerico associato,
d'ora in poi chiamata colorazione per altezza
Una volta entrati in colorazione casuale,
il colore dei prismi deve rimanere
lo stesso nei successivi ridisegnamenti della finestra.
Se si passa in colorazione per altezza e poi si torna in colorazione
casuale, il colore dei prismi cambia secondo una nuova scelta casuale.
Sia [min,max] l'intervallo di valori assunti dai prismi.
In colorazione per altezza il colore di un prisma che ha il valore z viene
assegnato come segue:
- la componente rossa e' 0 se z = min, 1 se z = max, ed e' interpolata
linearmente se z assume valori intermedi
- la componente verde e' 0 se z = min e se z = max,
e' 1 se z = 0.5*(min+max) ed e' interpolata linearmente
se z assume valori intermedi
- la componente blu e' 1 se z = min, 0 se z = max, ed e' interpolata
linearmente se z assume valori intermedi
Si veda il grafico:
L'utente imposta la modalita' di colorazione
premendo i tasti
- "r" (random) per colorazione casuale
- "h" (height) per colorazione per altezza
-
Permettere all'utente di ruotare la scena muovendo il
mouse a bottone premuto:
- spostare il mouse verso l'alto o il basso fa ruotare l'oggetto
attorno ad un asse passante per il centro dell'oggetto e
parallelo alla larghezza della finestra
- spostare il mouse verso destra o sinistra fa ruotare l'oggetto
attorno ad un asse passante per il centro dell'oggetto e
parallelo all'altezza della finestra
L'interazione deve essere gestita in modo tale da
non permettere all'utente di guardare l'istogramma "dal di sotto".
-
Permettere all'utente di eseguire zoom per ingrandire/rimpicciolire
l'immagine della scena.
L'ingrandimento/riduzione avvengono quando l'utente preme i
tasti '+' e '-' rispettivamente.
La scena rimane centrata nella finestra.
-
Permettere all'utente di selezionare un prisma:
un prisma e' inizialmente selezionato ed indicato con
un elemento grafico (punto, freccia...).
L'utente puo' muovere la selezione premendo i tasti freccia.
Non deve essere consentito uscire dai limiti della griglia.
-
Permettere all'utente di alzare o abbassare l'altezza del prisma
selezionato premendo i tasti PageUp e PageDown.
L'altezza di un prisma non puo' diventare negativa.
Se siamo in colorazione per altezza, il colore del prisma deve
cambiare di conseguenza.
MATERIALE FORNITO
(1) Il modulo di lettura
Sono forniti i file readgrid.h
e readgrid.c che leggono la griglia da file.
Il file readgrid.c potete considerarlo come scatola
nera (NON GUARDATELO NEMMENO!) che contiene l'implementazione
di quanto dichiarato in readgrid.h.
Il file readgrid.h dichiara:
-
la funzione read_grid(FILE * fd),
che legge il file di input e carica le quote in una matrice 2D,
inizializzando anche le variabili che memorizzano le due dimensioni
di tale matrice,
vedere i COMMENTI NEL FILE che spiegano come si chiamano queste variabili.
-
alcune variabili globali utili (come
gli estremi della bounding box della scena, vedere
i COMMENTI NEL FILE), che sono anch'esse
inizializzate dalla funzione read_grid mentre legge le quote.
NON MODIFICATE questi due file.
Il vostro programma andra' a costituire un altro modulo,
chiamiamolo xxxx.c, che conterra' in testa la linea
#include "readgrid.h", e
dovra' essere compilato linkandolo con readgrid.c.
Vi forniamo il Makefile adatto a questo.
Si compilera' con: make xxxx, creando l'eseguibile xxxx.
Nota bene: se il vostro programma non si chiama xxxx.c dovete editare
il Makefile e sostituire xxxx con il nome vero.
(2) File di input
Il formato dei file di input e' il seguente:
NX
NY
V11
V12
...
V21
V22
...
dove NX ed NY sono il numero di caselle
sul lato di griglia parallelo all'asse x e su quello
parallelo all'asse y, e Vij e' l'altezza associata
alla casella di posizione i lungo l'asse x e j lungo l'asse y.
Sono dati alcuni file, altri ne potete scrivere voi.
I file con nome iniziante per "r" contengono numeri casuali,
il file con nome iniziante per "m" rappresenta una porzione
di un terreno. I due numeri nel nome corrispondono a NX ed NY.
CONSIGLI
La modalita' "flat shading" si ottiene dando ai quattro vertici di
ciascuna faccia di un prisma la stessa normale (direzione normale
al piano della faccia).
La normale si calcola facilmente perche' le facce sono
perpendicolari agli assi coordinati.
Usare due DISPLAY LIST per i prismi, una per il colore casuale e
una per il colore secondo l'altezza,
e chiamarle sotto l'influsso
di diverse trasformazioni di modellazione.
La display list con colori casuali va ricreata ogni volta
che l'utente sceglie questo tipo di colorazione, generando
nuovi valori casuali.
Per generare valori casuali esistono funzioni predefinite in C
(chiamare il manuale on-line con parola chiave rand o srand,
per esempio man rand, per avere le istruzioni).
Come luce all'infinito (punto 2)
potete usare la GL_LIGHT0 coi parametri di default, ma METTETELA
ALL'INFINITO DIETRO L'OSSERVATORE (es. in 0,0,-1 se guardate da
z=-infinito) altrimenti potrebbe cadere dietro o dentro l'oggetto).
Per catturare le pressioni dei tasti ordinari in Glut usare la callback
Keyboard function, per i tasti freccia e page-up page-down
usare la Special key function.
Per catturare lo spostamento del mouse a bottone premuto usare
Motion function.
Per semplicita', fate in modo che il vostro programma
legga la griglia da standard input, chiamando
read_grid(stdin) e poi redirezionare lo standard
input da command-line.
MATERIALE DA CONSEGNARE
- Il sorgente C (tutti i .c e .h che ne fanno parte),
su dischetto o per email.
- Solo se lo si ritiene necessario, brevissime istruzioni per l'uso
dell'interfaccia, in testo ascii o html, su dischetto o per email.
L'indirizzo di posta elettronica a cui spedire e'
magillo@disi.unige.it.
Indicare chiaramente nel messaggio il nome dei componenti del gruppo e
l'elenco dei file inviati.
NON reinviare i file readgrid.h e readgrid.c che fanno parte del materiale
fornito.