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

  1. 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.

  2. 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).

  3. Permettere varie modalita' di colorazione dei prismi:

    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:

    Si veda il grafico:

    L'utente imposta la modalita' di colorazione premendo i tasti

  4. Permettere all'utente di ruotare la scena muovendo il mouse a bottone premuto: L'interazione deve essere gestita in modo tale da non permettere all'utente di guardare l'istogramma "dal di sotto".

  5. 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.

  6. 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.

  7. 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:

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

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.