z - Ambiente Como - Politecnico di Milano

Transcript

z - Ambiente Como - Politecnico di Milano
POLITECNICO DI MILANO
Facoltà di Ingegneria
Dipartimento di Elettronica
TECNICHE DI VISUALIZZAZIONE SU
INTERNET DI MODELLI DI
INQUINAMENTO
Relatore: Prof. Giorgio GUARISO
Tesina di Laurea di:
Paolo MIDALI
Matr. n. 600539
Anno Accademico 1998-1999
Sommario
Introduzione
vii
Scopo del lavoro
vii
Specifiche del programma
vii
Organizzazione dei capitoli
ix
Capitolo I
1.1
Modello teorico
1
Calcolo della concentrazione con il modello gaussiano
1
1.1.1
Modello Gaussiano standard
1
1.1.2
Modello Gaussiano con terreno riflettente
3
1.1.3
Modello gaussiano, in presenza di inversioni in quota
5
1.2
Stabilità atmosferica
7
1.3
Profilo verticale della velocità del vento (V)
9
1.4
Altezza effettiva della sorgente (He)
1.4.1
Pennacchi galleggianti
11
11
1.4.1.1
Atmosfera neutra
12
1.4.1.2
Atmosfera stabile
13
1.4.1.3
Atmosfera instabile
13
1.4.2
Pennacchi tipo jet
14
1.4.3
Presenza di uno strato di inversione in quota
14
Determinazione dei coefficienti di dispersione (σy e σz)
16
1.5
1.5.1
Pasquill-Gifford
16
1.5.2
Brookhaven National Laboratory (BNL)
17
1.5.3
Tennessee Valley Authority (TVA)
18
iii
Sommario
1.5.4
1.6
Briggs open-country, Briggs urban
Elenco dei simboli utilizzati
Capitolo II
18
20
Implementazione
22
2.1
Linguaggi utilizzati
22
2.2
Strumenti utilizzati
24
2.2.1
Java
24
2.2.2
Vrml
26
2.2.3
Html
27
2.2.4
Files di testo
28
2.2.5
Interazione tra Java e Vrml
28
Fasi di sviluppo del programma
30
2.3
2.3.1
Prove su “Excel” e “Matlab”
30
2.3.2
Sviluppo di applicazione in Java, con input/output su file
30
2.3.2
Aggiunta di una interfaccia grafica all’applicazione
31
2.3.4
Generazione della vista tridimensionale, in
modalità “wireframe”, con uscita su file
2.3.5
32
Generazione della vista tridimensionale con
visualizzazione della superficie
33
2.3.6
Conversione dell’applicazione in applet
34
2.3.7
Tentativo di integrazione con il browser vrml
35
2.3.8
Riscrittura dell’applet utilizzando i componenti Awt
35
2.3.9
Generazione dinamica della vista tridimensionale,
con utilizzo dell’ “External Authoring Interface” (EAI),
e aggiunta di una componente stocastica
2.4
Struttura del programma
2.4.1
36
38
Struttura generale del programma
iv
38
Sommario
2.4.1.1
Interfaccia grafica
38
2.4.1.2
Classe di controllo (“controllore”)
39
2.4.1.3
Logica del programma
39
2.4.2
Struttura dell’interfaccia grafica
40
2.4.3
Struttura del controllore
43
2.4.4
Struttura della logica del programma
46
2.5
2.4.4.1
Package “utilita”
46
2.4.4.2
Package “sorgenti”
48
2.4.4.3
Package “grafica”
57
2.4.4.4
Package “vrml_fumo”
59
Note operative
67
2.5.1
Files componenti il progetto
67
2.5.2
Istruzioni per la compilazione del programma
69
2.5.2.1
Compilazione con JDK
69
2.5.2.2
Compilazione con JBuilder
69
2.5.2.3
Creazione dell’archivio “.jar”
70
2.5.3
Definizione dei parametri
71
2.5.3.1
Parametri Sorgente
72
2.5.3.2
Profilo Vento
73
2.5.3.3
Innalzamento/Inversione
74
2.5.3.4
Dispersione
75
2.5.3.5
Vrml
75
Capitolo III
Esempi di utilizzo
77
Capitolo IV
Conclusioni
87
4.1
Prestazioni e dimensioni del programma
77
4.2
Resa grafica
88
v
Sommario
Appendice A Il linguaggio Vrml
90
Introduzione al linguaggio
90
Il sistema di coordinate in Vrml
90
Struttura di un file Vrml
91
Nodi utilizzati nel progetto
94
Transform
94
Shape
95
Billboard
96
Background
97
DirectionalLight
97
NavigationInfo
98
Viewpoint
98
Il comando “PROTO”
98
L’interfaccia EAI (External Authoring Interface)
100
Appendice B Configurazione del computer per
l’esecuzione del programma
Bibliografia
103
105
vi
Introduzione
Scopo del lavoro
Scopo del presente lavoro è lo studio della diffusione di un gas inquinante
emesso da una sorgente puntiforme in quota (ciminiera), utilizzando il
modello gaussiano.
Sono numerosi i programmi già dedicati all’analisi di questa problematica
[Guar97]; tuttavia, al momento attuale, nessuno di essi è utilizzabile tramite
Internet, e nessuno fornisce una visualizzazione tridimensionale dei risultati,
che permetta di valutare qualitativamente l’effetto della variazione dei singoli
parametri in gioco.
Si è quindi ritenuto utile indirizzare in tal senso lo sviluppo del progetto,
cercando di ottenere uno strumento che possa avere una validità anche
didattica, in virtù della sua semplicità di utilizzo e di interpretazione dei
risultati.
Specifiche del programma
Per la rappresentazione tridimensionale si è scelto di utilizzare il linguaggio
Vrml, ritenendolo adatto all’utilizzo tramite Internet, anche se caratterizzato
da una resa grafica non molto elevata.
Il programma sarà quindi utilizzabile con un normale browser Html, associato
ad un browser Vrml.
vii
Introduzione
Verranno presi in considerazione i seguenti dati meteorologici/ambientali
(stazionari):
• velocità del vento
• temperatura dell’aria
• eventuali strati di inversione in quota
• stabilità atmosferica
• conformazione (rugosità) del terreno
Verranno considerati inoltre i seguenti parametri relativi alla sorgente
(anch’essi stazionari):
• altezza e diametro della ciminiera
• temperatura e velocità di emissione dei fumi
• quantità di inquinante emesso
• tipo di pennacchio (galleggiante o jet)
Si assumeranno le seguenti ipotesi semplificative:
• velocità del vento non nulla
• terreno pianeggiante
• assenza di reazioni chimiche e fenomeni di rimozione
Si avranno due possibilità di visualizzazione dei risultati:
• mappa di concentrazione bidimensionale (riferita ad un piano che seziona
il pennacchio)
• vista tridimensionale della superficie che delimita il pennacchio, con
opacità variabile proporzionalmente alla concentrazione dei fumi, e con
aggiunta di una componente stocastica per aumentare il realismo della
scena
viii
Introduzione
Sarà possibile intervenire su numerosi parametri relativi alla visualizzazione, al
fine di ottenere una rappresentazione soddisfacente.
Per la vista bidimensionale le possibilità saranno:
• estremi del piano di sezione
• numero di suddivisioni da effettuare
• estremi della scala di concentrazione (automatici o specificati dall’utente)
• visualizzazione del profilo verticale del vento
• scalatura automatica o manuale dei valori di concentrazione
Per la vista tridimensionale:
• visualizzazione di una freccia indicante la direzione e il verso del vento
• visualizzazione di un riferimento coincidente con il piano di sezione
bidimensionale
• regolazione dell’intensità della variazione stocastica della superficie del
pennacchio
Organizzazione dei capitoli
Nel Capitolo 1 (“Modello Teorico”) verrà fornita una descrizione del modello
gaussiano, su cui si basa tutto il presente lavoro, e dei parametri che ne
influenzano i risultati.
Sarà presente una sintesi delle equazioni fondamentali, considerando la
riflessione delle particelle di inquinante sul terreno e l’eventuale presenza di
uno strato di inversione in quota.
Si analizzeranno poi la stabilità atmosferica, il profilo verticale della velocità
del vento, l’altezza effettiva della sorgente (quindi il sovrainnalzamento del
pennacchio, sia per pennacchi galleggianti che per pennacchi di tipo “jet”), e
vari modelli per il calcolo della dispersione.
Verrà infine fornito un elenco dei simboli utilizzati nelle equazioni.
ix
Introduzione
Il Capitolo 2 (“Implementazione”) sarà dedicato alla descrizione della
struttura interna del programma e alla cronologia del suo sviluppo.
Inizierà con una descrizione dei linguaggi e degli strumenti utilizzati;
proseguirà con una schematizzazione delle varie fasi in cui si è sviluppata la
realizzazione (prove di calcolo, creazione dei primi prototipi, sviluppo di
un’applicazione stand-alone, sviluppo dell’applet integrata con il browser
Vrml), e dell’organizzazione interna del programma definitivo (suddivisione
dei compiti, elenco di packages e classi, descrizione dei compiti delle singole
classi e stralci di codice significativo).
Terminerà con le istruzioni per la compilazione del programma, e con un
breve manuale utente.
Il Capitolo 3 (“Esempi di utilizzo”) presenterà, appunto, alcuni esempi di
utilizzo del programma, in condizioni ritenute significative, specificando i
parametri impostati ed evidenziando i risultati grafici conseguenti, con viste
bidimensionali e tridimensionali.
Il Capitolo 4 (“Conclusioni”) sarà dedicato ad un’analisi critica dei risultati
ottenuti, sotto vari punti di vista (rispondenza alle specifiche iniziali,
prestazioni, dimensioni dei files, resa grafica), delle possibilità di sviluppo, dei
tentativi effettuati e rivelatisi poco praticabili.
L’appendice A sarà costituita da una rapida introduzione al linguaggio Vrml
(con particolare riferimento alle caratteristiche effettivamente utilizzate nel
programma), e all’interfaccia EAI per l’interazione con il linguaggio Java.
L’appendice B illustrerà la configurazione del computer necessaria per
eseguire il programma.
x
Capitolo I
Modello teorico
1.1
1.1.1
Calcolo della concentrazione con il modello gaussiano
Modello Gaussiano standard
Il calcolo della concentrazione è stato effettuato basandosi sul modello
gaussiano [Finz91, Ster76], derivato, con opportune ipotesi semplificative,
dalla soluzione dell’equazione di diffusione:
∂C ∂t + Vx ∂C ∂x + V y ∂C ∂y + Vz ∂C ∂z =
∂[K xx ∂C ∂x ] ∂x + ∂[K yy ∂C ∂y ] ∂y + ∂[K zz ∂C ∂z ] ∂z + S (x, y, z , t )
(1)
essendo:
C (x, y , z , t )
= concentrazione di inquinante nel punto di coordinate (x,y,z),
al tempo t
Vi
= velocità media del vento nella direzione i (i = x, y, z)
K jj
= coefficiente di diffusione turbolenta nella direzione jj (jj =
xx,
yy, zz)
S (x, y , z, t )
= portata della sorgente di inquinante nel punto di coordinate
(x,y,z), al tempo t
Le ipotesi semplificative assunte per il caso in esame sono le seguenti:
1) il processo è stazionario (∂C ∂t = 0)
1
Capitolo I
Modello teorico
2) il vento è costante nel tempo e nello spazio, e con intensità non nulla solo
lungo la direzione x (V y = Vz = 0), (Vx = V = k )
3) nella direzione x, il trasporto dovuto al vento è preminente rispetto a
quello dovuto alla turbolenza (∂[K xx ∂C ∂x ] ∂x << Vx ∂C ∂x )
4) i coefficienti di diffusione, K yy e K zz , sono costanti in y e z
5) la sorgente è costante nel tempo e puntiforme, con valore non nullo (pari
a Q) solamente nel punto di coordinate (0,0,0).
L’equazione (1) diviene di conseguenza:
Vx ∂C ∂x = K yy ∂ 2 C ∂y 2 + K zz ∂ 2C ∂z 2 + S (x, y , z )
(2)
Con le opportune condizioni al contorno:
C (0, y , z ) = C f
per
y, z ≠ 0
C (x, y , z ) = C f
per
y, z → ±∞ ,
la soluzione analitica risulta essere:
[
]
C (x, y , z ) = [Q (2πVσ yσ z )]⋅ exp − 1 2(y 2 σ 2 y + z 2 σ 2 z ) + C f
(3)
ovvero una gaussiana doppia, con deviazioni standard σ y e σ z ,
essendo
Cf
= concentrazione di fondo di inquinante in atmosfera,
σ 2 y = 2 K yy ⋅ (x V ) ,
σ 2 z = 2 K zz ⋅ (x V )
(4)
L’equazione (3) presuppone quindi che la sorgente di inquinante sia posta
2
Capitolo I
Modello teorico
nell’origine degli assi coordinati, e che la diffusione possa avvenire
indefinitamente verso l’alto e verso il basso.
Nella realtà bisogna tenere conto della presenza del terreno, che riflette parte
dell’inquinante, per cui si procede a modificare opportunamente l’equazione
(3).
1.1.2
Modello Gaussiano con terreno riflettente
Si suppone che l’emissione avvenga ad una quota z=He (essendo He l’altezza
effettiva della sorgente), e si considera il suolo totalmente riflettente nei
confronti delle particelle di inquinante che lo raggiungono.
Il contributo dato dalla riflessione si può immaginare equivalente a quello
dato da una sorgente virtuale posta alla quota z=-He, per cui l’equazione (3)
assume la seguente forma:
[
]
C (x, y , z ) = [Q (2πVσ yσ z )]⋅ exp − 1 2(y 2 σ 2 y ) ⋅
{exp[− 1 2((z − H
e
)2
)]
[
(
)]}
σ 2 z + exp − 1 2 (z + H e ) σ 2 z + C f
2
(5)
Una formulazione analoga si otterrà anche nel caso in cui si consideri la
presenza di strati di inversione termica e di inversione in quota, come verrà
mostrato successivamente.
Per mostrare la diversa distribuzione di inquinante che risulta dalle eq. (3) e
(5), si propongono di seguito due esempi di risultati ottenibili.
In questo caso si ignora la presenza del terreno, per cui la distribuzione di
inquinante risulta simmetrica, lungo la direzione x, rispetto alla sorgente:
3
Capitolo I
Modello teorico
Figura 1 – Distribuzione derivante dal modello gaussiano standard
In quest’altro caso, invece (senza variare i parametri), si prende in
considerazione la presenza del terreno, e lo si considera totalmente riflettente.
Risulta evidente il contributo della sorgente virtuale posta alla quota z=-He:
Figura 2 - Distribuzione derivante dal modello gaussiano con terreno riflettente
4
Capitolo I
Modello teorico
Per la determinazione dei parametri presenti nell’equazione (ovvero
V , σ y , σ z , H e ) si è fatto riferimento ad alcune delle metodologie più accettate in
letteratura, riportate nelle sezioni successive.
1.1.3
Modello gaussiano, in presenza di inversioni in quota
La trattazione è simile alla precedente, considerando però che il pennacchio
non è più libero di espandersi indefinitamente verso l’alto.
Si può estendere il modello utilizzato per tener conto della riflessione al suolo,
valutando ora la presenza di un secondo strato riflettente, in quota; il
pennacchio continuerà a rimbalzare tra i due strati, e la formulazione corretta
per definire la concentrazione risulta quindi la seguente:
[
]
C (x, y , z ) = [Q (2πVσ yσ z )]⋅ exp − 1 2(y 2 σ 2 y ) ⋅
[
)]
(
[
)]
(
 +∞

2
2
2
2
 ∑ exp − 1 2 (z − H e + 2 ⋅ J ⋅ hi ) σ z + exp − 1 2 (z + H e + 2 ⋅ J ⋅ hi ) σ z  + C f
 J = −∞

essendo
(6)
hi la quota dello strato di inversione.
Come si può notare, la formula assume la presenza di infinite sorgenti virtuali,
poste a quota ± H e ( J = 0 ), # 2hi ± H e ( J = ±1 ), e così via.
La serie converge generalmente con pochi termini ( J = 1,2,3 ), e la
distribuzione verticale della concentrazione di inquinante tende ad
uniformarsi allontanandosi dalla sorgente. E’ quindi ragionevole considerarla
uniforme al di là di un certo valore della coordinata x.
Se X L è la distanza a cui il pennacchio raggiunge per la prima volta lo strato di
inversione, si assume costante la distribuzione verticale per x > 2 ⋅ X L ,
ottenendo la formulazione seguente:
[ (
C (x, y , z ) = Q
)]
[
]
2π ⋅ V ⋅ hi ⋅ σ y ⋅ exp − 1 2(y 2 σ 2 y ) + C f
5
(7)
Capitolo I
Modello teorico
Per definire il valore di X L , si assume convenzionalmente che il bordo del
pennacchio sia definito da una concentrazione pari a 1/10 di quella massima
(centrale), e si ricava che X L è quella distanza per cui
σ z = (hi − H e ) 2.15
(8).
Quindi, si utilizza la formula (6) fino alla distanza X L , la (7) oltre la distanza
2 ⋅ X L , e un’interpolazione tra le due per le distanze intermedie.
Un esempio dei risultati ottenuti è mostrato nella seguente immagine, in cui è
possibile apprezzare la fase di transizione tra le zone a distribuzione verticale
uniforme e variabile (corrispondente approssimativamente all’intervallo
205 ≤ x ≤ 410 m):
Figura 3 - Distribuzione derivante dal modello gaussiano, con terreno riflettente e strato di
inversione in quota
6
Capitolo I
1.2
Modello teorico
Stabilità atmosferica
Il gradiente di temperatura adiabatico è definito da
γ = − ∂T ∂z = g C p ≈ 0.0098° C m
(9)
essendo
T = temperatura della particella d’aria
z
= quota della particella
g = accelerazione di gravità
C p = calore specifico a pressione costante
In caso di atmosfera neutra si ha quindi una diminuzione di circa 1°C ogni
100 m di quota.
Si possono definire le seguenti situazioni di stabilità:
• atmosfera instabile
Il gradiente termico dell’atmosfera è minore di quello adiabatico, situazione
tipica nel periodo diurno.
Il moto verticale delle particelle d’aria viene quindi amplificato, per cui si ha
una elevata dispersione verticale.
• atmosfera neutra
Il gradiente termico è prossimo a quello adiabatico, per cui si ha una
situazione di equilibrio per le particelle.
• atmosfera stabile
Il gradiente termico dell’atmosfera è maggiore di quello adiabatico, per cui
7
Capitolo I
Modello teorico
vengono smorzati eventuali movimenti verticali delle particelle d’aria.
Si ha quindi una dispersione verticale ridotta.
• inversione in quota
Si ricade in questo caso se si è in presenza di uno strato d’aria in cui la
temperatura aumenta con la quota. In tale condizione può essere impedita la
diffusione verso l’alto delle particelle, che restano intrappolate al di sotto di
tale strato limite, con conseguente aumento della concentrazione al suolo.
• inversione al suolo
Se lo strato di inversione è a una quota inferiore a quella di emissione, la
situazione è duale rispetto alla precedente, e le particelle di inquinante
vengono riflesse verso l’alto, senza raggiungere il suolo.
Per schematizzare le varie categorie di stabilità, si fa generalmente ricorso alla
seguente corrispondenza:
Tabella 1 – Categorie di stabilità atmosferica
Categoria di stabilità
Situazione atmosferica
A
condizioni estremamente instabili
B
condizioni moderatamente instabili
C
condizioni leggermente instabili
D
condizioni neutre
E
condizioni leggermente stabili
F
condizioni stabili
8
Capitolo I
1.3
Modello teorico
Profilo verticale della velocità del vento (V)
Il profilo verticale della velocità del vento è un parametro influenzato dalla
rugosità del terreno e dalla situazione di stabilità atmosferica.
Si considerano in genere due possibilità: velocità del vento costante con la
quota, oppure variabile.
Nel primo caso si assume la velocità del vento costante a qualsiasi quota, pari
a quella rilevata nel punto di emissione dell’inquinante.
Nel secondo caso, basandosi sulla velocità alla quota di emissione, si applica
un’equazione di tipo esponenziale per calcolarla ad una quota generica:
V (z ) = V (z ') ⋅ (z z ' )
p
(10)
essendo:
V (z ) = velocità del vento alla generica quota z
V (z ') = velocità del vento misurata alla quota z ' , assunta pari alla quota di
emissione.
L’esponente p è definito in funzione della stabilità atmosferica e della rugosità
del terreno, ed i valori utilizzati sono riportati nella seguente tabella:
Tabella 2 – Valori di p, in funzione della rugosità del terreno e ella stabilità atmosferica
p
Rugosità terreno
prato rasato (z0 = 0,01 m)
terreno incolto (z0 = 0,10 m)
foresta (z0 = 1.00 m)
città (z0 = 3.00 m)
A
0,05
0,08
0,17
0,27
Stabilità atmosfera
B
C
D
neutra
instabile
0,06
0,09
0,17
0,28
9
0,06
0,11
0,2
0,31
0,12
0,16
0,27
0,37
E
F
stabile
0,34
0,32
0,38
0,47
0,53
0,54
0,61
0,69
Capitolo I
Modello teorico
Alla quota del terreno la velocità risulta nulla; per evitare che le equazioni (3,
5, 6, 7) utilizzate per il calcolo della concentrazione divergano, si assume
V (z ≤ z0 ) = V (z0 ).
Le variazioni del profilo verticale della velocità del vento diminuiscono
spostandosi verso situazioni atmosferiche di maggiore instabilità, come si può
verificare nel grafico seguente, ottenuto considerando due casi esemplificativi
(velocità vento = 5 m/s alla quota di 60m; rugosità terreno = 0,10 m; classi di
stabilità atmosferica: B, E).
Figura 4 – Variazione del profilo verticale della velocità del vento, in funzione della
stabilità atmosferica
100
stabilità: B (instabile)
((i
t bil E) (stabile)
stabilità:
90
80
70
60
q
u
o 50
t
a 40
[m]
30
20
10
0
0
1
2
3
velocità vento [m/s]
10
4
5
6
Capitolo I
1.4
Modello teorico
Altezza effettiva della sorgente (He)
All’uscita dalla ciminiera il pennacchio di fumo è soggetto ad una fase di
innalzamento, transizionale, e ad una in cui si può considerare livellato,
ovvero con l’altezza del baricentro costante.
Il parametro He, altezza effettiva della sorgente, è definito come l’altezza a cui
il pennacchio raggiunge la situazione di livellamento (convenzionalmente,
quando la pendenza scende al di sotto del 5%).
He è data dalla somma di due componenti: l’altezza geometrica della sorgente
e il sovrainnalzamento:
H e = H g + ∆H F
(11)
Si considerano generalmente due categorie principali di pennacchi:
• galleggianti (l’innalzamento è dovuto principalmente al galleggiamento del
gas)
• jet (prevale il termine cinetico, dovuto all’elevata velocità di efflusso del
gas)
Si trascurano, in questa trattazione, i possibili effetti scia della ciminiera e/o
degli edifici circostanti, significativi, rispettivamente, in caso di rapporto tra
velocità di uscita e velocità del vento ≤ 1,5, e di rapporto tra altezza della
ciminiera e degli edifici ≤ 2,5 .
1.4.1
Pennacchi galleggianti
Rientrano in questa categoria i pennacchi caratterizzati da masse elevate, con
temperatura dei fumi maggiore di quella ambiente. La massa elevata ostacola
11
Capitolo I
Modello teorico
il rimescolamento con l’atmosfera, e determina un innalzamento che si
protrae per un periodo piuttosto prolungato.
Si è utilizzata la formula di Briggs, che definisce l’innalzamento pari a:
∆H (x ) = 1.6 ⋅ Fb
13
⋅ V −1 ⋅ x 2 3
(12)
essendo
Fb = g ⋅ Vs ⋅ (D 2 4 )⋅ (Ts − T ) Ts
(13)
definito come “parametro di galleggiamento” ( Ts è la temperatura dei fumi,
T la temperatura dell’aria, D il diametro terminale della ciminiera).
1.4.1.1
Atmosfera neutra
Per quanto riguarda la distanza a cui l’asse del pennacchio si può considerare
livellato, si distinguono due sottocasi:
• Hg ≤ 305m:
x F = 6.48 ⋅ Fb
• Hg > 305m:
x F = 201 ⋅ Fb
25
25
⋅ Hg
35
(14)
(15)
Il sovrainnalzamento massimo risulta essere:
∆H F = 1.6 ⋅ Fb
13
⋅ V −1 ⋅ x F
23
(16)
In questa trattazione, si è utilizzata tale formulazione anche per il caso di
atmosfera instabile.
12
Capitolo I
1.4.1.2
Modello teorico
Atmosfera stabile
In questo caso si effettua una distinzione basata sulla velocità del vento:
• V ≥ 1 m/s:
(
xF = 2 V
S
)
(17)
quindi
F

∆H F = 2.54 ⋅  b

V
S
⋅


13
(18),
essendo
S = (g θ a )⋅ (∂θ a ∂z )
definito come “parametro di stabilità dell’atmosfera”.
θ a è la temperatura potenziale dell’aria, ovvero la temperatura che la
particella d’aria assume se viene portata adiabaticamente ad una pressione
di riferimento di 1000 hPa;
∂θ ∂z assume valore nullo nel caso di atmosfera neutra, valori positivi per
atmosfera stabile e negativi per atmosfera instabile.
• V < 1 m/s:
x F = 5.5 ⋅ Fb
−1 8
⋅ V 3 2 ⋅ S −9 16
(19)
quindi
∆H F = 5 ⋅ Fb
1.4.1.3
14
⋅ S −3 8
(20),
Atmosfera instabile
Si utilizza la formula seguente:
x F = 5.7 ⋅ Fb
[(g ⋅ H
0
⋅ hi ) (ρ a ⋅ C p ⋅ T )]
dove
H0
=
flusso di calore sensibile al suolo
13
(21),
Capitolo I
hi
1.4.2
=
Modello teorico
altezza dello strato di rimescolamento
Pennacchi tipo jet
Fanno parte di queste categoria i pennacchi per cui il sovrainnalzamento è
dovuto principalmente ad una elevata velocità di efflusso dei fumi.
La formula di Briggs è in questo caso la seguente:
∆H (x ) = 1.6 ⋅ Fm
13
⋅ V −2 3 ⋅ x 1 3
(22)
essendo
2
2
Fm = Vs ⋅ rs ⋅ ρ s ρ a
(23)
definito come “parametro di flusso inerziale” ( rs è il raggio della ciminiera, ρ s
e ρ a sono le densità dei fumi e dell’aria).
Avendo maggior importanza la velocità del fumo rispetto alla sua
temperatura, si può considerare Ts ≈ T , e quindi ρ s ≈ ρ a , per cui è possibile
semplificare l’espressione utilizzata.
Nella definizione dell’innalzamento massimo si distinguono due sottocasi:
• in presenza di vento: ∆H F = 1.5 ⋅ (Fm V )1 3 ⋅ S −1 6
• in assenza di vento:
1.4.3
∆H F = 4 ⋅ (Fm S )
14
(24)
(25)
Presenza di uno strato di inversione in quota
Se è presente uno strato di inversione in quota, è possibile che il
sovrainnalzamento del pennacchio venga ostacolato.
L’inversione è caratterizzata da una quota iniziale e da una finale ( Z i , Z fi ), e
da una escursione termica ( ∆Ti ).
14
Capitolo I
Modello teorico
Si indica con z ' l’altezza massima raggiungibile dal pennacchio nelle
condizioni di inversione presenti, e la si ricava dalle seguenti equazioni:
z ' = 7 ⋅ Fb
(
0.4
⋅ bi
0.7
z ' = 2 ⋅ Fb ⋅ V −1 ⋅ bi
+ Hg
)
−1 0.5
, per V < 0.25 m s
+ Hg
, per V ≥ 0.25 m s
(26)
(27)
essendo
bi = g ⋅ (∆Ti Ta )
(28)
Il pennacchio è in grado di superare lo strato di inversione se z ' > Z fi , oppure
se z ' > (Z fi + Z i ) 2 nel caso di strato di inversione con notevole estensione
verticale; se tali condizioni non sono verificate, resterà confinato al di sotto
dello strato limite.
15
Capitolo I
1.5
Modello teorico
Determinazione dei coefficienti di dispersione (σy e σz)
I coefficienti di dispersione, σy e σz, , sono i parametri che determinano la
dispersione dei fumi nell’atmosfera.
I valori da essi assunti sono condizionati dalla situazione di stabilità
atmosferica e dalla coordinata x in corrispondenza della quale vengono
valutati.
Tali valori tendono ad aumentare con la distanza e con l’instabilità.
Vi sono vari modelli generalmente utilizzati per il calcolo; nel nostro caso si
sono considerati i seguenti:
• “Pasquill-Gifford”
• “Brookhaven National Laboratory”
• “Tennessee Valley Authority”
• “Briggs open-country” e “Briggs urban”.
1.5.1
Pasquill-Gifford
E’ generalmente utilizzato in condizioni di terreno relativamente piatto
(aperta campagna), con sorgenti a bassa quota (< 80m), ed ha la seguente
formulazione:
σy =
k1 ⋅ x
[1 + (x k 2 )]k3
,
σz =
k4 ⋅ x
[1 + (x k 2 )]k5
, (29)
con i valori delle costanti k1 ..k 5 definiti nella seguente tabella:
16
Capitolo I
Modello teorico
Tabella 3 – Valori delle costanti per il calcolo della dispersione con il modello “PasquillGifford”
classi di
stabilità
A
B
C
D
E
F
1.5.2
k1
0,250
0,202
0,134
0,079
0,057
0,037
k2
927
370
283
707
1070
1170
costanti
k3
0,189
0,162
0,134
0,135
0,137
0,134
k4
0,1020
0,0962
0,0722
0,0475
0,0335
0,0220
k5
-1,918
-0,101
0,102
0,465
0,624
0,700
Brookhaven National Laboratory (BNL)
Utilizza un minor numero di categorie di stabilità rispetto al modello di
Pasquill, con la seguente corrispondenza (Pasquill-Gifford) ⇒ (BNL):
(A) ⇒ (B2) , (B) ⇒ (B1) , (C,D,E) ⇒ (C) , (F) ⇒ (D).
La formulazione è del tipo:
σ y = a ⋅ xb , σ z = c ⋅ xd ,
(30)
con i valori delle costanti a, b, c, d definiti nella seguente tabella:
Tabella 4 - Valori delle costanti per il calcolo della dispersione con il modello “BNL”
classi di
stabilità
B2
B1
C
D
a
0,40
0,36
0,32
0,31
17
costanti
b
c
0,91
0,41
0,86
0,33
0,78
0,22
0,71
0,06
d
0,91
0,86
0,78
0,71
Capitolo I
1.5.3
Modello teorico
Tennessee Valley Authority (TVA)
E’ indicato per grandi impianti di potenza a carbone situati in aperta
campagna; si considera come velocità del vento la media tra quella alla quota
di emissione e quella alla quota massima raggiunta dal pennacchio.
Si distinguono solamente due condizioni di stabilità, e la formulazione è la
seguente:
• condizioni neutrali: σ y = 0.42 ⋅ x 0.75 , σ z = 0.39 ⋅ x 0.75
• condizioni stabili: σ y = 1.32 ⋅ x 0.55 , σ z = 6.71 ⋅ x 0.21
1.5.4
(31)
(32)
Briggs open-country, Briggs urban
Le formule sono ottenute dalla combinazione dei tre modelli precedenti,
operando una distinzione tra diffusione su terreni con coefficiente di rugosità
ridotto (Briggs Open-country) o elevato (Briggs Urban).
Le formulazioni sono le seguenti:
Tabella 5 - Formule per il calcolo della dispersione con il modello “Briggs open-country”
Briggs open-country
Categoria di stabilità
σy
σz
A
0.22x (1 + 0.0001x)-1/2
0.20x
B
0.16x (1 + 0.0001x)-1/2
0.12x
C
0.11x (1 + 0.0001x)-1/2
0.08x (1 + 0.0002x)-1/2
D
0.08x (1 + 0.0001x)-1/2
0.06x (1 + 0.0015)-1/2
E
0.06x (1 + 0.0001x)-1/2
0.03x (1 + 0.0003x)-1
F
0.04x (1 + 0.0001x)-1/2
0.016x (1 + 0.0003x)-1
18
Capitolo I
Modello teorico
Tabella 6 - Formule per il calcolo della dispersione con il modello “Briggs urban”
Briggs urban
Categoria di stabilità
σy
σz
A–B
0.32x (1 + 0.0004x)-1/2
0.24x (1 + 0.0001x)-1/2
C
0.22x (1 + 0.0004x)-1/2
0.20x
D
0.16x (1 + 0.0004x)-1/2
0.14x (1 + 0.0003x)-1
E-F
0.11x (1 + 0.0004x)-1/2
0.08x (1 + 0.00015x)-1
19
Capitolo I
1.6
Modello teorico
Elenco dei simboli utilizzati
C
: concentrazione di inquinante
Cf
: concentrazione di fondo di inquinante in atmosfera
Cp
: calore specifico a pressione costante
D
: diametro terminale della ciminiera
Fb
: parametro di galleggiamento
Fm
: parametro di flusso inerziale
g
: accelerazione di gravità
He
: altezza effettiva della sorgente, pari a H g + ∆H F
Hg
: altezza geometrica della sorgente
hi
: quota dello strato di inversione
K xx , K yy , K zz : coefficiente di diffusione turbolenta nella direzione x, y, z
Q
: portata della sorgente
rs
: raggio terminale della ciminiera
S
: sorgente di inquinante
t
: tempo
T , Ta
: temperatura dell’aria
Ts
: temperatura dei fumi
V
: velocità media del vento
V x , V y , Vz
: velocità media del vento nella direzione x, y, z
x, y , z
: coordinate spaziali (x: orizzontale, direzione vento;
y: orizzontale, ortogonale a x; z: verticale)
XL
: valori della coordinata x per cui il pennacchio di fumo
raggiunge lo strato di inversione in quota
Z i , Z fi
: altezza iniziale e finale di uno strato di inversione
γ
: gradiente di temperatura adiabatico dell’aria
20
Capitolo I
Modello teorico
∆H F
: sovrainnalzamento massimo del pennacchio
∆Ti
: escursione termica di uno strato di inversione
ρs , ρa
: densità dei fumi e dell’aria
σ y ,σ z
: coefficienti di dispersione
21
Capitolo II
Implementazione
2.1
Linguaggi utilizzati
Per lo sviluppo del progetto ci si è orientati, già nelle fasi iniziali, verso il
linguaggio Java per quanto riguarda la parte di simulazione, e verso il VRML
per la parte inerente la visualizzazione tridimensionale.
I motivi di tale scelta sono stati molteplici, e riguardano, oltre che i due
linguaggi considerati singolarmente, anche la possibile interazione tra i due
ambienti.
Java ha vantaggi ormai ben noti, sommariamente riassunti nei punti seguenti
[Hors99, Dev98, Ecke98]:
• è indipendente dalla piattaforma
• è un linguaggio completamente a oggetti
• ha una sintassi semplice rispetto al C++
• non richiede l’allocazione e la deallocazione manuali della memoria
• si occupa automaticamente del “garbage collection”
• semplifica lo sviluppo di applicativi che funzionano in rete
• è disponibile un completo ambiente di sviluppo gratuito (JDK)
• il codice (bytecode) prodotto dal compilatore è particolarmente compatto
Quest’ultimo aspetto è di particolare importanza se si prevede che il
programma possa essere utilizzato tramite Internet, quindi con collegamenti
tipicamente non molto veloci.
Ovviamente, trattandosi di bytecode, che deve quindi essere interpretato,
22
Capitolo II
Implementazione
presenta svantaggi dal punto di vista delle prestazioni; non essendo il progetto
da sviluppare particolarmente esigente sotto questo aspetto non si è reputato
ciò un fattore limitante.
VRML (Virtual Reality Modeling Language) è un linguaggio per la descrizione
di scene tridimensionali, anch’esso particolarmente indicato per l’utilizzo
tramite Internet.
Un file Vrml è un semplice file ascii, che contiene la definizione degli oggetti
che si vogliono rappresentare nella scena e delle loro caratteristiche (colore,
trasparenza, textures, , ecc.), ne definisce la posizione, ne imposta il
comportamento (animazioni, rilevamento delle collisioni, ecc.).
Caratteristiche molto comode di tale linguaggio sono [www03, www05,
www07]:
• indipendenza dalla piattaforma (la scena viene descritta da un semplice file
ascii, che viene poi interpretato dal browser Vrml specifico per la
piattaforma utilizzata)
• semplicità della sintassi
• semplicità di interazione con Java
Proprio quest’ultima aspetto, oltre che il supporto multipiattaforma e la
relativa compattezza, ha favorito la diffusione dell’utilizzo congiunto di Java e
Vrml.
Tra i punti a sfavore va citata la resa grafica di qualità non molto elevata, che
ha condizionato alcune scelte basilari del progetto, come verrà descritto in
seguito.
23
Capitolo II
2.2
2.2.1
Implementazione
Strumenti utilizzati
Java
Per lo sviluppo in Java si sono utilizzati due tra gli ambienti più diffusi: “JDK”
della
Sun
Microsystems
(http://java.sun.com),
e
“Jbuilder”
della
Borland/Inprise (http://www.borland.com).
JDK, nelle versioni 1.2, 1.2.1 e 1.2.2, è stato utilizzato soprattutto nelle fasi
iniziale del progetto.
Si tratta di un ambiente a linea di comando, privo di un editor integrato.
Questa caratteristica può risultare sgradita ad un utente evoluto, ma semplifica
la fase di apprendimento del linguaggio, in quanto rende molto lineare il
processo di sviluppo (editing – salvataggio file sorgente – compilazione),
senza fuorviare con le innumerevoli opzioni generalmente presenti negli
ambiente di sviluppo integrati.
La compilazione effettuata con il JDK garantisce inoltre l’effettiva portabilità
del codice generato, poiché si può verificare di non avere incluso, magari
inavvertitamente, librerie di oggetti non standard.
Ciò detto, è comunque innegabile che l’utilizzo di un prodotto come Jbuilder
può semplificare e accelerare notevolmente il lavoro, una volta acquisita una
certa padronanza dell’ambiente.
Si hanno infatti a disposizione:
• un editor visuale di form (pressoché indispensabile non appena l’interfaccia
grafica del programma comincia a farsi complessa)
• un componente di layout, definito “XYLayout”, che permette il
posizionamento libero (a livello di singolo pixel, come avviene, ad
esempio, in “Delphi” e “Visual Basic”) dei vari componenti di interfaccia,
e prevede poi la conversione del risultato ottenuto in un layout standard
previsto da Java
24
Capitolo II
Implementazione
• un compilatore molto veloce (effettua la compilazione in memoria, quindi
quasi istantaneamente); l’ambiente integrato consente poi di individuare
rapidamente le linee di codice contenenti eventuali errori
• un comodo debugger
• un browser grafico per visualizzare gli oggetti utilizzati nel programma con
una vista gerarchica, che permette di rintracciare rapidamente, nel codice,
la loro definizione ed i relativi metodi/attributi
Si è utilizzata la versione 3.0 di Jbuilder, in edizione “Standard” (non essendo
necessarie le caratteristiche evolute presenti nella versioni superiori – ad es.
l’accesso a database).
Di notevole utilità si è rivelato anche l’applicativo “Together/J”
(http://www.togethersoft.com), utilizzato nella versione 2 “Whiteboard”
(dimostrativa, gratuita, con limitazioni nella funzionalità).
È uno strumento per la modellazione a oggetti, compatibile con UML,
disponibile per Java, C++ e Object Cobol.
La versione “Whiteboard”, pur avendo varie limitazioni rispetto a quella
commerciale, è utilizzabile per la gestione dei diagrammi delle classi e dei
packages.
È uno strumento bidirezionale, e permette la generazione dei diagrammi
(comprese le interazioni tra le varie classi) a partire dal codice sorgente,
oppure la generazione del codice corrispondente alla rappresentazione grafica.
È risultato estremamente comodo per avere una vista d’insieme delle classi
componenti il progetto, delle dipendenze tra esse esistenti e dei
metodi/attributi definiti per ognuna.
Non si sono evidenziati problemi nell’utilizzo combinato con Jbuilder,
essendo possibile effettuare modifiche al progetto con uno dei due strumenti e
avere un aggiornamento istantaneo della situazione nell’altro.
La versione commerciale ha numerose funzionalità supplementari:
25
Capitolo II
Implementazione
• definizione dei vari diagrammi previsti da UML: oltre a classi e packages,
casi d’uso, sequenza, collaborazione e stato;
• generazione automatica della documentazione;
• utilizzo di strumenti esterni e integrazione con altri ambienti di sviluppo;
• importazione e esportazione da “Rational Rose”.
2.2.2
Vrml
Si sono utilizzati due pacchetti: il browser Vrml “CosmoPlayer”, versione 2.1,
della Silicon Graphics (http://www.cosmosoftware.com), e “Vorlon”,
versione 1.21 (http://www.trapezium.com), che effettua la verifica della
correttezza di un file sorgente Vrml, segnalando la presenza di eventuali errori.
Per quanto riguarda il browser la scelta è caduta su CosmoPlayer perché
risulta il più diffuso, e la maggior parte della documentazione reperibile su
Vrml è quindi ad esso riferita.
La versione 2.1, l’ultima disponibile, risale al novembre 1998, e non è risultata
completamente esente da problemi: si sono avuti blocchi del programma,
talvolta occasionali, talvolta sistematici (con determinate risoluzioni video e
profondità di colore), in particolare se abbinato al browser Html Internet
Explorer.
L’utilizzo di Vorlon si è rivelato molto utile, in fase di debug del sorgente
Vrml, poiché il browser, in presenza di errori, non visualizza informazioni utili
al debug, rendendo quindi problematica la risoluzione dei problemi.
Si tratta di un programma molto compatto, scritto in Java, e funzionante da
linea di comando.
26
Capitolo II
2.2.3
Implementazione
Html
La versione definitiva del progetto consiste in un’applet, inserita in una pagina
Html contenente anche il browser Vrml; per il suo utilizzo si impone quindi
l’uso di un browser Html.
Sono stati utilizzati Netscape Communicator ed Internet Explorer, essendo i
due browsers più diffusi.
Explorer ha generalmente evidenziato prestazioni migliori, associate però ad
una maggiore instabilità.
La struttura di base della pagina contenente il browser Vrml e l’applet di
controllo è abbastanza banale, ed è di seguito riportata:
<HTML>
. . .
<EMBED
SRC= "prova.wrl"
height = 300
width = 500
ALIGN = middle
>
<APPLET
CODEBASE = "."
CODE = "Fumo11.class"
NAME = "TestApplet"
MAYSCRIPT
ARCHIVE = "Fumo.jar"
WIDTH = 740
HEIGHT = 550
HSPACE = 20
VSPACE = 50
ALIGN = middle
>
</APPLET>
. . .
</HTML>
Le versioni iniziali dell’applet sono state sviluppate utilizzando la libreria
Swing di Java, per cui era richiesto l’utilizzo di Java Plug-In per la sua
27
Capitolo II
Implementazione
esecuzione; erano inoltre richieste delle modifiche al file Html, per
permetterne l’utilizzo indifferentemente con Netscape e con Explorer. La
modifica veniva effettuata automaticamente con l’utility “Java Plug-in HTML
Converter”, reperibile sul sito della Sun Microsystems.
2.2.4
Files di testo
Per la creazione e modifica dei files di testo si è utilizzato l’editor PFE
(Programmer’s File Editor) (http://www.lancs.ac.uk/people/cpaap/pfe/).
Si tratta di un programma compatto, gratuito e dotato di comode funzioni,
quali:
• esecuzione di applicazioni e comandi da shell
• registrazione di macro
• gestione di finestre multiple
• indentazione del testo
• trasformazione maiuscolo ÅÆ minuscolo.
2.2.5
Interazione tra Java e Vrml
Sono disponibili diverse tecniche per interagire con una scena Vrml attraverso
il linguaggio Java [www03, www04, www06]:
• utilizzo di Java dal nodo Script: prevede la presenza, nel sorgente Vrml, di
un nodo “Script”, in cui vengono elencati i campi e gli eventi accessibili
dall’esterno, nonché l’indirizzo (“url”) della classe Java controllante
• controllo tramite JavaScript: è simile al metodo precedente, con l’utilizzo di
JavaScript al posto di Java
• generazione del file Vrml tramite interfaccia CGI: l’applet genera
dinamicamente l’intera scena, senza però poterne assumere il controllo
28
Capitolo II
Implementazione
• generazione/controllo tramite EAI (“External Authoring Interface”):
l’applet acquisisce i riferimenti ai nodi Vrml che si vogliono controllare e
ne può controllare il comportamento, oltre che generare dinamicamente
nuovi oggetti.
Il progetto da sviluppare richiede la generazione dinamica del pennacchio di
fumo, basandosi sui calcoli di concentrazione eseguiti dall’applet, per cui la
scelta è risultata di fatto limitata alle ultime due tecniche.
Si è optato per l’EAI in virtù della sua relativa semplicità implementativa, e
soprattutto della sua flessibilità (sarebbe possibile, ad esempio, aggiungere
effetti di animazione della superficie generata, oppure variazioni dei colori ad
essa associati, ecc.).
29
Capitolo II
2.3
Implementazione
Fasi di sviluppo del programma
1) Prove su “Excel” e “Matlab”
La prima fase delle sviluppo del progetto è consistita nell’effettuazione di
semplici simulazioni, con Excel e Matlab, basandosi sulla formula del modello
di diffusione gaussiano.
Si sono generate delle matrici con i valori di concentrazione, visualizzati poi
con grafici del tipo a superficie, con i vari livelli di concentrazione individuati
da colori diversi:
Figura 1 – Grafico di concentrazione, realizzato con Excel
S21
S20
S19
S18
S17
S16
S15
S14
S13
S12
S11
S10
S9
S8
S7
S6
S5
S4
S3
S2
S1
1
3
5
7
9
11
13
0,04-0,05
0,03-0,04
0,02-0,03
0,01-0,02
0-0,01
15
2) Sviluppo di applicazione in Java, con input/output su file
Una volta terminate le verifiche iniziali, si è passati alla realizzazione della
30
Capitolo II
Implementazione
prima versione del programma. Si è tralasciata in questa fase ogni
considerazione relativa all’interfaccia grafica di input/output, effettuando tutte
le operazioni tramite l’ausilio di files esterni.
Si è utilizzato un file contenente tutti i parametri utente, e ci si è limitati ad una
scrittura su console dei valori di concentrazione calcolati, ridirigendo tali
risultati su un file quando richiesto.
La visualizzazione grafica è stata ancora effettuata con Excel o Matlab.
In questa fase ci si è limitati all’implementazione della sola formula di
distribuzione gaussiana, senza considerare la riflettività del terreno, la presenza
di strati di inversione, l’innalzamento del pennacchio, il profilo verticale del
vento non costante, e si sono utilizzati coefficienti di dispersione costanti.
All’origine di tali limitazioni è stata la relativa scomodità di analisi dei risultati,
per cui si è preferito posticipare l’aggiunte di ulteriori caratteristiche ad una
fase successiva di sviluppo.
3) Aggiunta di una interfaccia grafica all’applicazione
Si è quindi effettuata l’aggiunta di una interfaccia grafica per l’inserimento dei
parametri utente.
Lo sviluppo iniziale dell’applicazione è avvenuto utilizzando solamente Jdk; si
è poi ritenuto opportuno il passaggio a JBuilder, per sfruttare la comodità del
“form editor” grafico, che permette un semplice ed efficace posizionamento
degli elementi di interfaccia necessari.
Caratteristica molto comoda, in tal senso, è la presenza di un gestore di layout,
denominato “XYLayout”, che permette il posizionamento libero degli oggetti
(simile a quello effettuabile in ambienti come “Delphi” o “Visual basic”), e la
conversione automatica (non sempre perfetta, in realtà) del risultato ottenuto
in un layout standard di Java.
Si sono utilizzati i componenti della libreria “Swing”, per ottenere
un’interfaccia funzionale e di semplice utilizzo, con il risultato mostrato
31
Capitolo II
Implementazione
nell’immagine seguente (si nota anche la presenza degli “hints” che
chiariscono il significato dei vari campi di inserimento):
Figura 2 – Finestra di inserimento parametri
La parte inferiore della finestra è stata destinata alla visualizzazione grafica dei
valori di concentrazione calcolati.
Una volta impostata l’interfaccia, si è proceduto con l’aggiunta delle
caratteristiche del modello trascurate nella fase precedente, avendo ora la
possibilità di effettuare una veloce verifica della loro correttezza.
Si è mantenuta comunque la possibilità di stampa su console dei valori
calcolati, per poterli eventualmente esportare verso altre applicazioni.
4) Generazione della vista tridimensionale, in modalità “wireframe”, con
uscita su file
Come passaggio intermedio, la visualizzazione tridimensionale è stata
effettuata con una rappresentazione in modalità “wireframe”, mostrando i
contorni dei triangoli da cui è composta la superficie del pennacchio di fumo.
Sono generate anche le rappresentazioni della ciminiera (con opportuna
“texture”), del piano di sezione definito nella vista bidimensionale, della
direzione e verso del vento.
32
Capitolo II
Implementazione
Figura 3 – Vista tridimensionale, in modalità “wireframe”
Sono stati impostati tre punti di vista predefiniti, per agevolare l’utente
nell’esplorazione della scena realizzata.
Il file sorgente viene generato nella directory in cui è presente l’applicazione.
5) Generazione della vista tridimensionale con visualizzazione della
superficie
Il passo successivo è stato la visualizzazione della superficie del pennacchio,
passando attraverso vari tentativi per trovare valori accettabili di decadimento
della trasparenza in funzione della concentrazione, e di risoluzione della griglia
di calcolo.
Figura 4 – Vista tridimensionale, con rappresentazione della superficie
33
Capitolo II
Implementazione
6) Conversione dell’applicazione in applet
Si sono seguiti i passi standard per la conversione di un’applicazione in applet:
• eliminazione del metodo “main”
• subclassing dalla classe “JApplet”, anziché da “JFrame”
• sostituzione del costruttore con il metodo “init”
• generazione di una pagina Html con il “tag” appropriato per il caricamento
dell’applet
Avendo utilizzato la libreria Swing, insieme ad altre caratteristiche della
versione 1.2 del Jdk si è reso necessario l’utilizzo del “Java Plug-in” per
l’esecuzione dell’applet all’interno del browser, e ciò ha richiesto anche la
modifica del file Html (descritto in precedenza, nella sezione “Strumenti
Utilizzati – HTML”) tramite “Java Plug-in HTML Converter”.
La conversione non ha presentato problemi particolari, e si è ottenuto un
funzionamento corretto sia con Netscape che con Internet Explorer.
Non avendo la possibilità di accedere al “file-system” locale, è stata eliminata
in questa fase del progetto la generazione del file Vrml.
Dovendo gestire, a questo punto, un programma con due diverse interfacce
verso l’esterno (applicazione stand-alone o applet), e con una sottostante parte
di calcolo comune ad entrambe, si è provveduto a disaccoppiare le due
componenti.
Si è introdotta, a questo scopo, una classe di controllo (“Controller.java”)
che facesse da tramite tra l’interfaccia ed il programma principale.
Con una struttura di questo tipo si ottiene un efficace separazione [GHJV95,
Larm98], con un funzionamento schematizzabile nel modo seguente:
1) l’interfaccia interpreta i dati inseriti dall’utente, e li invia al controllore
2) il controllore inoltra i parametri al programma principale, e ne gestisce
l’attività, ricevendone i risultati in forma numerica
34
Capitolo II
Implementazione
3) l’interfaccia visualizza i risultati in forma grafica, sotto la supervisione del
controllore
7) Tentativo di integrazione con il browser vrml
Seguendo le istruzioni elencate in vari “tutorials” presenti su Internet, si è
tentata l’integrazione tra l’applet e il browser Vrml, all’interno di una stessa
pagina Html.
Sono stati effettuati vari tentativi infruttuosi, seguiti da richieste di chiarimento
nei “newsgroups” italiano e inglese (“it.comp.lang.vrml” e “comp.lang.vrml”,
rispettivamente) dedicati a Vrml.
In attesa di risposta, verificando le diverse configurazioni possibili:
1) applet Awt + CosmoPlayer
2) applet Swing + Java Plug-in + CosmoPlayer
3) applet Awt + Java Plug-in + CosmoPlayer
L’unica funzionante è risultata essere la prima, .
Un messaggio nel newsgroup italiano ha in seguito confermato la sospettata
incompatibilità di CosmoPlayer (e degli altri browsers Vrml) con la versione
1.2 di Jdk, imponendo la rinuncia all’utilizzo di tale versione dell’ambiente di
sviluppo.
Nessun riferimento al problema è stato trovato nella documentazione ufficiale
dei prodotti o nei tutorials (entrambe le fonti sono risultate piuttosto datate).
8) Riscrittura dell’applet utilizzando i componenti Awt
È stato quindi necessario riscrivere completamente la parte di programma
riguardante l’interfacciamento con l’utente.
Si è cercato di mantenerla il più possibile simile a quella originaria, pur
dovendo utilizzare componenti di interfaccia con minori funzionalità e aspetto
35
Capitolo II
Implementazione
diverso.
Nell’immagine seguente sono riportate l’interfaccia con componenti Swing e
quella con componenti Awt.
Figura 5 – Confronti tra l’interfaccia grafica con componenti Swing e Awt
Terminata la riscrittura, ci si è occupati nuovamente del collegamento
dell’applet con il browser Vrml, senza riscontrare problemi.
9) Generazione dinamica della vista tridimensionale, con utilizzo dell’
“External Authoring Interface” (EAI), e aggiunta di una componente
stocastica
Basandosi sul codice già utilizzato per la generazione del file Vrml con
l’applicazione Java (punto 5), e operandovi modifiche abbastanza limitate, si è
giunti a generare dinamicamente la vista tridimensionale.
36
Capitolo II
Implementazione
Si è mantenuto un file Vrml che definisce le componenti fisse della scena
(sfondo, punti di vista e elementi “decorativi”), e l’applet si occupa di
aggiungere gli altri elementi (ciminiera, superficie del pennacchio di fumo,
eventuali piano di sezione e freccia indicante direzione e verso del vento),
inviandoli al browser Vrml attraverso l’interfaccia “EAI”.
Si è poi aggiunta una componente stocastica al pennacchio, al fine di ottenere
una resa grafica più realistica.
Si è ottenuta la seguente visualizzazione (da confrontarsi con quella mostrata
al precedente punto 5):
Figura 6 – Vista tridimensionale, versione definitiva
37
Capitolo II
2.4
Implementazione
Struttura del programma
Nel seguito, si utilizzeranno le seguenti convenzioni per la descrizione delle
classi:
Nome della classe
Attributi
+attributo: attributi “public”
#attributo: attributi “protected”
attributo: attributi “package local”
- attributo: attributi “private”
Metodi
+metodo:
#metodo:
metodo:
- metodo:
metodo:
2.4.1
metodi “public”
metodi “protected”
metodi “package local”
metodi “private”
metodi astratti
Struttura generale del programma
Ad un primo livello di raffinamento, la struttura del programma è la seguente:
Interfaccia
Classe di
Logica del
grafica
controllo
programma
2.4.1.1
Interfaccia grafica
È il componente che si occupa dell’interazione con l’utente.
Quando viene richiesto, legge ed interpreta i parametri specificati nei vari
campi, e li inoltra alla classe di controllo.
38
Capitolo II
Implementazione
Fornisce poi una rappresentazione grafica dei risultati.
2.4.1.2
Classe di controllo (“controllore”)
È utilizzata per disaccoppiare l’interfaccia dalla logica del programma.
Il vantaggio derivante dal suo utilizzo è la possibilità di sostituire l’interfaccia
grafica originaria con una alternativa, senza che nessuna modifica venga
richiesta sulle altre componenti.
Una volta ricevuti i parametri specificati dall’utente, si occupa di generare tutti
gli oggetti necessari all’esecuzione dei calcoli di concentrazione, e di
coordinarli per ottenere i risultati richiesti.
Si occupa poi del trasferimento dei risultati all’interfaccia grafica.
2.4.1.3
Logica del programma
È la componente fondamentale del programma, ed è costituita dalle classi
necessarie per la simulazione.
Il coordinamento delle varie classi è affidato al controllore, che gestisce anche
il trasferimento dei risultati all’interfaccia grafica.
È stata effettuata una suddivisione in quattro packages:
• “grafica” : contiene le classi relative alla grafica bidimensionale
• “sorgenti” : contiene le classi relative al calcolo della concentrazione di
inquinante
• “utilita” : contiene classi ausiliarie, utilizzate in altri packages
• “vrml_fumo” : contiene le classi che si occupano della rappresentazione
tridimensionale
39
Capitolo II
2.4.2
Implementazione
Struttura dell’interfaccia grafica
L’interfaccia grafica è costituita dal solo file “Fumo11.java”.
È una classe derivata da
Applet,
e definisce un insieme di oggetti disposti
secondo una struttura gerarchica.
Al primo livello si hanno due “pannelli” (derivati dalla classe “Panel”):
4)
panel_controlli:
contiene tutti i sotto-pannelli relativi all’immissione dei
parametri (parte superiore della finestra)
5)
panel_sezione:
è il pannello preposto alla rappresentazione grafica della
sezione bidimensionale; contiene inoltre i due pulsanti “Aggiorna Vista
3D” e “Aggiorna Sezione” (parte inferiore della finestra).
La struttura gerarchica del pannello “panel_controlli” è la seguente:
panel_controlli
panel_pulsanti_selezione
panel_pannelli
panel_pannelli_sorgente
panel_sorgente_1
panel_sorgente_2
panel_pannelli_vento
panel_vento_1
panel_vento_1_1
panel_vento_1_2
panel_vento_2
panel_vento_3
panel_pannelli_innalzamento
panel_innalzamento_1
panel_innalzamento_1_1
panel_innalzamento_1_2
panel_innalzamento_1_3
40
Capitolo II
Implementazione
panel_innalzamento_1_4
panel_innalzamento_2
panel_innalzamento_2_1
panel_innalzamento_2_2
panel_innalzamento_2_3
panel_innalzamento_2_4
panel_pannelli_dispersione
panel_dispersione_1
panel_dispersione_2
panel_dispersione_3
panel_pannelli_vrml
panel_vrml_1
panel_vrml_1_1
panel_vrml_1_2
panel_vrml_1
panel_vrml_2_1
panel_vrml_2_2
La classe ha la seguente struttura (sono riportati solo i metodi e gli attributi
principali):
Fumo11
…
panel_sezione: Panel
panel_controlli : Panel
…
button_vista3d: Button
button vista_sezione: Button
…
controllore: Controller11
…
+init: void
+start: void
…
-button_vista3d_actionPerformed: void
-button_sezione_actionPerformed: void
…
-leggi_parametri_schermo: void
41
Capitolo II
Implementazione
Il metodo “init” si occupa di inizializzare e posizionare tutti gli elementi che
vanno a comporre la finestra.
Il metodo “start” si occupa di ottenere il riferimento al Browser Vrml (tale
operazione va effettuata anche in caso di “refresh” della pagina Html, per cui
non sarebbe corretto inserirla in “init”).
Per evitare problemi dovuti a possibili ritardi si è inserita l’acquisizione in un
ciclo, nel modo seguente [www04, www06]:
for (int count = 0; count < 10; count++) {
try {
try { Thread.sleep(200); } catch (InterruptedException ignored)
{ }
browser = Browser.getBrowser(this);
controllo_eai = new EAI(browser);
}
catch (Exception e) { } // getBrowser() can throw
NullBrowserException
if (browser != null) break;
System.out.println("browser was null, trying again...");
}
Il metodo “leggi_parametri_schermo” legge il valore di tutti i campi e
controlli modificabili dall’utente, effettuando anche opportune verifiche di
validità.
I metodi “button_vista3d_actionPerformed” e “button_sezione_actionPerformed” sono i
metodi di risposta alla pressione dei pulsanti, e hanno, rispettivamente, la
seguente struttura:
void button_sezione_actionPerformed(ActionEvent e) {
leggi_parametri_schermo();
controllore.set_parametri(… elenco parametri …);
controllore.genera_sezione(panel_sezione.getGraphics(),
(int)panel_sezione.getSize().width,
(int)panel_sezione.getSize().height);
}
42
Capitolo II
Implementazione
void button_vista3d_actionPerformed(ActionEvent e) {
leggi_parametri_schermo();
controllore.set_parametri(… elenco parametri …);
controllore.genera_vrml();
}
2.4.3
Struttura del controllore
Il controllore è costituito dal file “Controller11.java”.
La struttura della classe è la seguente:
Controller11
…
…
+inizializza_browser_vrml: void
+acquisisci_nodi_vrml: void
+genera_sezione: void
+genera_vrml: void
…
Il controllore riceve dall’interfaccia grafica i parametri specificati dall’utente e
provvede a inoltrarli al livello logico del programma.
Il metodo “inizializza_browser_vrml” acquisisce il riferimento al browser
Vrml passatogli dall’interfaccia grafica.
Il metodo “acquisisci_nodi_vrml” acquisisce il riferimento ai nodi Vrml
definiti nel file “world.wrl” distribuito assieme al programma .
Il metodo “genera_sezione” gestisce il calcolo della concentrazione, e si
occupa della visualizzazione della sezione bidimensionale.
Schematicamente, il codice è il seguente:
43
Capitolo II
Implementazione
public void genera_sezione(Graphics g, int largh, int alt) {
Scansione scansione = new Scansione( ... );
scansione.crea_mondo( ... );
double[][] vettore_sezione = scansione.scan2d();
...
sezione = new Sezione(largh, alt);
sezione.disegna_sezione(g, vettore_sezione);
...
}
Dapprima crea un oggetto di tipo “Scansione”; questo provvede alla
generazione di tutti gli oggetti necessari per la simulazione (Sorgente, Vento,
Innalzamento, Dispersione), quindi effettua una scansione bidimensionale,
con i parametri impostati, e restituisce il risultato in “vettore_sezione”.
Viene poi creato un oggetto di tipo “Sezione”, che si occupa della
visualizzazione dell’immagine.
Il metodo “genera_vrml” è simile, anche se leggermente più complesso.
Si occupa della generazione della vista tridimensionale Vrml, ed è
schematizzabile dal seguente codice:
public void genera_vrml() {
Scansione scansione = new Scansione( ... );
scansione.crea_mondo(true);
Sezione_3D vettore_sezione = null;
/* array 1d: contiene lista dei
punti di una singola sezione
*/
Vector vettore_bordo = new Vector(30,10); /* vettore : contiene i
vari oggetti
Sezione_3D */
...
while ( ... ) {
...
vettore_sezione = scansione.scanVrml(x, passo_y, passo_z, ...);
...
vettore_bordo.addElement(vettore_sezione);
...
}
44
Capitolo II
Implementazione
...
vettore_bordo.trimToSize();
...
Pennacchio pennacchio = new Pennacchio(vettore_bordo, ...);
Vector vettore_superficie = pennacchio.genera_superficie();
/* vettore di vettori, ognuno contenente i triangoli
che compongono la sup. tra due sezioni */
...
for (int count = 2; count <= vettore_bordo.size()-2; count++) {
Sezione_3D sezione1 =
(Sezione_3D)(vettore_bordo.elementAt(count-1));
...
sezione1.aggiungi_random();
}
...
File_vrml file_vrml = new File_vrml(...);
file_vrml.scrivi_EAI(...);
...
}
La prima parte è simile a quella descritta nel metodo precedente.
Segue quindi un ciclo in cui vengono creati i contorni delle varie sezioni che
delimitano il pennacchio di fumo, raggruppate al termine nella variabile
“vettore_bordo”.
Viene poi definita, tramite opportuni triangoli, la superficie che unisce le
sezioni; ad essa viene aggiunta una componente stocastica, e il risultato viene
poi inviato, tramite l’interfaccia “EAI”, al browser VRML.
45
Capitolo II
2.4.4
2.4.4.1
Implementazione
Struttura della logica del programma
Package “utilita”
Contiene due semplici classi usate ricorrentemente nel programma: “Punto3D”
e “Triangolo3D”.
Punto3D viene usata sia nella rappresentazione bidimensionale che in quella
tridimensionale; Triangolo3D è la primitiva grafica da cui è costituita la
superficie del pennacchio visualizzata nella vista tridimensionale.
Punto3D
Triangolo3D
…
…
-punti: Punto3D[]
-indice1, indice2, indice3: int
…
+set(): void
+setX(): void
+setY(): void
+setZ(): void
…
+get_punto(indice): Punto3D
+get_indice1(), get_indice2(),
get_indice3(): int
…
+getX(): void
+getY(): void
+getZ(): void
+getX_vrml(): void
+getY_vrml(): void
+getZ_vrml(): void
…
- Punto3D
È la classe che fornisce gli strumenti per la definizione e la gestione di un
punto tridimensionale.
È possibile specificarne le coordinate direttamente tramite il metodo
costruttore, oppure tramite il metodo “set(x,y,z)”, oppure ancora tramite
46
Capitolo II
Implementazione
“setX(x)”, “setY(y)”, “setZ(z)”.
È possibile accedere alle coordinate tramite i metodi “getX()”, “getY()”,
“getZ()”.
Poiché il riferimento cartesiano usato per il calcolo della concentrazione (x,y
orizzontali, z verticale) differisce da quello utilizzato dal browser Vrml (xvrml
≡ x, yvrml ≡ z, zvrml ≡ -y), si sono definiti anche i tre metodi “getX_vrml()”,
“getY_vrml()”,
“getZ_vrml()”,
che
tengono
conto
delle
necessarie
conversioni di coordinate, senza modificare la rappresentazione interna degli
oggetti.
- Triangolo3D
È una semplice classe che permette la definizione di un triangolo
tridimensionale, gestendo le coordinate dei tre punti che ne costituiscono i
vertici.
Tre oggetti di tipo “Punto3D” vengono passati direttamente come parametri al
metodo costruttore.
È possibile, in seguito, accedere ad ognuno di essi tramite il metodo
“get_punto(indice)”.
Durante lo sviluppo del programma è stata aggiunta la possibilità di
memorizzare e recuperare, anziché le coordinate, un indice relativo alla
posizione dei singoli punti sulla sezione a cui appartengono (“Sezione_3D”),
per diminuire le dimensioni del codice Vrml generato.
47
Capitolo II
2.4.4.2
Implementazione
Package “sorgenti”
Raggruppa tutte le classi che hanno a che fare con la simulazione vera e
propria, ovvero con il calcolo della concentrazione di inquinante in
corrispondenza di una determinata coordinata spaziale.
Scansione
…
-x1, x2: double
…
-passi_x: int
…
-sorgente: Sorgente
-innalzamento: Innalzamento
-vento: Vento
-dispersione: Dispersione
…
+crea_mondo: void
+scan_2d: double[][]
+scanVrml: Sezione_3D
+genera_vettore_vento: double[]
…
Sorgente
#hg, diametro, v, q, cf:
double
-kyy, kzz: double
#vento: Vento
#innalzamento: Innalzamento
#dispersione: Dispersione
…
Dispersione
-k1,k2,k3,k4,k5: double
-kyy,kzz: double
-v: double
-tipo_dispersione: int
concentrazione(punto):
double
+get_sigmay(x): double
+get_sigmaz(x): double
+get_xl(hi,he): double
Vento
…
-velocita_sorgente: double
-quota_sorgente: double
-p: double
-altezza_rugosita: double
+get_velocita(z): double
Innalzamento
Sorgente_standard
Sorgente_terreno_riflettente
-quota_terreno: double
concentrazione(punto):
double
-velocita_s: double
-diametro_s: double
-altezza_s: double
-temperatura_s: double
-temperatura_a: double
-velocita_v: double
-param_gall: double
-quota_inversione: double
-dti: double
…
concentrazione(punto):
double
Sorgente inversione
-iterazioni: int
-z_inv: double
-xl: double
concentrazione(punto):
double
-concentrazione_xl(punto):
double
-concentrazione_2xl(punto):
double
-concentrazione_intermedia
(punto)
double
+delta_h(x): double
+supera_inversione():boolean
-calcola_xf()
…
48
Capitolo II
Implementazione
- Sorgente
È la classe che effettua il calcolo della concentrazione di inquinante in
corrispondenza di una determinata coordinata spaziale [Finz91, Ster76].
È dotata di un solo metodo, “concentrazione(Punto3D)”, che restituisce un
valore double.
Si tratta in realtà di una classe astratta, essendo tale metodo implementato
nelle classi derivate: “Sorgente_standard”, “Sorgente_terreno_riflettente” e
“Sorgente_inversione”.
Sorgente_standard
utilizza il modello gaussiano standard (non tiene conto
della riflessione del terreno), e non è utilizzata nelle versione definitiva del
programma.
Restituisce un valore di concentrazione definito da:
return (q/(2*3.14159*v_z*sigmay*sigmaz)) * Math.exp( -.5 *
((y*y)/(sigmay*sigmay) + (z-he)*(z-he)/(sigmaz*sigmaz)) ) +
cf;
Sorgente_terreno_riflettente
prende in considerazione la riflessione del
terreno, ed è utilizzata in due casi: assenza di strato di inversione termica (o,
comunque, presenza di uno strato non in grado di ostacolare la diffusione del
pennacchio di fumo), e presenza di uno strato posto ad una quota minore di
quella di emissione dei fumi.
Quest’ultima situazione viene trattata in modo simile alla riflessione sul
terreno, ipotizzando che sia posto alla quota di inversione.
Il valore di concentrazione è definito da:
return (q/(2*3.14159*v_z*sigmay*sigmaz)) *
(Math.exp(-.5 * (y*y)/(sigmay*sigmay))) *
(Math.exp(-.5*((z-he)*(z-he)/(sigmaz*sigmaz))) +
Math.exp(-.5*((z+he-2*quota_terreno)*(z+he-2*quota_terreno)
/(sigmaz*sigmaz))) ) + cf;
49
Capitolo II
Implementazione
Sorgente_inversione
è utilizzata in presenza di inversione in quota, ed è
leggermente più complessa delle due classi precedenti.
Il metodo pubblico “concentrazione”, infatti, fa riferimento a tre metodi
privati
(“concentrazione_xl”,
“concentrazione_2xl”
e
“concentrazione_intermedia”), utilizzati rispettivamente quando la coordinata
x del punto in esame è < XL, > 2 XL, oppure in posizione intermedia (si
faccia riferimento alla sezione teorica per la definizione di XL):
if (x <= xl)
return(concentrazione_xl(punto));
else if (x >= 2*xl)
return(concentrazione_2xl(punto));
else
return(concentrazione_intermedia(punto));
concentrazione_intermedia
effettua una interpolazione lineare tra i valori di
concentrazione alle coordinate XL e 2 XL.
I tre valori di concentrazione sono definiti rispettivamente da:
concentrazione_xl(): (la variabile iterazioni è definita pari a 2)
for (conta = -iterazioni; conta <= iterazioni; conta++) {
conc_z = conc_z + (Math.exp( -.5*(Math.pow( (z-he+2.0*conta*z_inv),
2.0) )
sigmaz*sigmaz))) +
(Math.exp( -.5*(Math.pow( (z+he+2.0*conta*z_inv), 2.0) )
/(sigmaz*sigmaz)));
}
return (q/(2*3.14159*v_z*sigmay*sigmaz)) *
(Math.exp(-.5 * (y*y)/(sigmay*sigmay))) *conc_z + cf;
concentrazione_2xl():
return (q / ((Math.sqrt(2*3.14159))*v_z*z_inv*sigmay)) *
(Math.exp(-.5 * (y*y)/(sigmay*sigmay))) + cf;
50
Capitolo II
Implementazione
concentrazione_intermedia():
conc_xl = concentrazione_xl(new Punto3D(xl, y, z));
conc_2xl = concentrazione_2xl(new Punto3D(2*xl, y, z));
return(conc_xl+(conc_2xl-conc_xl)*((x-xl)/xl));
- Scansione
È la classe che gestisce e coordina l’accesso a tutte le altre classi del package.
Il metodo costruttore riceve, dalla classe “controllore”, tutti i parametri
specificati dall’utente.
In base a tali parametri, il metodo “crea_mondo” provvede alla creazione dei
vari oggetti richiesti: “Vento” (se non si è specificato che il profilo verticale
debba essere costante: in tal caso viene posto al valore “null”),
“Innalzamento” (se richiesto dall’utente, altrimenti anch’esso è posto a
“null”), “Dispersione” (in base al modello richiesto dall’utente) e “Sorgente”.
Prima di creare quest’ultimo oggetto, viene valutata l’eventuale presenza di
uno strato di inversione termica, la sua quota e la sua escursione termica, per
stabilire
il
tipo
di
sorgente
da
adottare,
scegliendo
“Sorgente_terreno_riflettente” e “Sorgente_inversione”:
tipo = 2;
double quota_terreno = 0;
if ((inversione_attiva) && ((innalzamento != null) &&
(!innalzamento.supera_inversione())))
/* inversione attiva, e l'innalzamento non la supera */
tipo = 3;
if ((inversione_attiva) && (innalzamento == null))
/* inversione attiva, e innalzamento non attivo */
tipo = 3;
if ((inversione_attiva) && (quota_inversione < hg)) {
/* inversione attiva, ma a quota < hg */
tipo = 2;
quota_terreno = quota_inversione;
}
51
tra
Capitolo II
Implementazione
switch (tipo) {
/* sorgente_terreno_riflettente , per terreno riflettente o inversione
< hg */
case 2:
sorgente = new Sorgente_terreno_riflettente(...);
break;
/* sorgente_inversione , per inversione > hg */
case 3:
sorgente = new Sorgente_inversione(...);
break;
}
Indipendentemente dalla classe effettivamente istanziata, per il calcolo della
concentrazione si farà riferimento alla variabile “sorgente”.
Il metodo “scan2d” si occupa della creazione del vettore a due dimensioni
contenente i valori di concentrazione da visualizzare nelle rappresentazioni
bidimensionali.
Effettua una scansione, con i limiti spaziali e il numero di passi impostati
dall’utente, calcola per ogni punto il relativo valore della concentrazione di
inquinante, e restituisce l’insieme dei valori in un array del tipo “double[][]”.
Il metodo “scanVrml” è finalizzato all’individuazione dei bordi del pennacchio,
per la visualizzazione tridimensionale, ed è più complesso del precedente.
Riceve, come parametri di ingresso, la coordinata “x”, il passo di calcolo lungo
le coordinate “y” e “z”, e il valore di concentrazione in corrispondenza del
quale si identifica il bordo del pennacchio (generalmente pari a 1 10 della
concentrazione massima rilevata per la sezione in esame).
52
Capitolo II
Implementazione
Figura 7 – Procedura utilizzata per individuare i bordi del pennacchio
2
3
[C
.
.
.
.
.
.
.
.
.
.
.
z
1
y
La prima operazione svolta è una scansione verticale (1): si individuano, in
questo modo, dapprima la concentrazione massima, quindi il punto superiore
del bordo del pennacchio.
Le fasi (2) e (3) consistono in due cicli annidati: dapprima si scende a passi
prefissati lungo l’asse z, e ad ogni passo si prosegue lungo l’asse y finché si
raggiunge nuovamente un valore di concentrazione che individui il bordo del
pennacchio.
Si continua poi la discesa, proseguendo finché il punto individuato ha
coordinata y nulla (come in figura), oppure finché si raggiunge il terreno.
Si completa quindi il bordo sfruttando la simmetria rispetto all’asse z,
replicando specularmente i punti individuati.
I passi di calcolo lungo le coordinate y e x vengono impostati dal controllore
(nel metodo chiamante “genera_vrml”), e variati ad ogni sezione, in base alle
dimensioni di quella precedente.
Il metodo restituisce un oggetto di tipo “Vector”, contenente l’insieme di
53
Capitolo II
Implementazione
punti (tipo “Punto3D”) individuati, che identificano quindi il bordo della
sezione del pennacchio posta alla coordinata x richiesta.
Vi sono due metodi addizionali, “genera_sezione_vrml_iniziale” e “
genera_sezione_vrml_finale”,
anch’essi richiamati dal controllore, che si
occupano di aggiungere, all’insieme delle sezioni, quella iniziale (coincidente
con il bordo della ciminiera) e quella finale (un solo punto, in posizione
baricentrica rispetto all’ultima sezione, per chiudere la superficie del
pennacchio).
Un esempio dei risultati ottenuti è mostrato nell’immagine seguente:
Figura 8 – Bordi delle sezioni che delimitano il pennacchio
Il metodo “genera_vettore_vento”, infine, restituisce un array (double[]) che
contiene i valori di velocità del vento alle quote comprese tra il minimo ed il
54
Capitolo II
Implementazione
massimo valore richiesti per la vista bidimensionale; viene utilizzato per
tracciare il profilo verticale di velocità visualizzabile contemporaneamente alla
sezione.
- Dispersione
È la classe utilizzata per il calcolo dei valori di dispersione lungo le direzioni y
e z.
All’atto dell’inizializzazione, imposta i valori delle tabelle utilizzate per i calcoli
in base al modello prescelto.
I due metodi principali sono “get_sigmay(x)” e “get_sigmaz(x)”, che
restituiscono i due valori di dispersione.
Il metodo “get_xl(hi,
he)”,
è utilizzato da
Sorgente_terreno_riflettente
per ottenere il valore di XL.
- Vento
È la classe utilizzata per il calcolo della velocità del vento alla generica quota
(z).
Il metodo costruttore imposta la tabella di valori utilizzata.
Il metodo “get_velocita(z)” restituisce il valore della velocità alla quota
indicata, tenendo conto dei seguenti limiti di validità:
if (z > 100) z = 100;
if (z < altezza_rugosita) z = altezza_rugosita;
Nel primo caso si tiene conto del fatto che la formula utilizzata non viene
reputata affidabile oltre i 100m; nel secondo caso si evita di ottenere velocità
nulle al suolo, che farebbero divergere la formula utilizzata per il calcolo della
concentrazione di inquinante.
55
Capitolo II
Implementazione
- Innalzamento
È la classe utilizzata per il calcolo dell’altezza effettiva della sorgente.
Il metodo principale è “delta_h(x)”, che restituisce il valore del
sovrainnalzamento del pennacchio di fumo, in funzione della coordinata x.
Sono previsti pennacchi di tipo galleggiante,
delta = 1.6 * Math.pow(param_gall, 1.0/3.0) * Math.pow(x, 2.0/3.0) /
velocita_v;
oppure di tipo jet:
delta = 2.3 * Math.pow(param_inerz, 1.0/3.0) * Math.pow(velocita_v,
-2.0/3.0) * Math.pow(x, 1.0/3.0);
Il metodo “calcola_xf()” è utilizzato per determinare il valore della
coordinata x oltre cui il pennacchio si può ritenere livellato (per convenzione,
lo si assume tale quando la sua pendenza scende al di sotto del 5%).
Anziché fare riferimento alle formule indicate nella sezione teorica, si è
preferito utilizzare un approccio di tipo “operativo”, effettuando una
scansione lungo la direzione x, calcolando ad ogni passo la pendenza del
pennacchio ( (quota attuale – quota precedente)/(intervallo lungo x) ) fino al
soddisfacimento della condizione prevista.
Il metodo accessorio “supera_inversione()” (restituisce un valore di tipo
logico), viene utilizzato per verificare se l’innalzamento viene limitato dalla
presenza di uno strato di inversione.
56
Capitolo II
2.4.4.3
Implementazione
Package “grafica”
Raggruppa le classi utilizzate per la rappresentazione bidimensionale.
Sezione
Tabella_colori
…
-[misure e bordi …]
…
-disegna_legenda: boolean
-disegna-vento: boolean
Profilo_vento
-colori: Color[]
…
-[misure e bordi …]
+get_color: Color
+disegna: void
+disegna_sezione: void
-ordine_di_grandezza: int
+disegna_assi: void
+disegna_legenda: void
- Tabella_colori
Crea una tabella contenente una scala di 64 valori cromatici, che verranno
messi in corrispondenza con le concentrazioni di inquinante visualizzate nella
sezione bidimensionale.
La scelta delle tonalità si è basata sulla mappa di colori di tipo “jet” definita in
Matlab.
Il metodo “get_color(indice)” restituisce il colore corrispondente all’indice
specificato.
- Profilo_vento
Effettua il tracciamento del profilo verticale della velocità del vento,
sovrapponendolo alla sezione bidimensionale.
I
valori
sono
contenuti
nell’array
creato
da
“Scansione.genera_vettore_vento()”.
Il metodo “disegna(finestra_grafica,
...)”
velocita_sorgente, array_velocita,
riceve dal controllore, come parametri, un riferimento alla finestra
57
Capitolo II
Implementazione
grafica su cui operare, la velocità del vento al punto di emissione e l’array
contenente i vari valori di velocità che verranno disegnati.
- Sezione
È la classe principale di questo package.
Il metodo costruttore riceve le dimensioni dell’immagine da creare.
Il metodo “disegna_sezione(finestra_grafica,
dapprima un oggetto di tipo
array2d_valori)”
Tabella_colori,
crea
quindi genera una
rappresentazione dei valori numerici contenuti nell’array bidimensionale,
scalandola in base alle dimensioni della finestra (riservando gli spazi opportuni
per gli assi e la legenda dei colori).
Il metodo “disegna_legenda(...)” visualizza tutti i colori componenti la
tabella_colori,
associati ai corrispondenti valori numerici di concentrazione.
Utilizza il metodo privato “ordine_di_grandezza(valore_max)” per formattare
correttamente i valori elencati.
Il metodo “disegna_assi(...)” traccia i due assi coordinati, con suddivisioni
principali e secondarie.
58
Capitolo II
2.4.4.4
Implementazione
Package “vrml_fumo”
È il package che raggruppa le classi che si occupano di generare la
visualizzazione tridimensionale del pennacchio di fumo.
Le tre classi vengono utilizzate dal metodo “genera_vrml” del controllore.
Sezione_3D
Pennacchio
-vettore_punti: double[][]
-…[parametri vari]
...
-vettore_sezioni: Vector
-vettore_triangoli: Vector
+set_vettore_punti: void
+set…[parametri vari]: void
+get…[parametri vari]: void
+get_punto: Punto3D
+aggiungi_random: void
+genera_superficie: Vector
-genera_superficie_tra_sezioni:
Vector
-aggiungi_triangolo: void
-aggiungi_quadrilatero: void
-distanza_2_punti: double
File_vrml
-…[parametri ciminiera]
-…[parametri piano di sezione]
-browser: Browser
-…[nodi Vrml]: Node[]
+scrivi_EAI: void
-genera_ciminiera: void
-genera_triangoli_con_indici: void
-genera_triangoli_con_coordinate: void
-genera_fabbrica: void
-genera_freccia_vento: void
-genera_piano_sezione: void
…
- Sezione_3D
È la classe utilizzata per la rappresentazione del bordo di una sezione del
pennacchio (definita da un valore costante della coordinata x).
Contiene l’insieme dei punti che la definiscono, e vari parametri che la
caratterizzano, utilizzati da altri metodi (altezza, larghezza, numero di punti,
concentrazione massima).
Sono
presenti
i
metodi
per
impostare/recuperare
tali
attributi
:
“set_vettore_punti(array_punti)”, “get_punto(indice)”, etc.
Vi è, inoltre, il metodo “aggiungi_random(...)”, che aggiunge una
componente stocastica alla posizione dei punti che compongono il bordo della
sezione.
Tale componente è data dalla somma di due contributi:
• radiale, proporzionale alla distanza di ogni punto dal baricentro della
59
Capitolo II
Implementazione
sezione (diversa per ogni punto)
• traslazione y-z dell’intera sezione, con valore proporzionale alle sue
dimensioni.
Viene anche imposto un allargamento delle sezioni, nei casi in cui le
dimensioni del pennacchio in prossimità del punto di emissione siano minori
di quelle della ciminiera (la formula per il calcolo della concentrazione si basa
infatti su una sorgente puntiforme, per cui c’è la possibilità che la parte iniziale
del pennacchio abbia dimensioni troppo ridotte, con risultati poco realistici).
- Pennacchio
È la classe che, partendo dall’insieme dei bordi delle sezioni, provvede a
generare la superficie del pennacchio di fumo.
Il metodo costruttore riceve come parametro il vettore contenente le varie
sezioni (“vettore_sezioni”).
L’unico metodo pubblico, “genera_superficie()”,restituisce un vettore
(“vettore_triangoli”), contenente a sua volta i vettori che descrivono le
superfici definite da coppie adiacenti di sezioni.
Per ogni coppia, il metodo effettua una chiamata del tipo:
vettore_triangoli.addElement( genera_superficie_tra_sezioni(sezione_1,
sezione_2, ...) );
Si utilizzano triangoli (oggetti di tipo “Triangolo3D”) come componenti
elementari della superficie perché sono forme geometriche sicuramente
planari, e quindi facilmente gestibili.
Nel metodo privato “genera_superficie_tra_sezioni(sezione_1,
...)”
sezione_2,
si fa ricorso ad un algoritmo abbastanza semplice, che ha fornito
comunque risultati soddisfacenti sfruttando la semplicità e la similitudine dei
60
Capitolo II
Implementazione
due contorni da unire.
Le variabili “punto1” e “punto2” indicano rispettivamente il punto raggiunto
durante la scansione della prima e della seconda sezione; “num_punti1” e
“num_punti2” il numero di punti totali di ognuna.
Si scandiscono sequenzialmente i punti della prima sezione, si calcolano ad
ogni passo le distanza tra (punto1+1)-(punto2) [d1], (punto1+1)-(punto2+1)
[d2] e (punto1)-(punto2+1) [d3],
Figura 9 – Possibili scelte per la generazione del triangolo
punto1
Sezione 1
d3
d2
d1
Sezione 2
punto2
e, a seconda di quale risulti essere minore, si sceglie fra le tre possibilità:
1) creazione di un triangolo individuato da (punto1+1), (punto2), (punto1) :
Figura 10 – d1 è la distanza minore
2) creazione di un quadrilatero individuato da (punto1), (punto1+1),
(punto2+1), (punto2). Ne viene quindi effettuata la scomposizione nei due
triangoli, composti da (punto1), (punto2+1), (punto2) e da (punto1),
(punto1+1), (punto2+1) :
61
Capitolo II
Implementazione
Figura 11 – d2 è la distanza minore
3) creazione di un triangolo individuato da (punto1), (punto2+1), (punto2) :
Figura 12 – d3 è la distanza minore
Una volta giunti al termine di una delle due sezioni, esiste la possibilità che
l’altra abbia dei punti residui non ancora interconnessi; in questo caso, si
effettua un semplice ciclo che unisce l’ultimo punto della sezione completa
con quelli ancora vacanti.
Una esemplificazione del codice è riportata di seguito:
boolean finito1 = false ,finito2 = false;
while ( (!finito1) && (!finito2) ) { /* ripeto finchè non ho
esaurito i punti di una
delle sezioni */
dist1 = distanza_2_punti(sezione1.get_punto(punto1+1-1),
sezione2.get_punto(punto2-1));
dist2 = distanza_2_punti(sezione1.get_punto(punto1+1-1),
sezione2.get_punto(punto2+1-1));
dist3 = distanza_2_punti(sezione1.get_punto(punto1-1),
sezione2.get_punto(punto2+1-1));
if ( (dist1 <= dist2) && (dist1 <= dist3) ) { /*minimo = dist1*/
punto1++;
aggiungi_triangolo(vettore,
sezione1.get_punto((punto1-1)-1),
sezione1.get_punto((punto1)-1),
sezione2.get_punto((punto2)-1),
62
Capitolo II
Implementazione
...);
} else if ( (dist2 <= dist1) && (dist2 <= dist3) ) { /*minimo =
dist2 */
punto1++;
punto2++;
aggiungi_quadrilatero(vettore,
sezione1.get_punto((punto1-1)-1),
sezione1.get_punto((punto1)-1),
sezione2.get_punto((punto2)-1),
sezione2.get_punto((punto2-1)-1),
...);
} else { /* minimo = dist3 */
punto2++;
aggiungi_triangolo(vettore,
sezione1.get_punto((punto1)-1),
sezione2.get_punto((punto2)-1),
sezione2.get_punto((punto2-1)-1),
...);
}
if (punto1 >= num_punti1) finito1 = true;
if (punto2 >= num_punti2) finito2 = true;
}
while (!finito2) { /* se ho esaurito prima i punti della sezione
n. 1 */
punto2++;
aggiungi_triangolo(vettore,
sezione1.get_punto((punto1)-1),
sezione2.get_punto((punto2)-1),
sezione2.get_punto((punto2-1)-1),
...);
if (punto2 >= num_punti2) finito2 = true;
}
while (!finito1) { /* se ho esaurito prima i punti della sezione
n. 2 */
punto1++;
aggiungi_triangolo(vettore,
sezione1.get_punto((punto1-1)-1),
sezione1.get_punto((punto1)-1),
sezione2.get_punto((punto2)-1),
...);
if (punto1 >= num_punti1) finito1 = true;
}
la seguente immagine mostra un esempio dei risultati ottenuti:
63
Capitolo II
Implementazione
Figura 13 – Generazione triangoli tra due sezioni adiacenti
Si è già accennato, a questo punto, agli altri tre metodi privati esistenti:
• “distanza_2_punti(punto1,
punto2)”
restituisce la distanza tra due punti
tridimensionali
• “aggiungi_triangolo(vettore,
punto1, punto2, punto3, ...)”
aggiunge
il triangolo indicato al vettore contenente l’insieme dei triangoli
• “aggiungi_quadrilatero(vettore,
...)”
punto1,
punto2,
punto3,
punto4,
aggiunge due triangoli, scomponendo il quadrilatero come indicato
precedentemente.
- File_vrml
È la classe che si occupa dell’interazione con il browser Vrml, generando una
vista tridimensionale della scena.
Il metodo costruttore riceve i parametri che definiscono le dimensioni della
ciminiera (per il suo posizionamento nella scena), il piano di sezione
bidimensionale della vista bidimensionale, e un riferimento al browser Vrml
64
Capitolo II
Implementazione
(ottenuto dal metodo “start” dell’applet).
Il metodo pubblico “scrivi_EAI(…)”coordina i sottostanti metodi privati che
provvedono alla generazione degli elementi Vrml richiesti [www03, www04,
www05, www06, www07, www08, www09, www10, www11].
Il metodo privato “genera_ciminiera(...)” si occupa della generazione della
ciminiera.
Crea la stringa Vrml necessaria, effettua la traslazione per posizionare
correttamante
l’oggetto
e
richiama
il
metodo
“browser.createVrmlFromString(stringa)”:
EventInMFNode addChildren_ciminiera = null;
EventInSFVec3f trasla = null;
float traslazione[] = new float[3];
trasla = (EventInSFVec3f) ciminiera.getEventIn("set_translation");
addChildren_ciminiera = (EventInMFNode)
ciminiera.getEventIn("addChildren");
traslazione[0] = 0; traslazione[1] = (float)altezza_ciminiera/2;
traslazione[2] = 0;
trasla.setValue(traslazione);
stringa
stringa
stringa
stringa
stringa
stringa
stringa
=
+=
+=
+=
+=
+=
+=
"Shape { ";
"appearance Appearance { ";
"material Material {diffuseColor .8 .8 .8 } ";
"texture ImageTexture {url \"camino.jpg\"}";
"}";
"geometry Cylinder { ";
"radius "+diametro_ciminiera/2+" height "
+altezza_ciminiera;
stringa +=
"} ";
stringa +=
"} ";
newNode_ciminiera = browser.createVrmlFromString(stringa);
addChildren_ciminiera.setValue(newNode_ciminiera);
In modo simile operano anche gli altri metodi privati:
“genera_triangoli_con_coordinate(...)” e “genera_triangoli_con_indici(...)”
effettuano una scansione del vettore contenente l’insieme di triangoli che
65
Capitolo II
Implementazione
definiscono la superficie del pennacchio, e generano le stringhe Vrml che ne
forniscono la rappresentazione tridimensionale.
Con il primo dei due metodi si elencano sequenzialmente tutti i punti che
definiscono i triangoli, quindi saranno presenti notevoli ridondanze; con il
secondo, si elencano i punti che compongono i bordi delle sezioni, e i
riferimenti necessari per definire i triangoli, riducendo di circa il 50% le
dimensioni del codice Vrml.
“genera_fabbrica(...)” genera una rappresentazione semplificata dell’edificio
adiacente alla ciminiera, adeguando eventualmente ad essa le dimensioni.
“genera_freccia_vento(...)” mostra, se richiesto, una freccia indicante
direzione e verso del vento, posizionata in prossimità della parte terminale
della ciminiera.
“genera_piano_sezione(...)” mostra, se richiesto, una superficie semitrasparente, corrispondente in dimensioni e posizione ai limiti della vista
bidimensionale, per agevolarne l’individuazione nella vista tridimensionale.
66
Capitolo II
2.5
2.5.1
Implementazione
Note operative
Files componenti il progetto
Sorgenti java:
Controller11.java
Fumo11.java
\grafica\Profilo_vento.java
\grafica\Sezione.java
\grafica\Tabella_colori.java
\sorgenti\Dispersione.java
\sorgenti\Innalzamento.java
\sorgenti\Scansione.java
\sorgenti\Sorgente.java
\sorgenti\Sorgente_inversione.java
\sorgenti\Sorgente_standard.java
\sorgenti\Sorgente_terreno_riflettente.java
\sorgenti\Vento.java
\utilita\Punto3D.java
\utilita\Triangolo3D.java
\vrml_fumo\EAI.java
\vrml_fumo\File_vrml.java
\vrml_fumo\Pennacchio.java
\vrml_fumo\Sezione_3D.java
Tutti i files indicati vengono compilati, ed i corrispondenti files
“.class”
generati vengono raggruppati, assieme al file “manifest.txt”, nell’archivio
“Fumo.jar”.
File vrml:
world.wrl
Immagine per mappatura ciminiera:
67
Capitolo II
Implementazione
camino.jpg
Immagine per mappatura alberi:
albero.gif
File html:
main.html
La distribuzione del programma richiede quindi i seguenti files:
Fumo.jar
main.html
world.wrl
camino.jpg
albero.gif
contiene tutti i files “.class”, e
“manifest.txt”
file “html” caricato nel browser
file “Vrml” contenente le parti fisse della
scena tridimensionale
immagine da mappare sulla ciminiera
immagine da mappare sugli alberi
68
Capitolo II
2.5.2
Implementazione
Istruzioni per la compilazione del programma
I files sorgenti vanno disposti nella configurazione seguente:
[Fumo11.java, Controller11.java]
grafica
[Profilo_vento.java, Sezione.java, abella_colori.java]
sorgenti
[Dispersione.java, Innalzamento.java, Scansione.java,
Sorgente.java, Sorgente_inversione.java,
Sorgente_standard.java,
Sorgente_terreno_riflettente.java, Vento.java]
utilita
[Punto3D.java, Triangolo3D.java]
vrml_fumo
[File_vrml.java, Pennacchio.java, Sezione_3D.java]
Per la compilazione del programma è richiesta inoltre la presenza di
CosmoPlayer, poiché si fa riferimento ad alcune librerie con esso fornite,
contenute nel file “npcosmop21.zip”.
Bisogna quindi specificare la posizione di tale file, e negli esempi seguenti si
suppone
che
l’installazione
sia
avvenuta
nella
directory
“C:\Programmi\CosmoSoftware\CosmoPlayer”.
2.5.2.1
Compilazione con JDK
Bisogna posizionarsi nella directory contenente il file “Fumo11.java”
Si deve quindi impostare la variabile d’ambiente “CLASSPATH”: è possibile farlo
globalmente, oppure specificarla tramite linea di comando quando si invoca il
compilatore Java, con lo switch “-classpath” seguito dal valore da assegnare:
javac Fumo11.java -classpath .;C:\Programmi\CosmoSoftware\CosmoPlayer\
npcosmop21.zip
2.5.2.2
Compilazione con JBuilder
69
Capitolo II
Implementazione
Una volta impostato un progetto contenente tutti i files sorgenti, bisogna
modificarne le proprietà, definendo una nuova versione del Jdk che includa
nel “class
2.5.2.3
path”
il file “ npcosmop21.zip”, con il relativo percorso.
Creazione dell’archivio “.jar”
Dopo la compilazione, sono presenti i vari files con estensione “.class”, che
vanno raggruppati in un unico archivio, insieme al file di nome
“manifest.txt” che contiene il nome della classe principale (il suo contenuto è
semplicemente “Main-Class:
Fumo11”).
Si utilizza il programma “jar”, che effettua il raggruppamento e la
compressione, con la seguente sintassi:
jar cfvm Fumo.jar manifest.txt Fumo11*.class Controller11.class
grafica\*.class sorgenti\*.class utilita\*.class vrml_fumo\*.class
Si ottiene un unico file di nome “Fumo.jar”, di dimensioni molto ridotte (circa
60 Kbytes).
La compattezza agevola il caricamento del programma tramite Internet; il
raggruppamento in un unico file permette inoltre di caricare tutte le classi con
un unico collegamento (se si mantenessero separati i singoli files si avrebbe
bisogno di un collegamento per ognuno di essi; sommando ciò a dimensioni
totali maggiori, si otterrebbe un notevole aumento dei tempi di caricamento).
Una volta creato l’archivio bisogna posizionare nella stessa directory gli altri
quattro files richiesti (“main.html”, “world.wrl”, “camino.jpg”, “albero.gif”).
70
Capitolo II
2.5.3
Implementazione
Definizione dei parametri
Per l’esecuzione del programma è sufficiente aprire il file “main.html” con
“Netscape Communicator” o “Microsoft Internet Explorer” (in alcuni casi
quest’ultimo si è dimostrato però piuttosto instabile).
Nella parte superiore della pagina compare il browser Vrml “CosmoPlayer”,
con la visualizzazione della vista tridimensionale, nella parte inferiore trova
posto l’applet, con una zona preposta alla specifica dei parametri ed una alla
visualizzazione delle sezioni bidimensionali:
Figura 14 – Finestre che appaiono nel browser html
71
Capitolo II
Implementazione
L’inserimento dei parametri avviene selezionando, tramite i pulsanti posti
nell’angolo superiore sinistro dell’applet, una delle cinque sezioni; una volta
definiti i vari campi, si può passare alla visualizzazione, utilizzando i pulsanti
“Aggiorna Vista 3D” o “Aggiorna Sezione”.
I parametri specificabili dall’utente sono i seguenti:
1) Parametri Sorgente
Figura 15- Sezione “Parametri Sorgente”
Questa sezione raggruppa i parametri riguardanti gli estremi del piano di
sezione da visualizzare, e quelli specifici per la sorgente.
Per il piano di sezione si possono specificare:
• valore minimo e massimo per ognuna delle tre coordinate
• numero di suddivisioni della griglia di calcolo
• scelta tra sezione sul piano y-z (coordinata x costante), x-z (coordinata y
costante) o x-y (coordinata z costante).
• scalatura automatica o manuale dei valori di concentrazione
Gli assi coordinati sono disposti secondo lo schema seguente (terna
destrorsa):
• asse x: orizzontale, direzione e verso coincidenti con quelli del vento
• asse y: orizzontale, ortogonale all’asse x, valori crescenti verso sinistra nella
direzione e verso dell’asse x
72
Capitolo II
Implementazione
• asse z: verticale, valori crescenti sollevandosi dal terreno
La sorgente di emissione è definita da:
• Hg (quota di emissione , ovvero altezza della ciminiera)
• Q (portata di inquinante)
• Cf (concentrazione di fondo, ovvero quantità di inquinante già presente in
atmosfera).
2) Profilo Vento
Figura 16 – Sezione “Profilo Vento”
In questa sezione si specificano:
• la velocità del vento
• se il profilo verticale debba o meno essere costante (nel primo caso la
velocità è uniforme ad ogni quota, ed è quella specificata al punto
precedente)
• se si vuole una visualizzazione grafica dell’andamento del profilo,
sovrapposta all’immagine della sezione
• la rugosità del terreno
• la stabilità atmosferica.
73
Capitolo II
Implementazione
3) Innalzamento/Inversione
Figura 17 – Sezione “Innalzamento / Inversione”
In questa sezione si specificano i parametri che influenzano l’innalzamento del
pennacchio in uscita dalla ciminiera:
• velocità di efflusso dei fumi
• diametro terminale della ciminiera
• temperatura dei fumi e dell’atmosfera,
• attivazione dell’innalzamento
• tipo di pennacchio (galleggiante o jet).
Si specificano inoltre i parametri riguardanti un eventuale strato di inversione
termica:
• Zf i, ovvero quota finale dello strato
• Z i, ovvero quota iniziale dello strato
• Tfi – Ti, ovvero escursione termica totale
• attivazione dello strato di inversione
74
Capitolo II
Implementazione
4) Dispersione
Figura 18 – Sezione “Dispersione”
Questa sezione è finalizzata alla scelta del modello da utilizzare per il calcolo
dei coefficienti di dispersione lungo le coordinate y e z; se si opta per “Kyy,
Kzz costanti” si devono anche specificare i valori da utilizzare per questi due
parametri.
Si indica di fare riferimento alla sezione “Profilo Vento” per quanto riguarda
la stabilità atmosferica, essendo questo un parametro che influenza anche la
dispersione.
5) Vrml
Figura 19 – Sezione “Vrml”
In questa sezione si operano le scelte riguardanti la visualizzazione
tridimensionale:
• possibilità di visualizzazione della zona corrispondente alla vista
bidimensionale
• possibilità di visualizzazione di una freccia indicante la direzione del vento,
75
Capitolo II
Implementazione
posta in prossimità dello sbocco della ciminiera
• scelta dell’intensità della variazione casuale della superficie del pennacchio
76
Capitolo III
Esempi di utilizzo
In questo capitolo si presenteranno alcuni esempi di utilizzo del programma,
in condizioni ritenute significative, specificando i parametri impostati e
mostrando le rappresentazioni grafiche che ne derivano, con viste
bidimensionali e tridimensionali.
La situazione di partenza è definita dai seguenti parametri::
• Sorgente:
-
Hg
Q
Cf
Velocità fumi:
Diametro ciminiera:
Tipo pennacchio:
Dispersione:
Kyy
Kzz
60 m
10 g/s
0
10 m/s
4m
galleggiante
Kyy, Kzz costanti
10
4
• Vento:
- Velocità
- Profilo verticale
5 m/s
costante
• Rugosità terreno:
0.01 m (prato rasato)
• Stabilità atmosfera:
neutra
• Strato di inversione termica:
nessuno
• Vista bidimensionale:
- scala valori:
automatica
77
Capitolo III
Esempi di utilizzo
• Vista tridimensionale:
- variazione casuale superficie:
- mostra piano sezione:
- mostra direzione vento:
normale
no
no
78
Capitolo III
Esempi di utilizzo
Esempio 1: situazione iniziale
Si fa riferimento ai parametri precedentemente elencati.
Le viste bidimensionali corrispondono, nell’ordine, a:
• sezione sul piano x-z (y = 0), con cui si può apprezzare l’innalzamento del
pennacchio, di tipo galleggiante.
• sezione sul piano x-z (y = 300), simile alla precedente, ma disassata rispetto
alla sorgente.
• sezione sul piano y-z (x = 1000), corrispondente ad una sezione frontale.
• sezione sul piano x-y (z = 0), ovvero concentrazione al suolo.
79
Capitolo III
Esempi di utilizzo
80
Capitolo III
Esempi di utilizzo
Esempio 2: inversione in quota
Si aggiunge uno strato di inversione in quota, mantenendo gli altri parametri
invariati rispetto al caso precedente.
Nella vista tridimensionale risulta molto evidente come il fumo, una volta
raggiunto lo strato limite, venga riflesso verso il terreno.
Si può fare un raffronto con la vista tridimensionale dell’esempio n.1.
Le viste bidimensionali corrispondono, nell’ordine, a:
• sezione sul piano x-z (y = 0), in cui si nota l’addensamento del fumo al di
sotto dello strato di inversione, e la sua riflessione.
• sezione sul piano x-y (z = 0), ovvero concentrazione al suolo. Rispetto
all’esempio precedente, la concentrazione massima ha un valore superiore
di quattro ordini di grandezza.
• sezione sul piano y-z (frontale, x = 800 m).
• sezione sul piano y-z (frontale, x = 800 m), senza strato di inversione. Nel
confronto con l’immagine precedente, si evidenzia chiaramente l’effetto di
tale strato.
81
Capitolo III
Esempi di utilizzo
82
Capitolo III
Esempi di utilizzo
Esempio 3: profilo verticale del vento non costante
Si considera una situazione simile alla precedente, ma con il profilo verticale
del vento non costante.
Si nota di conseguenza una maggiore concentrazione di inquinante in
prossimità del suolo, dove la velocità del vento risulta minore.
Si riportano solamente le viste bidimensionali, non essendo il risultato molto
evidente nella vista tridimensionale:
• sezione sul piano x-z (y = 0). Quando il fumo riflesso dallo strato limite
raggiunge il terreno, si può notare il notevole addensamento risultante,
dovuto alla velocità del vento molto ridotta (è indicato l’andamento del
profilo del vento, associato alla velocità al punto di emissione)
• sezione sul piano x-z (y = 0). In questo caso si mantiene costante il profilo
del vento (a parità di altri parametri), per mostrare la notevole differenza
della concentrazione in prossimità del suolo.
• sezione sul piano y-z (sezione frontale, con x = 350 m), con profilo
verticale del vento variabile.
• sezione sul piano y-z (frontale, x = 350 m), con profilo verticale del vento
costante.
83
Capitolo III
Esempi di utilizzo
Esempio 4: pennacchio galleggiante o di tipo “jet”
In questo caso si utilizzano gli stessi parametri dell’esempio n.1, considerando
però il pennacchio dapprima galleggiante, poi di tipo jet.
Si può notare che il sovrainnalzamento del pennacchio galleggiante prosegue
per distanze notevoli, mentre quello del pennacchio di tipo jet si esaurisce
rapidamente, ed è concentrato in prossimità del punto di emissione.
Per ognuno dei due casi sono riportate una vista tridimensionale ed una
sezione sul piano x-z.
84
Capitolo III
Esempi di utilizzo
Esempio 5: atmosfera stabile/instabile
Si utilizzano le formule di Briggs (open-country) per valutare i coefficienti di
dispersione, considerando i casi di atmosfera moderatamente stabile (cat. E) e
moderatamente instabile (cat. B).
Si può notare il notevole aumento di ampiezza del pennacchio nella seconda
situazione, a cui corrisponde ovviamente un valore di concentrazione
inferiore.
Si riportano le viste tridimensionali e le corrispondenti sezioni sul piano x-z.
85
Capitolo III
Esempi di utilizzo
Esempio 6: variazione casuale della sueprficie del pennacchio
Si mostrano le quattro possibilità a disposizione per quanto riguarda la
variazione casuale della superficie del pennacchio.
Nella prima immagine non si è applicata nessuna variazione, per cui il risultato
mostrato coincide con la semplice distribuzione gaussiana; vengono anche
visualizzati la freccia che indica direzione e verso del vento e il rettangolo che
corrisponde alla vista bidimensionale.
Nelle altre tre immagini si è impostata, rispettivamente, una variazione
minima, normale e massima, e si possono apprezzare gli effetti man mano
crescenti da essa determinati.
86
Capitolo IV
Conclusioni
In questo capitolo conclusivo vengono discusse le prestazioni e le
caratteristiche principali del programma, commentando i risultati in
riferimento alle specifiche di progetto.
4.1
Prestazioni e dimensioni del programma
Le prestazioni ottenibili dal programma, utilizzando come riferimento una
macchina di fascia economica (processore AMD K6-2 a 400 MHz, 64 MB di
ram), risultano abbastanza buone.
In particolare, per quanto riguarda la visualizzazione delle sezioni
bidimensionali i tempi di risposta si mantengono inferiori al secondo, con una
griglia di calcolo di 100x100 punti, crescendo linearmente con l'aumentare
della risoluzione.
Per quanto riguarda invece la rappresentazione tridimensionale, il tempo
richiesto per la generazione della scena oscilla generalmente tra i 2 ed i 5
secondi, a seconda della macchina virtuale Java utilizzata e dell'eventuale
presenza di un compilatore “just-in-time”.
Questi tempi si possono ritenere accettabili per l'utilizzo verso cui è
indirizzato il programma, ovvero una veloce verifica degli effetti causati dalla
variazione dei vari parametri che sono previsti nel modello gaussiano; bisogna
anche considerare che la scelta di utilizzare il linguaggio Java presuppone
implicitamente la rinuncia a prestazioni particolarmente elevate.
Considerando le specifiche iniziali, che prevedevano l'utilizzo del programma
tramite internet, si deve evidenziare il fatto che le dimensioni fisiche del
87
Capitolo IV
Conclusioni
programma rivestono, per la valutazione delle prestazioni complessive,
un'importanza forse maggiore delle stessa velocità di esecuzione.
Risulterebbe molto scomodo, infatti, avere tempi di caricamento superiori ai
20-30 secondi, da cui deriva che un limite ragionevole alle dimensioni è di
150-200 Kbytes, ipotizzando una tipica connessione a 56 Kbit/s.
Da questo punto di vista Java si rivela una buona scelta, grazie alla intrinseca
compattezza che caratterizza i programmi con esso realizzati: si è ottenuto
infatti un file di dimensioni inferiori a 60 Kbytes, a cui corrispondono quindi
meno di 10 secondi di caricamento.
4.2
Resa grafica
La vista tridimensionale che si è ottenuta risulta abbastanza funzionale, e
permette di valutare in modo immediato le principali caratteristiche del
pennacchio di fumo, identificandone il comportamento: saranno evidenti, ad
esempio, la differenza tra un pennacchio galleggiante ed uno di tipo jet,
l'influenza delle velocità del fumo e del vento, la limitazione all'espansione
verticale causata da uno strato di inversione, le differenze derivanti
dall’utilizzo di vari modelli per il calcolo della dispersione, ecc.
Durante le prime fasi di sviluppo del programma si sono effettuati alcuni
tentativi indirizzati ad ottenere un maggior realismo della rappresentazione,
individuando diversi riferimenti utilizzabili in tal senso [Stam97, Stam93,
www00, www01, www02].
Si è però constatato che gli autori che hanno sviluppato questi progetti si sono
invariabilmente basati su sistemi di particelle, in cui si utilizza un elevato
numero di particelle elementari (generalmente sfere), ognuna dotata di
caratteristiche proprie (velocità, accelerazione, massa, colore, tempo di
decadimento, ecc.), che seguono determinate leggi fisiche.
In tutti i casi, inoltre, il rendering veniva effettuato con una tecnica di ray88
Capitolo IV
Conclusioni
tracing, utilizzando prodotti commerciali oppure sviluppati all'uopo.
Tutto ciò è risultato di difficile integrazione, nel progetto in fase di sviluppo,
alla luce delle due seguenti considerazioni:
• la qualità di visualizzazione ottenibile con un browser vrml è notevolmente
inferiore a quella ottenibile con un ray-tracer. Sono stati effettuati dei
tentativi, generando alcune sfere semitrasparenti parzialmente sovrapposte
(in modo simile a quanto suggerito nei riferimenti citati), e si é notato che i
contorni troppo netti e uniformi producevano risultati con realismo ben
inferiore a quello desiderato, comunque tali da non risultare preferibili alla
soluzione di partenza
• tutte le soluzioni esaminate sono indirizzate ad ottenere una
visualizzazione fotorealistica del fumo (o di fenomeni naturali ad esso
assimilabili), limitandosi però alla piccola scala. Sarebbe quindi risultata
difficile l'integrazione con il modello gaussiano utilizzato nel progetto, e si
sarebbe corso il rischio di ottenere immagini realistiche nell’aspetto, ma
con valori di concentrazione non corretti, e comunque non corrispondenti
a quelli rappresentati nelle immagini bidimensionali.
Si è quindi deciso di rinunciare all’utilizzazione di tecniche di questo tipo,
limitandosi all'implementazione del modello gaussiano anche per quanto
riguarda la vista tridimensionale.
Il programma sviluppato, in conclusione, si presta bene ad un uso didattico,
consentendo di valutare in modo immediato l’influenza che i vari parametri
hanno sulla conformazione del pennacchio di fumo.
La configurazione client/server, inoltre, consente di rendere disponibili
all’utente, in modo automatico, eventuali aggiornamenti.
89
Appendice A
Il linguaggio Vrml
Introduzione al linguaggio
Il linguaggio VRML (Virtual Reality Modeling Language) è nato con lo scopo
di definire uno standard per la rappresentazione di scene tridimensionali su
Internet.
Le sue origini si possono ricondurre al 1994.
Nel maggio 1995 è stata rilasciata la versione 1.0, che non prevedeva tuttavia
la possibilità di effettuare animazioni o di interagire con l’utente.
Nell’agosto 1996, infine, è stata presentata la versione 2.0, utilizzata nel
presente progetto, che ha posto fine a tali limitazioni.
Una scena Vrml è descritta da un semplice file Ascii, con estensione “.wrl”,
contenente le definizioni statiche degli elementi presenti, nonché le specifiche
del loro comportamento dinamico e delle possibili interazioni con l’utente.
È possibile ottenerne la visualizzazione per mezzo di appositi browsers Vrml,
disponibili per varie piattaforme.
Il sistema di coordinate in Vrml
In Vrml, facendo riferimento al punto di vista standard, si ha la seguente
disposizione degli assi coordinati:
- asse x orizzontale, orientato verso la destra dello schermo
- asse y verticale, orientato verso l’alto
- asse z orizzontale, uscente dallo schermo
90
Appendice A
Il linguaggio Vrml
L’unità di misura utilizzata è il metro.
Struttura di un file Vrml
Un file Vrml deve iniziare con la seguente linea:
#VRML V2.0 utf8
Ogni altra riga che presenti il carattere “#” verrà considerata un commento, e
quindi ignorata.
Segue un elenco di “nodi” (corrispondenti ad ognuna delle entità presenti
nella scena), che sono riconoscibili nei listati per la presenza dalla prima lettera
maiuscola (il linguaggio è case-sensitive).
Ogni nodo può contenere un numero variabile di “campi”, che ne specificano
in dettaglio particolari caratteristiche.
I nodi disponibili sono i seguenti:
• Anchor
• Appearance
• AudioClip
• Background
• Billboard
• Box
• Collision
• Color
• ColorInterpolator
• Cone
• Coordinate
91
Appendice A
Il linguaggio Vrml
• CoordinateInterpolator
• Cylinder
• CylinderSensor
• DirectionalLight
• ElevationGrid
• Extrusion
• Fog
• FontStyle
• Group
• ImageTexture
• IndexedFaceSet
• IndexedLineSet
• Inline
• LOD
• Material
• MovieTexture
• NavigationInfo
• Normal
• NormalInterpolator
• OrientationInterpolator
• PixelTexture
• PlaneSensor
• PointLight
• PointSet
• PositionInterpolator
• ProximitySensor
• ScalarInterpolator
• Script
92
Appendice A
Il linguaggio Vrml
• Shape
• Sound
• Sphere
• SphereSensor
• SpotLight
• Switch
• Text
• TextureCoordinate
• TextureTransform
• TimeSensor
• TouchSensor
• Transform
• Viewpoint
• VisibilitySensor
• WorldInfo
Alcuni di questi nodi possono contenerne quindi altri a loro volta, e sono detti
“grouping nodes”:
• Anchor
• Billboard
• Collision
• Group
• LOD
• Switch
• Transform
Quelli che consentono di definire caratteristiche globali per l’ambiente sono:
• Background
93
Appendice A
Il linguaggio Vrml
• Fog
• NavigationInfo
• Viewpoint
Nodi utilizzati nel progetto
Si fornisce in questa sezione una breve descrizione dei nodi utilizzati nel
progetto. Si tratta di un insieme abbastanza ristretto, poiché non si sono
sfruttate molte delle caratteristiche avanzate del linguaggio, come ad esempio
le animazioni, il rilevamento delle collisioni, gli effetti sonori, ecc.
Transform
Questo nodo permette di traslare, ruotare e scalare il sistema di riferimento.
La sintassi, limitandosi ai campi utilizzati nel presente progetto, è la seguente:
Transform {
rotation
translation
scale
children
...
]
}
asse_x asse_y asse_z angolo
asse_x asse_y asse_z
asse_x asse_y asse_z
[
Le trasformazioni definite vengono applicate a tutti i nodi che verranno poi
definiti nel campo “children”.
Per la rotazione i primi tre parametri specificano l’asse a cui fa riferimento, il
quarto l’angolo di rotazione, in radianti.
Per la scalatura e la traslazione si specificano i corrispondenti valori per i tre
assi.
94
Appendice A
Il linguaggio Vrml
Shape
Questo nodo è utilizzato per definire una forma geometrica.
Prevede due soli campi, “appearance” e “geometry”; “appearance” contiene a
sua volta un nodo, “Apperance”, in cui viene definito l’aspetto della superficie
ed
eventuali
tessiture
ad
essa
applicate
(campi
“texture”
e
“textureTransform”), mentre “geometry” contiene la definizione della forma
dell’oggetto.
Le forme predefinite sono “Box” (utilizzata nel progetto per la generazione
della fabbrica, delle case e del piano corrispondente alla sezione
bidimensionale), “Cylinder” (utilizzata per la ciminiera), “Cone”, “Sphere”,
“Text” e “TextStyle”.
È inoltre possibile l’utilizzo dei nodi “IndexedFaceSet” (superficie del
pennacchio, tetti della case, freccia indicante la direzione del vento) e
“IndexedLineSet” per ottenere superfici o linee spezzate a partire da un
insieme di punti predefiniti.
Un semplice esempio, che definisce una sfera di raggio unitario e di colore
rosso, è il seguente:
Shape {
appearance Appearance {
material Material {
emissiveColor 1 0 0
}
geometry Sphere {
radius 1
}
}
Il campo “creaseAngle” è utilizzato nella definizione della superficie del
pennacchio di fumo, e permette di ammorbidire le giunzioni tra le superfici
adiacenti, rendendo meno evidenti le singole facce.
95
Appendice A
Il linguaggio Vrml
Billboard
È un semplice “grouping node” (può quindi contenere diversi oggetti),
utilizzato nel progetto per la rappresentazione degli alberi.
La caratteristica principale di questo nodo è che può variare il suo sistema di
riferimento in funzione della posizione dell’utente; in questo modo,
ipotizzando di utilizzare un’immagine bitmap, si può fare in modo che essa sia
sempre rivolta verso l’osservatore, dando l’impressione di trovarsi in presenza
di un oggetto tridimensionale.
Il campo “axisOfRotation” serve per definire, appunto, quale debba essere
l’asse di rotazione; nel campo “children” si definisce poi l’oggetto da
visualizzare.
A titolo di esempio, gli alberi sono stati definiti nel modo seguente:
Transform {
translation 0 0 0
children [
Billboard {
axisOfRotation 0 1 0
children [
Shape {
appearance Appearance {
material Material { diffuseColor 0 1 0 }
texture ImageTexture { url "albero.gif" }
}
geometry IndexedFaceSet {
coord Coordinate {
point [ -3 0 0, 3 0 0, 3 15 0, -3 15 0 ]
}
coordIndex [0,1,2,3,-1]
texCoord TextureCoordinate {
point [ 0 0, 1 0, 1 1, 0 1 ]
}
texCoordIndex [0,1,2,3,-1]
}
}
]
}
]
}
96
Appendice A
Il linguaggio Vrml
Background
È il nodo utilizzato per specificare l’aspetto dello sfondo nella scena Vrml.
Si possono definire la posizione ed i colori del cielo e del terreno, fornendo gli
estremi degli angoli ed i corrispondenti colori; il browser effettua poi una
transizione lineare tra i colori.
Nel progetto, si è utilizzata la seguente impostazione:
Background {
skyAngle [1
skyColor [0
groundAngle
groundColor
}
1.57 3.14]
0 1, 0 0 1, .6 .6 1, 0 0 1]
[1 1.57]
[0 .8 0, 0 .8 0, 0 .6 0]
Sono disponibili anche i campi “backUrl”, “bottomUrl”, “frontUrl”, “leftUrl”,
“rightUrl”, e “topUrl”, che permettono di specificare mappature con
immagini bitmap sulle facce dell’ipotetico cubo che racchiude la scena.
DirectionalLight
Il nodo “DirectionalLight” definisce una sorgente luminosa che emette raggi
paralleli, pur non prevedendo la generazione di ombre.
È stato utilizzato con i seguenti parametri:
DirectionalLight {
ambientIntensity 0.2
direction 0.5 -.5 -1
intensity 1
on TRUE
}
Il campo “ ambientIntensity” definisce l’intensità di una luce diffusa presente
in tutto l’ambiente, senza alcuna direzione di provenienza.
I campi “direction” e “intensity” fanno invece riferimento alla sorgente
direzionale.
97
Appendice A
Il linguaggio Vrml
NavigationInfo
Questo nodo serve per specificare alcune caratteristiche del visitatore nel
mondo Vrml.
I campi di maggior interesse sono “avatarSize” (altezza del visitatore),
“headlight” (specifica se attivare una sorgente luminosa solidale con il punto
di vista dell’osservatore) e “speed” (velocità di spostamento, in m/s).
Nel progetto è stato utilizzato con i seguenti parametri:
NavigationInfo {
headlight FALSE
speed 5.0
}
Viewpoint
È utilizzato per definire dei punti di vista predefiniti.
I
campi
principali
sono
“position”
(coordinate
dell’osservatore),
“orientation” (orientamento) e “description” (nome del punto di vista).
Un esempio di utilizzo è il seguente:
Viewpoint {
position 0 60 180
orientation 0 1 0 0
description "Laterale"
}
Il comando “PROTO”
Con questo comando, è possibile implementare nuovi nodi, con la possibilità
di definire anche parametri specificabili dall’utente ad ogni utilizzo.
È stato sfruttato nel progetto per la definizione degli alberi e delle case; nel
98
Appendice A
Il linguaggio Vrml
primo caso non si è utilizzato nessun parametro, nel secondo sono stati resi
accessibili il colore delle pareti e quello del tetto.
La definizione di un nodo che faccia uso di questo comando può essere la
seguente:
PROTO House [
exposedField SFColor colore_casa
exposedField SFColor colore_tetto
] {
...
definizione nodo
...
diffuseColor IS colore_casa
...
}
Un esempio di utilizzo è:
Transform {
translation 300 0 -30
scale 3 1.5 2
children [
House {
colore_casa
1 1 1
colore_tetto .4 0 0
}
]
}
99
1 1 1
1 0 0
Appendice A
Il linguaggio Vrml
L’interfaccia EAI (External Authoring Interface)
Sono due le possibilità per quanto riguarda il controllo di una scena Vrml con
il linguaggio Java:
• tramite nodo “Script”
• tramite EAI
Si è scelto, nel progetto, di sfruttare quest’ultima, in virtù della sua flessibilità e
potenza.
Per poter utilizzare l’EAI, è necessario includere nel programma i relativi
packages, forniti con il browser Vrml. Le classi necessarie sono specificate dal
codice seguente:
import
import
import
import
vrml.external.Browser;
vrml.external.Node;
vrml.external.field.*;
vrml.external.exception.*;
Il primo passo da compiere consiste nell’acquisizione di un riferimento al
browser Vrml:
Browser browser = Browser.getBrowser(this);
Una volta ottenuto ciò, si procede all’acquisizione dei successivi riferimenti ai
vari nodi e campi a cui si è interessati.
Per poter identificare univocamente gli elementi con cui si desidera interagire
è necessario che ognuno di essi sia preceduto, nel file Vrml, dal comando
“DEF”, nel modo seguente:
DEF nome_assegnato_al_nodo ... definizione nodo ...
100
Appendice A
Il linguaggio Vrml
Ad esempio, nel file “world.wrl” è presente la seguente dichiarazione, con cui
si specifica solamente il nome da assegnare al nodo (tutte le altre
caratteristiche verranno assegnate da programma):
DEF Ciminiera Transform{
}
Il riferimento si acquisisce con la seguente istruzione:
Node nodo_ciminiera = browser.getNode("Ciminiera");
A questo punto, la procedura per definire il nuovo oggetto è abbastanza
lineare:
[definizione degli eventi]
EventInMFNode addChildren_ciminiera =
(EventInMFNode) ciminiera.getEventIn("addChildren");
EventInSFVec3f trasla =
(EventInSFVec3f) ciminiera.getEventIn("set_translation");
[definizione della traslazione del nodo]
float traslazione[] = new float[3];
traslazione[0] = 0; traslazione[1] = (float)altezza_ciminiera/2;
traslazione[2] = 0;
trasla.setValue(traslazione);
[definizione della stringa per la generazione del nodo]
stringa
stringa
stringa
=
+=
+=
"Shape { ";
"... definizione nodo ... ";
"}";
[creazione del nodo a partire dalla stringa]
Node newNode_ciminiera[];
newNode_ciminiera = browser.createVrmlFromString(stringa);
101
Appendice A
Il linguaggio Vrml
addChildren_ciminiera.setValue(newNode_ciminiera);
Per la cancellazione dell’oggetto, effettuata prima di ogni nuova generazione, il
codice è il seguente:
EventInMFNode removeChildren_ciminiera =
(EventInMFNode)
nodo_ciminiera.getEventIn("removeChildren");
removeChildren_ciminiera.setValue(newNode_ciminiera);
102
Appendice B
Configurazione del computer per
l’esecuzione del programma
Il programma è stato sviluppato e verificato su piattaforma Windows NT 4.0.
Si è utilizzato il browser Vrml “CosmoPlayer”, versione 2.1, congiuntamente a
“Netscape Communicator”, versione 4.7, e “Microsoft Internet Explorer”,
versione 5.0.
Con quest’ultimo si sono verificati errori occasionali durante la generazione
della vista tridimensionale, problema non riscontrato con Netscape
Communicator, di cui si consiglia quindi l’utilizzo.
Non è richiesto altro software.
Durante l’installazione, CosmoPlayer rileva la presenza del browser Html
presente, ed effettua automaticamente le modifiche necessarie alla
configurazione.
Nel caso si dovessero effettuare manualmente, le operazioni da compiere sono
le seguenti:
• per Netscape: nella directory “\Netscape\Communicator\Program\PlugIns”
devono essere presenti i files “npcosmpop21.dll” e “npcosmop21.jar”
• per
Explorer:
nel
SOFTWARE\Microsoft\Java
registry,
alla
VM\classpath”
voce
deve
“HKEY_LOCAL_MACHINE\
essere
presente
un
riferimento al file “npcosmop21.zip“, ad esempio “C:\Programmi\
CosmoSoftware\CosmoPlayer\npcosmop21.zip;.”
103
Appendice B
Configurazione del computer
Non sono richieste particolari risorse hardware (si raccomanda solamente una
risoluzione video di almeno 800x600 pixels per ottenere una buona
rappresentazione grafica).
104
Bibliografia
[Finz91]
G. Finzi, G. Brusasca, “La qualità dell’aria”, Masson, 1991
[Ster76]
A.C. Stern, “Air pollution”, vol. I, Academic Press, 1976
[Guar97]
G. Guariso, G. Calori, G. De Leo, L. Del Furia, “100 Programmi
per l’ambiente”, CittàStudiEdizioni, 1997
[Stam97]
J. Stam, "A General Animation Framework for Gaseous
Phenomena" , ERCIM Research Report R047, 1997
[Stam93]
J. Stam, E. Fiume, “Turbulent Wind Fields for Gaseous
Phenomena”, Computer Graphics Proceedings (SIGGRAPH
’93), Annual Conference Series, 1993, pp. 369-376
[Hors99]
Cay S. Horstmann, G. Cornell, “Java 2 – I Fondamenti”,
McGraw-Hill, 1999
[Dev98]
AA.VV., “Corso di Java”, riviste DEV 48 e seguenti, Gruppo
Editoriale Infomedia, 1998
[Ecke98]
B. Eckel, “Thinking in Java”, Prentice Hall, 1998
[GHJV95]
E. Gamma, R. Helm, R. Johnson, J. Vlissides, “Design Patterns”,
Addison Wesley, 1995
[Larm98]
C. Larman, “Applying Uml and Patterns”, Prentice Hall, 1998
[www00]
http://www.dgp.utoronto.ca/people/stam/slides.html
105
Bibliografia
[www01]
http://freespace.virgin.net/hugo.elias/models/m_main.htm
[www02]
http://reality.sgi.com/tkluyskens_aw/txt/queen.html
[www03]
“Tutorial Vrml” a cura di Ignazio Locatelli
(http://www.lucia.it/vrml)
[www04]
“Corso EAI” a cura di Ignazio Locatelli
(http://www.lucia.it/vrml)
[www05]
“Floppy’s VRML 97 Tutorial”
(http://www.vapourtech.com/vrmlguide)
[www06]
“VRML 2.0 EAI FAQ”
(http://www.tomco.net/~raf/faqs/eaifaq.html)
[www07]
“A beginner’s guide to Vrml” (http://www.netscape.com)
[www08]
http://www.vrml.org/VRML2.0/FINAL/Overview.html
[www09]
http://www.vrml.org/VRML2.0/FINAL/Concepts.html
[www10]
http://www.vrml.org/VRML2.0/FINAL/spec/part1/
nodesRef.html
[www11]
http://www.cis.ufl.edu/~fishwick/vrml/vrml.htm
[news00]
Newsgroup “it.comp.lang.vrml”
[news01]
Newsgroup “comp.lang.vrml”
106