TESI DI LAUREA (.pdf ~ 7MB)
TESI DI LAUREA (.pdf ~ 7MB)
TESI DI LAUREA (.pdf ~ 7MB)
Trasformi i suoi PDF in rivista online e aumenti il suo fatturato!
Ottimizzi le sue riviste online per SEO, utilizza backlink potenti e contenuti multimediali per aumentare la sua visibilità e il suo fatturato.
Università degli Studi di Torino<br />
Facoltà di Scienze M.F.N.<br />
Corso di Laurea in Matematica<br />
<strong>TESI</strong> <strong>DI</strong> <strong>LAUREA</strong><br />
Matematica creativa in<br />
“Rich Internet Applications” (RIA)<br />
Relatore:<br />
Prof.ssa Catterina Dagnino<br />
ANNO ACCADEMICO 2007-2008<br />
Candidato:<br />
Walter Bugliarelli
Indice<br />
Introduzione v<br />
1 Applicazioni Internet e Web 1<br />
1.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.2 Applicazioni Internet . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.3 Il modello client-server . . . . . . . . . . . . . . . . . . . . . . 2<br />
1.4 Problemi di installazione . . . . . . . . . . . . . . . . . . . . . 3<br />
1.5 Applicazioni Web . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
1.6 Le principali tecnologie utilizzate . . . . . . . . . . . . . . . . 5<br />
1.7 Le Rich Internet Application . . . . . . . . . . . . . . . . . . 7<br />
2 Lo stato dell’arte delle RIA e Adobe Flex 3 11<br />
2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
2.2 Sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
2.3 Aspetti economici . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.4 Tipi di RIA e confronti . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.5 Adobe Flex 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
3 Testo 3D 20<br />
3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3.2 Modello matematico . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3.3 Applicazioni possibili . . . . . . . . . . . . . . . . . . . . . . . 27<br />
3.4 Analisi del codice . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
4 Simulatore 3D di urti elastici 36<br />
4.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
ii
IN<strong>DI</strong>CE iii<br />
4.2 Modello matematico . . . . . . . . . . . . . . . . . . . . . . . 37<br />
4.3 Interfaccia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
4.4 Applicazioni possibili . . . . . . . . . . . . . . . . . . . . . . . 45<br />
4.5 Il modello di gestione degli eventi . . . . . . . . . . . . . . . . 46<br />
4.6 Analisi del codice . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
5 Disegno di curve 55<br />
5.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
5.2 Funzionamento . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
5.3 Modello matematico . . . . . . . . . . . . . . . . . . . . . . . 59<br />
5.4 Applicazioni possibili . . . . . . . . . . . . . . . . . . . . . . . 63<br />
5.5 Struttura del codice . . . . . . . . . . . . . . . . . . . . . . . 64<br />
5.5.1 Classi astratte e polimorfismo . . . . . . . . . . . . . . 64<br />
5.5.2 Classe DrawingTarget . . . . . . . . . . . . . . . . . . 67<br />
5.5.3 Classe DrawingObject . . . . . . . . . . . . . . . . . . 68<br />
5.5.4 Le classi Line e Polygon . . . . . . . . . . . . . . . . . 69<br />
5.5.5 La classe BSpline . . . . . . . . . . . . . . . . . . . . . 70<br />
5.6 La gestione degli eventi del mouse all’interno dell’applicazione 75<br />
6 La distribuzione sul Web: confronto tra Flex e Matlab 79<br />
6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />
6.2 Distribuire un’applicazione MATLAB in formato eseguibile<br />
attraverso il web . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
6.3 Il MATLAB Component Runtime . . . . . . . . . . . . . . . . 82<br />
6.4 Matlab e Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 82<br />
6.5 Costruzione di un’applicazione Java . . . . . . . . . . . . . . . 83<br />
6.5.1 MATLAB e le servlet Java . . . . . . . . . . . . . . . . 85<br />
6.6 Confronto tra i due pacchetti . . . . . . . . . . . . . . . . . . 88<br />
6.7 Considerazioni . . . . . . . . . . . . . . . . . . . . . . . . . . 90<br />
Appendice 92<br />
A Flex ed alcune caratteristiche della programmazione orien-<br />
tata agli oggetti 92
IN<strong>DI</strong>CE iv<br />
Glossario 96<br />
Bibliografia e sitografia 100
Introduzione<br />
Questa tesi è iniziata presso la EBIT Projects di Torino, azienda in cui<br />
ho svolto uno stage sotto la guida dell’Ing. Franco Chiesa, che è stato il mio<br />
referente, e che desidero ringraziare per la disponibilità e competenza.<br />
Durante lo stage sono entrato in contatto con le “Rich Internet Applica-<br />
tion”, o più semplicemente RIA. Le RIA sono particolari ed innovative ap-<br />
plicazioni Web che portano numerosi vantaggi rispetto a quelle tradizionali,<br />
tra cui una maggior interattività, un “Look & Feel” più intuitivo e appetibile<br />
e, infine, un notevole aumento in termini di reattività del software.<br />
L’azienda si avvantaggia delle potenzialità di questa nuova tecnologia per<br />
creare moduli software altamente interattivi, atti a fornire nuove funzionalità<br />
ai siti Web delle aziende clienti. Durante lo stage ho avuto la possibilità di<br />
entrare nel ciclo produttivo di una di queste applicazioni, cosa che mi ha<br />
permesso di padroneggiare l’uso di “Adobe Flex 3”, il pacchetto di riferimento<br />
usato in Azienda per la progettazione ed implementazione di RIA.<br />
Flex 3 è un software molto versatile che permette di creare applicazioni<br />
non solamente di tipo aziendale, ma anche rivolte alla creatività, alla pub-<br />
blicità e alla didattica. Sempre sotto la guida dell’Ing. Chiesa, ho pertanto<br />
sviluppato tre applicazioni di esempio che mostrano sia la versatilità di Flex<br />
3 sia le potenzialità delle RIA nel portare sul Web contenuti innovativi.<br />
La parte iniziale del lavoro spiega che cosa è un’applicazione Web classica<br />
e perché le RIA ne rappresentino l’evoluzione.<br />
Viene successivamente presentato l’attuale stato dell’arte di queste nuova<br />
tipologia di software e si focalizza l’attenzione su alcuni aspetti economici<br />
riguardanti sia gli sviluppatori sia gli utenti delle RIA, su alcuni aspetti a<br />
proposito dei parametri di sicurezza che le tecnologie per la costruzione di<br />
RIA devono rispettare e su alcune limitazioni di cui soffre questo tipo di<br />
applicazioni. Si considerano, infine, alcune tecnologie preposte allo sviluppo<br />
di RIA, in particolare Flex.<br />
Nelle sezioni successive si descrivono tre applicazioni, che sono state svi-<br />
luppate in Flex, che ne dimostrano le potenzialità. In esse la matematica ha<br />
un ruolo creativo.<br />
La prima visualizza un campo di testo che fluttua nello spazio in ba-
INTRODUZIONE vi<br />
se a formule parametriche, ed è interessante perché presenta un ambiente<br />
tridimensionale nonostante Flex non disponga di librerie per il disegno 3D.<br />
La seconda mostra un cubo con delle sferette che si scontrano l’un l’al-<br />
tra in un un susseguirsi di urti totalmente elastici, l’interfaccia permette di<br />
ruotare il cubo a piacere e di cambiare i parametri di massa e dimensione di<br />
ogni singola pallina per vederne il comportamento.<br />
La terza presenta un piccolo programma di grafica vettoriale nel quale si<br />
possono disegnare alcune forme con un approccio diverso da quello di altri<br />
pacchetti di disegno. Il codice di ognuna di queste applicazioni, inoltre, è<br />
basato su concetti matematici e fisici appresi nel corso di Laurea in Mate-<br />
matica. Questo aspetto mostra la fattibilità, dal punto di vista didattico,<br />
di illustrare nozioni, anche complesse, sul Web, con applicazioni altamente<br />
interattive.<br />
L’ultimo capitolo riguarda le possibilità fornite dal pacchetto “Matlab”<br />
per portare le applicazioni scritte nel proprio linguaggio sul Web oltre a<br />
presentare alcuni confronti tra Matlab stesso e Flex.<br />
In appendice vengono richiamati i fondamenti della programmazione ad<br />
oggetti.
Capitolo 1<br />
Applicazioni Internet e Web<br />
1.1 Introduzione<br />
1 In questo capitolo si vuole ripercorrere sommariamente l’evoluzione<br />
delle applicazioni informatiche accessibili da remoto. Pertanto, viene dap-<br />
prima introdotto il modello client-server, dominatore incontrastato dell’era<br />
pre-Internet, successivamente vengono illustrate le principali tecnologie uti-<br />
lizzate nella costruzione di applicazioni Web fino all’ultima frontiera di que-<br />
st’ultime: le “Rich Internet Application” (RIA). Per ogni passaggio evolutivo,<br />
vengono spiegate le limitazioni delle tecnologie utilizzate precedentemente ed<br />
i vantaggi delle successive.<br />
1.2 Applicazioni Internet<br />
Le applicazioni Internet sono software più o meno interattivi fra due o più<br />
computer che utilizzano Internet come network di comunicazione. Pertanto<br />
sono, in realtà, costituite da due parti differenti: la prima è quella delegata a<br />
permettere all’utente di controllare l’applicazione stessa e che ne rappresenta<br />
l’interfaccia, la seconda è il cuore vero e proprio del software ed è installata<br />
e funzionante su una macchina remota (server).<br />
Un esempio di applicazione Internet è la posta elettronica: l’interfaccia<br />
al servizio è rappresentata da uno dei tanti software di posta elettronica (Mi-<br />
1 Nota al testo: I termini seguiti da (*), e.g. “Intranet*”, sono definiti nel Glossario.<br />
1
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 2<br />
crosoft Outlook, Mozilla Thunderbird etc.) che, opportunamente installato e<br />
configurato con i parametri dell’account*, ci permette di connetterci al server<br />
di posta del “provider*”, accedere alla nostra casella e “scaricare*” sul nostro<br />
computer le e-mail che verranno poi archiviate, organizzate e conservate dal<br />
programma di posta stesso.<br />
1.3 Il modello client-server<br />
Molto prima dell’avvento di Internet e del relativo concetto di rete delle<br />
reti e di rete globale, l’idea di applicazioni accessibili tramite una rete di col-<br />
legamento tra computer, si concretizzava mediante il modello “client-server”.<br />
Con il termine client si intende il programma che gira sulla macchina<br />
locale utilizzando, per la propria elaborazione, delle risorse che risiedono<br />
sul server. Il server è un computer o un sistema di computer interallacciati<br />
(cluster), che, in partizione di tempo (time-sharing) o in parallelo, forniscono<br />
“servizi” ai client che li richiedono. I servizi partizionati possono essere:<br />
basi di dati, potenza di calcolo, connettività etc che i diversi client possono<br />
utilizzare come se fossero propri. Per molti anni questa fu l’architettura<br />
predominante e anche oggigiorno è ampiamente utilizzata. Il successo è<br />
stato decretato dal fatto che il terminale (o client), la macchina su cui gira il<br />
software client, può essere limitata nella prestazioni e quindi economica, fatto<br />
questo determinante nei primi anni dell’era informatica. La poca potenza<br />
richiesta dai terminali era dovuta al fatto che il software lato-server risiedeva<br />
su un mainframe* ed era progettato per soddisfare contemporaneamente le<br />
richieste di più terminali.<br />
Il maggior problema di questa soluzione è che una qualsiasi miglioria<br />
apportata all’applicazione sul server richiede generalmente di installare su<br />
ogni client una nuova versione del software lato-client con un conseguente<br />
aumento dei costi di manutenzione e rallentamento di produttività.<br />
Non bisogna pensare che questo modello sia in disuso. Un esempio ce-<br />
lebre di architettura client-server è l’“X Window System”. Originariamente<br />
sviluppato al MIT nel 1984, l’X Window System è una tecnologia che per-<br />
mette a dei cosiddetti “X terminal”, computer economici ma comunque con<br />
delle capacità grafiche, di visualizzare ed utilizzare una GUI* demandando
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 3<br />
il lavoro di calcolo dovuto al disegno e al movimento delle finestre e alla ge-<br />
stione del mouse e della tastiera ad un server (“X Server”) che è in grado di<br />
fornire questo servizio a più terminali contemporaneamente. Questo modello<br />
è implementato su tutti i sistemi UNIX* e UNIX-like (Linux, Solaris etc.)<br />
ancora oggi, anche se ormai il software lato server è anch’esso installato sulla<br />
macchina locale in quanto i moderni computer non hanno più difficoltà a<br />
gestire GUI complete da soli.[1]<br />
1.4 Problemi di installazione<br />
Le difficoltà di aggiornamento suddette e relative alla configurazione dei<br />
client non rappresentano un problema quando l’area di utilizzo dell’applica-<br />
zione è quello di una azienda, anche grossa, o di un’università: generalmente,<br />
infatti, in questi ambiti è previsto personale adibito alla manutenzione dei<br />
terminali e ad istruire il personale o gli studenti alle nuove funzionalità. Con<br />
l’avvento di Internet e del World Wide Web 2 si è creata la possibilità di<br />
sviluppare ed utilizzare software che comunicassero con server, o semplice-<br />
mente con altri PC come nel caso delle applicazioni “peer to peer*”, locati<br />
in qualsiasi parte del globo. Oggi utilizziamo applicazioni che si avvalgono<br />
di un collegamento ad Internet in continuazione: forum, webmail, blog, aste<br />
on-line etc. Si può facilmente capire i problemi di dover installare sulla pro-<br />
pria macchina programmi client che permettano di interfacciare tutti questi<br />
servizi.<br />
Elenchiamone i principali. Prima di tutto il produttore del software do-<br />
vrebbe rilasciare una versione del client compatibile con il maggior numero di<br />
sistemi operativi possibile, l’utente, di conseguenza, dovrebbe essere in gra-<br />
do di “scaricare”, dal sito web di supporto, la versione giusta per il proprio<br />
PC e saperla installare; operazioni queste non sempre banali soprattutto su<br />
sistemi UNIX-like, in particolare Linux. Inoltre, mentre risulta accettabile<br />
2 Non bisogna confondere Internet con il Web: con il primo termine si intende una rete<br />
telematica mondiale costituita da diverse sotto-reti locali non compatibili l’una con l’altra<br />
ma che comunicano mediante una serie di protocolli comuni, con il secondo si intende una<br />
rete libera di documenti multimediali collegati l’un l’altro da collegamenti ipertestuali<br />
incorporati nei documenti stessi e basata su Internet
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 4<br />
installare software lato-client per i principali strumenti di lavoro di una po-<br />
stazione, non è immaginabile pensare di dover preoccuparsi di configurare il<br />
computer per tutte quelle applicazioni che necessitano di accedere ad Inter-<br />
net sia perché sono moltissimi i servizi basati sulla Rete sia perché molti di<br />
questi vengono usati saltuariamente e non giustificano quindi il tempo perso<br />
per l’eventuale manutenzione dei client. Questi problemi vengono in larga<br />
parte risolti dalle “applicazioni Web”<br />
1.5 Applicazioni Web<br />
Le applicazioni Web sono particolari applicazioni Internet. L’interfaccia<br />
non è più demandata ad un software installato sul client ma viene fornita<br />
dal server stesso che la invia all’utente non appena questo la richieda recan-<br />
dosi mediante un qualunque browser* alla pagina web preposta al controllo<br />
dell’applicazione stessa.<br />
Un esempio in tal senso è la “webmail”. L’utente non deve più procurarsi,<br />
installare ed aggiornare un software client di posta elettronica ma si reca alla<br />
pagina web preposta e il browser visualizzerà un’interfaccia, generalmente<br />
intuitiva, comprendente tutte le funzionalità necessarie alla gestione della<br />
casella.<br />
I vantaggi di questa soluzione, oltre alla comodità del fruitore del ser-<br />
vizio di non dover installare l’applicativo client, sono parecchi. Prima di<br />
tutto la casella di posta sarà facilmente raggiungibile da qualsiasi PC con<br />
una connessione Internet, ad esempio da un “Internet-Point* ”, posto dove<br />
non è proponibile l’idea di installare e configurare programmi per le esigenze<br />
del singolo individuo per ovvi motivi. In secondo luogo il produttore dei pro-<br />
grammi necessari non dovrà più scrivere versioni specializzate dei client per<br />
ogni sistema operativo perché, come vedremo, utilizzerà tecnologie standar-<br />
dizzate che, salvo relativamente piccoli problemi di incompatibilità dovute<br />
alle varie versioni dei browser, forniscono all’utente la garanzia di ritrovarsi<br />
la medesima interfaccia su ogni tipo di macchina e ai programmatori di scri-<br />
vere una sola versione della medesima. Un terzo motivo, non trascurabile,è<br />
dovuto al fatto che queste interfacce visualizzate nei browser sono general-<br />
mente progettate ed implementate per integrarsi al meglio con i comandi
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 5<br />
tipici dei browser; l’utente troverà quindi un ambiente subito famigliare con<br />
pulsanti per sfogliare le varie pagine, con comandi per ingrandire il testo, per<br />
visualizzare il programma a “tutto schermo” etc.. Il più delle volte, quindi,<br />
le funzionalità classiche fornite dai browser forniscono ai produttori dei soft-<br />
ware la possibilità di risparmiare ore e ore di lavoro che sarebbero necessarie<br />
per costruire un’applicazione standard con una ovvia riduzione dei costi.<br />
1.6 Le principali tecnologie utilizzate<br />
Quando scriviamo un indirizzo web nella apposita barra 3 di un browser<br />
questo invia una richiesta ad un server web per ottenere, come risposta da<br />
questo, la pagina da visualizzare. La risposta inviata dal server al browser è<br />
costituita da un testo semplice codificato secondo le specifiche del linguaggio<br />
di “mark-up” 4 HTML/XHML 5 che descrive il contenuto logico e lo stile 6<br />
per la formattazione della pagina. Ora la pagina HTML visualizzata nel<br />
browser è “statica” cioè non fornisce una interattività in tempo reale né a<br />
livello dell’interfaccia né al livello di comunicazione col server. Poter creare<br />
pagine che dialoghino con il web-server è fondamentale per offrire all’utente<br />
la possibilità di avvalersi di applicazioni web.<br />
La prima tecnologia ideata per tale scopo fu la “Common Gateway Inter-<br />
face” (C.G.I.), un protocollo [2] che definisce uno standard di comunicazione<br />
fra il web-server, uno o più programmi installati su questo e il browser. Ap-<br />
prossimativamente il tutto funziona così: l’utente raggiunge, mediante il bro-<br />
wser, un URL* del tipo http://www.example.com/software.cgi, quindi il<br />
web-server attiva il programma corrispondente che provvederà a formattare<br />
una pagina HTML che verrà inviata al browser richiedente come risposta.<br />
Il protocollo CGI definisce anche come il browser possa inviare al server i<br />
3 La barra degli indirizzi è un campo del browser dove si può immettere manualmente<br />
l’indirizzo Internet della pagina desiderata<br />
4 vedere Glossario per la definizione<br />
5 consultare http://www.w3.org/TR/html401/ per ulteriori approfondimenti<br />
6 É prassi consolidata utilizzare i cosiddetti “fogli di stile” per definire l’aspetto delle<br />
pagine lasciando al codice HTML/XHML il compito di definirne la struttura. Vedere<br />
http://www.w3.org/Style/CSS/
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 6<br />
dati dei “form* ” permettendo, di fatto, di ottenere risposte personalizzate<br />
in relazione ai parametri immessi.<br />
Gli applicativi CGI possono essere scritti in qualsiasi linguaggio di pro-<br />
grammazione ma utilizzarne uno “interpretato* ” non è una scelta performan-<br />
te perché il web-server carica in memoria ed inizializza l’interprete del lin-<br />
guaggio ad ogni richiesta dell’applicazione CGI creando un collo di bottiglia<br />
notevole, ovviamente questo inconveniente non si presenta se si utilizzano lin-<br />
guaggi che generano codice direttamente eseguibile come il C/C++ che però<br />
comportano tempi più lunghi in fase di progettazione ed implementazione.<br />
Alcune nuove tecnologie riducono di molto l’inconveniente e permettono<br />
l’utilizzo di linguaggi di “scripting* ”, lato-server, integrati nel codice HTML.<br />
I più celebri sono PHP e ASP 7 .<br />
Ne spieghiamo in breve il funzionamento facendo riferimento a PHP del<br />
tutto analogo al caso ASP.<br />
Le pagine PHP sono delle pagine HTML avente all’interno del codice<br />
PHP che rende la pagina “dinamica”. Una pagina web dinamica è una pa-<br />
gina web il cui contenuto è, in tutto o in parte, generato sul momento dal<br />
server e può essere quindi diversa ogni volta che viene richiamata. Quan-<br />
do il browser richiede una pagina PHP, il web-server la fa interpretare ad<br />
un modulo che rimane sempre caricato in memoria (eliminando il collo di<br />
bottiglia descritto precedentemente): durante questo processo il codice PHP<br />
viene esaminato ed elaborato dal modulo-interprete del server, dopo di che<br />
la pagina viene inviata all’utente. Generalmente il codice PHP “scrive” a sua<br />
volta del codice HTML, che verrà visualizzato dal browser e che rappresenta<br />
il risultato dell’elaborazione del software. In ogni caso il server invierà sola-<br />
mente una pagina HTML senza codice PHP al suo interno e quindi tutto il<br />
processo è nascosto agli occhi dell’utente.<br />
Anche sul versante client si sono sviluppate tecnologie per rendere vive<br />
e dinamiche le pagine web, JavaScript è una delle più celebri. Si tratta di<br />
un linguaggio di scripting integrato nel codice HTML ma che, a differen-<br />
za del PHP, non viene interpretato dal server bensì raggiunge immodificato<br />
il browser dell’utente ed è quest’ultimo a processare ed elaborare il codice.<br />
7 In realtà ASP è il nome di una tecnologia sviluppata da Microsoft, i linguaggi usati<br />
sono JScript e VBScript sempre prodotti da Microsoft
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 7<br />
Il codice JavaScript si interfaccia, attraverso il “DOM*”, agli elementi che<br />
compongono il codice HTML permettendo di creare pagine web interatti-<br />
ve. JavaScript apporta due grossi vantaggi. Il primo consiste nel fatto che,<br />
potendo accedere al codice e quindi agli elementi costituenti di una pagina<br />
web attraverso il DOM, si possono creare interfacce dinamiche che siano coe-<br />
renti con la situazione del momento; sullo schermo appariranno solamente i<br />
bottoni, i campi di testo e l’impaginazione adatta all’operazione che si deve<br />
svolgere creando pagine pulite ed intuitive. Il secondo è che molti compi-<br />
ti spettanti tradizionalmente al server possono essere svolti da JavaScript e<br />
quindi dal browser, garantendo l’immediatezza del risultato.<br />
L’esempio classico è la convalida dei dati immessi dall’utente in un form:<br />
quando si preme sul tipico bottone “Invia!” il codice JavaScript controlla<br />
che i dati immessi siano corretti e ben formattati in modo che il software<br />
lato-server riceva sempre dati coerenti e non debba assumersi l’onere del<br />
controllo. Inoltre, in caso di errore, la segnalazione è immediata e non si ha<br />
l’impegno del processo di comunicazione con il server.<br />
Un altro vantaggio è che il server, al posto di inviare i dati della risposta<br />
formattata staticamente in HTML, può fornirli ad una funzione JavaScript<br />
di impaginazione, e quindi personalizzati dal punto di vista grafico dal codice<br />
lato-client; così facendo il software sul server può essere progettato in modo<br />
più generico e servire le esigenze di diversi siti web.<br />
Recentemente sta facendosi largo una nuova frontiera nel campo delle<br />
applicazioni Web: le “Rich Internet Application” o , brevemente, RIA.<br />
1.7 Le Rich Internet Application<br />
Come abbiamo visto, il codice JavaScript può rendere l’interfaccia più<br />
dinamica, intuitiva ed ordinata ma non risolve il maggior problema delle<br />
applicazioni Web tradizionali, ossia permane il fatto che il browser debba<br />
inviare dati verso il server, aspettare la risposta e caricare la pagina da vi-<br />
sualizzare contenente la risposta. Purtroppo, sebbene le tecnologie illustrate<br />
precedentemente risolvano molti dei problemi dell’architettura client-server<br />
classica, non risolvono tale inconveniente. Questo ciclo non si ripete solo<br />
quando l’utente richiede l’elaborazione di dati notevoli, ad esempio l’inseri-
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 8<br />
mento del proprio nominativo in un database* o la richiesta di visualizzare la<br />
mappa di una zona geografica, ma anche quando chiede di accedere ad una<br />
diversa sezione dell’applicazione. Tutto questo porta ad avere molti tempi<br />
di attesa ed una interfaccia poco reattiva.<br />
Le RIA si avvalgono di uno strato software che viene scaricato dal web pri-<br />
ma dell’inizio dell’applicazione oppure, come il più delle volte accade, scari-<br />
cato ed installato, una sola volta, per essere utilizzato anche successivamente,<br />
generalmente come “plugin” per il proprio tipo di browser.<br />
Due esempi notevoli sono Java e Flash. Java prevede che l’utente esegua<br />
il download 8 del “Java Runtime Environment” un client engine (cioè quello<br />
strato software che funge da supporto per le applicazioni client citato poc’an-<br />
zi) che permette a sua volta di scaricare ed eseguire del software lato-client<br />
sulla macchina dell’utente sia stand-alone*, cioè come se fosse una norma-<br />
le applicazione Desktop, sia nella forma di Applet, software ad interfaccia<br />
grafica contenuto all’interno delle pagine web visualizzate da un browser.<br />
Flash funziona analogamente: il client engine, in questo caso, si chiama<br />
Flash Player ma, a differenza di Java, viene quasi esclusivamente usato per<br />
creare siti dotati di una interfaccia notevolmente migliore rispetto a quella<br />
del Web tradizionale. Adobe ha recentemente sviluppato “AIR” un “Runtime<br />
Environment” studiato appositamente per realizzare applicazioni Desktop<br />
mediante numerose tecnologie tra cui Flash.<br />
Le RIA superano due dei grossi problemi del Web dinamico classico:<br />
lo scarso appeal grafico di un’interfaccia lontana dal look & feel dei soft-<br />
ware Desktop e la mancanza di reattività dell’applicazione per i continui<br />
cicli di ricarica delle pagine. Vediamo perché le RIA superano questi proble-<br />
mi. Abbiamo parlato del client engine, questo è un programma che gira in<br />
background sulla macchina dell’utente e svolge due funzioni. In primo luo-<br />
go fornisce una “API*” standard che, oltre a permettere la compatibilità del<br />
software, da questa derivato, su qualsiasi sistema operativo per cui esista una<br />
versione del client engine, fornisce una famiglia di “widget* ” molto più vasta,<br />
flessibile e graficamente appetibile rispetto a quella del Web tradizionale e<br />
consente una gestione degli eventi e dell’interattività molto più sofisticata e<br />
8 vedi voce “scaricare” nel Glossario
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 9<br />
L‘applicazione comunica<br />
con il server attraverso il<br />
Runtime Environment<br />
Client<br />
Server<br />
Java Class file o<br />
Swf file<br />
JRE o Flash Player<br />
Browser<br />
Internet<br />
Figura 1.1: Schema di funzionamento di una RIA scritta in Java o Flex
CAPITOLO 1. APPLICAZIONI INTERNET E WEB 10<br />
di semplice realizzazione (ad esempio il “drag&drop”, cioè il cliccare su un<br />
oggetto trascinarlo e depositarlo in un’altra posizione, è spesso macchinoso<br />
da implementare e gestire con il solo ausilio di HTML e JavaScript). In<br />
secondo luogo l’applicazione client risiede già totalmente, o quasi, sul client<br />
pertanto l’utente non deve più aspettare l’interazione col server con i suoi<br />
tempi di attesa per l’invio e la ricezione dei dati; l’interfaccia risulta più<br />
reattiva in quanto le sue componenti sono già presenti in locale e non si deve<br />
comunicare al server quale sezione si vuole utilizzare. Inoltre il trasferimento<br />
di dati avverrà solo più per operazioni che, ovviamente, non possono essere<br />
risolte lato-client, ad esempio l’inserimento di informazioni su un database.<br />
Il client-engine, che come abbiamo detto funziona in background durante<br />
l’esecuzione dell’applicazione vera e propria, compie operazioni di “comuni-<br />
cazione asincrona” che permettono al software di scambiare dati col server<br />
mentre il flusso delle elaborazioni o il colloquio del software con l’utente pro-<br />
segue. Più precisamente mentre si sta lavorando con l’applicazione, questa è<br />
in grado di anticipare quali potrebbero essere i prossimi dati di cui potrebbe<br />
aver bisogno da parte del server e scaricarli prima della richiesta effettiva,<br />
velocizzando la risposta del programma. Questo scambio di dati asincrono<br />
permette anche alle RIA di aggiornare dati in tempo reale, cosa che nelle<br />
applicazioni Web tradizionali comporta una noiosa ricarica della pagina da<br />
parte del browser con evidente perdita di tempo. Tutte queste caratteristiche<br />
illustrano il termine “Rich” delle RIA.
Capitolo 2<br />
Lo stato dell’arte delle RIA e<br />
Adobe Flex 3<br />
2.1 Introduzione<br />
In questo capitolo si illustrano tre aspetti delle RIA che, a causa della<br />
diversa tecnologia alla base di queste, presentano delle differenze rispetto alle<br />
applicazioni Web classiche. Verranno analizzati il problema della sicurezza,<br />
alcuni aspetti economici e le limitazioni di questo tipo di applicazioni.<br />
Per finire si darà uno sguardo d’insieme ad Adobe Flex, lo strumento con<br />
cui sono state scritte le applicazioni d’esempio.<br />
2.2 Sicurezza<br />
In una RIA l’utente, raggiungendo via Browser l’url dell’applicazione,<br />
scarica sulla propria macchina un software di cui non conosce nulla se non il<br />
sito di provenienza ed, eventualmente, la reputazione del fornitore dell’appli-<br />
cazione stessa. Pertanto è necessario in primo luogo che l’applicazione non<br />
abbia accesso indiscriminato alle risorse del PC. Inoltre, siccome il software<br />
deve scambiare dati con il server o con altre risorse su Internet deve essere<br />
garantita la sicurezza delle comunicazioni.<br />
Per garantire la sicurezza sulla macchina dell’utente, il client engine prov-<br />
vede a far girare la RIA in una cosiddetta “sandbox”. Una sandbox è un<br />
11
CAPITOLO 2. RIA E ADOBE FLEX 3 12<br />
meccanismo di sicurezza, una sorta di “macchina virtuale” che ospita l’ap-<br />
plicazione fornendole dello spazio temporaneo nella memoria principale e sul<br />
disco rigido.<br />
Generalmente un sistema operativo non si preoccupa della sicurezza del-<br />
l’applicativo, è l’utente che deve fare attenzione ad eseguire sulla macchina<br />
software affidabile ricorrendo, al limite, a tool esterni come un antivirus.<br />
La sandbox, quindi, limita le operazioni che l’applicazione può eseguire e<br />
soprattutto non permette che questa possa accedere del tutto alle risorse lo-<br />
cali (file sul disco rigido o una videocamera, ad esempio) oppure richiedendo<br />
l’autorizzazione dell’utente.<br />
Le sandbox, sono tipicamente progettate per caricare il software diretta-<br />
mente in memoria cercando di scrivere sul disco rigido meno dati possibili<br />
e comunque in zone predeterminate e che verranno ripulite alla fine delle<br />
operazioni o ad una scadenza fissata. Se l’applicazione necessita di accede-<br />
re a dei file su disco (ad esempio in un programma di fotoritocco l’utente<br />
potrebbe voler modificare immagini già presenti sulla macchina) la sandbox<br />
non permette che questi vengano selezionati e letti senza l’assenso dell’uten-<br />
te. Inoltre non permette al programma ospitato di accedere ad hardware<br />
particolare come microfoni e webcam senza permesso.<br />
Riguardo alla sicurezza delle comunicazioni client-server la maggior parte<br />
delle tecnologie RIA prevede la cifratura di ogni messaggio inviato e ricevuto.<br />
Un altro controllo praticato dalla sandbox è quello sul “dominio* ” di appar-<br />
tenenza del codice eseguito: se si sta eseguendo un’applicazione scaricata<br />
da un certo sito, tutto le istruzioni del programma devono provenire dallo<br />
stesso dominio, in altre parole non è possibile, salvo dietro autorizzazione,<br />
che il software in esecuzione prelevi ed esegua del codice fornito da siti terzi,<br />
all’insaputa dell’utente.<br />
Altre requisiti delle RIA per ottenere buoni livelli di sicurezza non dipen-<br />
dono comunque dal client engine e dalla relativa sandbox. Due aspetti sono<br />
particolarmente importanti. Innanzitutto i controlli lato server, che devono<br />
garantire che nessun malintenzionato possa alterare il software che verrà in-<br />
viato all’utenza. In secondo luogo la possibilità di poter esaminare il codice<br />
dell’applicazione stessa. Nelle applicazioni web standard il codice HTML e<br />
JavaScript raggiunge il client come un semplice file di testo, questo permette
CAPITOLO 2. RIA E ADOBE FLEX 3 13<br />
alla comunità informatica di esaminare l’applicazione e di segnalare even-<br />
tuali falle nella sicurezza. Molte tecnologie RIA prevedono che il software<br />
venga inviato in un formato compilato*, interpretato dal client engine 1 , che<br />
non è direttamente esaminabile. Tuttavia esistono tool, a volte sviluppati<br />
e distribuiti dalla stessa casa produttrice della tecnologia RIA in questione,<br />
che permettono di ricostruire il codice sorgente* da quello compilato.[8]<br />
2.3 Aspetti economici<br />
Le RIA rappresentano una notevole evoluzione nel mondo delle appli-<br />
cazioni web il che porta ad effettuare alcune considerazioni sui costi di<br />
produzione, gestione ed utilizzo di tali applicazioni.<br />
Fra i vantaggi annoveriamo un abbassamento dei costi di produzione delle<br />
applicazioni, un minor consumo di banda* da parte del server e una miglior<br />
distribuzione dei carichi di lavoro computazionale tra client e server.<br />
La diminuzione dei costi di produzione è dovuta al fatto che le RIA<br />
utilizzano nuovi linguaggi di programmazione che semplificano di molto lo<br />
sviluppo delle medesime. Un esempio notevole è il linguaggio Java. Java<br />
è un linguaggio che viene compilato in un formato chiamato “bytecode” che<br />
viene interpretato da una macchina virtuale, il già citato Java Runtime En-<br />
vironment, di cui esistono versioni per tutti i sistemi operativi più diffusi.<br />
Pur offrendo prestazioni inferiori rispetto ai linguaggi che vengono compilati<br />
in formati eseguibili permettono agli sviluppatori di creare applicazioni che<br />
funzioneranno identicamente su qualsiasi piattaforma riducendo i costi di<br />
produzione. La minor velocità di esecuzione è comunque irrilevante rispetto<br />
ai tempi di attesa che si verificano nelle applicazioni Web durante le comu-<br />
nicazioni col server anche se le RIA, come abbiamo visto, riducono questo<br />
problema.<br />
Bisogna notare che i linguaggi del calibro di Java non devono essere visti<br />
come semplici linguaggi di scripting per lo più utilizzati per rendere maggior-<br />
mente interattive le pagine Web con poche righe di codice ma permettono<br />
di creare complesse applicazioni. Sono provvisti di tutte le caratteristiche di<br />
linguaggi di elezione come il C++, come ad esempio l’essere totalmente ad<br />
1 L’utilizzo di un formato compilato è dovuto a motivi di migliori performance
CAPITOLO 2. RIA E ADOBE FLEX 3 14<br />
“oggetti*”, con l’aggiunta di funzionalità di “garbage collection* ” e, di notevo-<br />
le importanza, la possibilità di sfruttare vaste librerie di codice già presente<br />
sulla macchina (generalmente comprese nel Runtime Environment scaricato<br />
ed installato in precedenza) riducendo i tempi di download dell’applicazione.<br />
Per quel che riguarda il consumo di banda da parte del server si deve<br />
considerare che questo deve fornire assistenza, in termini di scambio dati e<br />
potenza di calcolo, ad ogni client che sta utilizzando l’applicazione. Siccome<br />
le RIA non necessitano di un continuo scambio di dati con il server, questo<br />
risulterà meno stressato ed inoltre la banda necessaria affinché questo pos-<br />
sa rispondere a tutte le istanze dell’applicazione risulterà ridotta con ovvie<br />
riduzioni dei costi di gestione.<br />
Infine consideriamo la miglior distribuzione dei carichi computazionali<br />
fra client e server. Nelle applicazioni Web classiche il computer client de-<br />
ve solamente far girare un browser che visualizzerà una manciata di widget<br />
pertanto il potenziale di un qualsiasi computer recente verrà scarsamente<br />
utilizzato; nelle RIA invece la stessa macchina deve far funzionare una appli-<br />
cazione con grafica ed interfaccia realistica del tutto analoga ad applicazione<br />
Desktop anche molto complessa. Di conseguenza il modello RIA sposta il<br />
carico di lavoro dal server ai client ma mentre il primo è generalmente obe-<br />
rato di lavoro i secondi sono tendenzialmente inoperosi. In una azienda i cui<br />
dipendenti utilizzino delle applicazioni RIA in una “Intranet*” questo è un<br />
aspetto da considerare insieme al fatto che i dipendenti saranno costretti a<br />
minori perdite di tempo necessari ai continui ricaricamenti delle pagine web<br />
del Web dinamico classico.<br />
Uno dei punti chiave del successo delle RIA, ovvero il fatto che la maggior<br />
parte dei componenti dell’applicazione vengano scaricati e fatti girare sul<br />
client, porta però un inconveniente.<br />
Il risiedere dell’applicazione sul client rappresenta un problema agli occhi<br />
del produttore perché inevitabilmente la proprietà intellettuale del software<br />
sarà esposta. Inoltre il codice è il più delle volte chiaramente leggibile o facil-<br />
mente decompilabile con degli appositi strumenti. Bisogna tenere conto però<br />
che le parti veramente sensibili dell’applicazione, come ad esempio algoritmi<br />
particolari il cui sviluppo ha comportato investimenti onerosi, possono rima-<br />
nere al riparo da occhi indiscreti sul server. Inoltre molte delle tecnologie
CAPITOLO 2. RIA E ADOBE FLEX 3 15<br />
create per sviluppare RIA sono “open source* ”. Questo ha portato alla na-<br />
scita di comunità di appassionati in tutto il mondo che sviluppano e mettono<br />
a disposizione di tutti librerie e framework* che fungono da base per nuovi<br />
software i cui costi di produzione si riducono notevolmente con conseguente<br />
diminuzione di prezzo per il cliente finale.[3, 4]<br />
2.4 Tipi di RIA e confronti<br />
Esistono tre tipologie di RIA. La prima è quella la cui tecnologia rap-<br />
presentante principale è “AJAX ”. Si tratta del connubio tra JavaScript e<br />
XML, un linguaggio di mark-up, che fornisce un oggetto software chiamato<br />
“XMLHttpRequest” (la cui implementazione non è ancora standardizzata e<br />
varia a seconda del browser) utilizzato dagli sviluppatori per fornire comu-<br />
nicazioni asincrone col server.[5] Alcune famose applicazioni sono basate su<br />
questa tecnologia, la più celebre delle quali è Google Maps 2 . Questo tipo di<br />
RIA ha il pregio di utilizzare tecniche estranee a quelle del Web classico so-<br />
lamente per le comunicazioni asincrone, quindi l’applicazione non necessita<br />
di plugin da installare e, proprio per questo motivo, assomiglia alle pagine<br />
Web tradizionali risultando spesso più familiare all’utente pur non offrendo<br />
le potenzialità grafiche delle RIA basate su client engine esterni. I problemi<br />
di questo approccio sono quelli già visti per le applicazioni Web tradiziona-<br />
li cioè le incompatibilità dei vari browser, delle relative implementazioni del<br />
DOM e dell’interprete JavaScript, senza contare che quest’ultimo deve essere<br />
attivato nelle impostazioni del browser.<br />
La seconda tipologia di RIA è costituita da quei software che vengono<br />
gestiti da un plugin per il tipo specifico di browser e che, tramite questo,<br />
vengono visualizzati. Per fare funzionare queste applicazioni bisogna otte-<br />
nere e installare il plugin adatto. Generalmente però appena raggiunta la<br />
pagina dell’applicazione, tramite poche linee di codice JavaScript, il browser<br />
ci invierà automaticamente alla pagina di download del plugin sul sito del<br />
produttore senza contare che l’installazione deve essere effettuata una sola<br />
volta ed è, di norma, indolore. L’applicazione vera e propria deve essere<br />
scaricata pressoché per intero e questo può essere un processo lento per gli<br />
2 consulta http://maps.google.it/ per ulteriori approfondimenti
CAPITOLO 2. RIA E ADOBE FLEX 3 16<br />
utenti che non dispongono di una connessione a banda larga. Il plugin si<br />
occupa generalmente di informare l’utente sull’avanzamento dell’operazione<br />
di download visualizzando a schermo una barra di progresso*, ma questo<br />
potrebbe comunque scoraggiarsi ed abbandonare la pagina prima della fine.<br />
Bisogna dire che i plugin possono essere impostati per conservare il software<br />
nella “cache* ” del browser per velocizzare l’avvio nelle sessioni successive al-<br />
la prima. Inoltre i programmatori possono progettare l’applicazione in modo<br />
che venga visualizzata l’interfaccia principale in tempi ragionevoli e solo suc-<br />
cessivamente scaricare il resto, in modo da incoraggiare l’utenza ed offrire<br />
velocemente le funzionalità basilari.<br />
Le applicazioni basate su tecnologie simili ad AJAX non sono soggette a<br />
tali limitazioni.<br />
Un altro problema, anche se marginale,è rappresentato dalla confusione<br />
che viene a generarsi tra i comandi dell’interfaccia della RIA e quelli del bro-<br />
wser: l’utente di una applicazione di fotoritocco potrebbe premere il bottone<br />
di stampa del browser e, invece di ricevere su carta la foto appena editata, ot-<br />
tenere la stampa della pagina Web contenente l’interfaccia della applicazione<br />
stessa, oppure premere il pulsante Indietro sempre del browser ed uscire del<br />
tutto dalla pagina del software pensando invece di tornare alla schermata<br />
precedentemente usata.<br />
Una limitazione di questa seconda tipologia è la perdita di visibilità nei<br />
motori di ricerca* , infatti questi, mediante software appositi, scandagliano in<br />
continuazione l’intero World Wide Web per indicizzare le pagine analizzando<br />
il codice HTML (o XML) ma non il contenuto delle RIA. Questo problema<br />
è però superabile aggiungendo del testo HTML nelle pagine web contenti<br />
l’applicazione che ne illustri le funzionalità oppure sfruttare appositi “tag”<br />
del codice HTML come come illustrato in [10]. I software sviluppati<br />
con la tecnologia AJAX non presentano questo problema.<br />
L’ultima famiglia è quella delle applicazioni che non hanno bisogno di<br />
essere ospitate all’interno di un browser. L’utente trova il software che gli<br />
interessa navigando il Web, clicca un “link” che comanda al client engine di<br />
scaricare il programma che verrà poi utilizzato stand-alone senza l’ausilio del<br />
browser come se fosse una normale applicazione Desktop. Anche in questo<br />
caso il software può essere conservato in una directory* del disco rigido per
CAPITOLO 2. RIA E ADOBE FLEX 3 17<br />
velocizzare la partenza nelle successive sessioni o per essere utilizzato offline*<br />
per quelle operazioni che non richiedono servizi da parte del server. Inoltre<br />
una volta scaricata l’applicazione per la prima volta è possibile avviarla usan-<br />
do le icone del proprio Desktop[6], esempi di tecnologie che permettono lo<br />
sviluppo di tali applicazioni sono “Java Web Start” e “Adobe AIR” (cono-<br />
sciuto anche come “Apollo”). Questo approccio evita la confusione di avere<br />
a schermo sia l’interfaccia del browser sia quella della RIA.<br />
Un problema condiviso da tutte tre le tipologie deriva proprio da una<br />
delle caratteristiche principali delle RIA: lo scambio di dati asincrono fra<br />
client e server. Negli applicativi Web tradizionali basati su CGI o pagine<br />
PHP o ASP l’utente deve sempre fare richiesta esplicita di inviare dati al<br />
server; generalmente compila un form, invia i dati premendo un bottone e<br />
aspetta la risposta con l’inevitabile caricamento di una nuova pagina. In ogni<br />
caso sa che deve aspettare una risposta. Nelle RIA invece lo scambio di dati è<br />
trasparente agli occhi dell’utente; se però qualcosa non funziona a dovere e i<br />
dati non vengono ricevuti, l’applicazione può risultare congelata suggerendo<br />
a chi sta usando il software che ci sia qualche errore di programmazione al<br />
posto di un banale e momentaneo disservizio.<br />
2.5 Adobe Flex 3<br />
Flex 3 di Adobe è una linea di prodotti integrati utili allo sviluppo di RIA.<br />
L’ambiente di sviluppo è costituito da una versione modificata di Eclipse, un<br />
“IDE* ” open source, che comprende un editor* , un “debugger* ” e componen-<br />
ti per la costruzione visuale del layout e per la gestione dei file del progetto.<br />
Flex permette lo sviluppo di codice che verrà compilato in bytecode, il quale<br />
verrà interpretato e trasformato in formato eseguibile per mezzo del “Flash<br />
Player runtime”, il client engine utilizzato da questa tecnologia. Adobe stima<br />
che ll Flash Player runtime sia attualmente installato su più del 97% dei PC<br />
connessi ad Internet.<br />
Il modello di sviluppo si basa su MXML e ActionScript (versione 3.0).<br />
MXML è un linguaggio di mark-up utilizzato per la descrizione dei compo-<br />
nenti e della struttura dell’interfaccia. Le specifiche di MXML definiscono<br />
tag che forniscono un collegamento fra gli elementi della GUI con i dati e gli
CAPITOLO 2. RIA E ADOBE FLEX 3 18<br />
algoritmi dell’applicazione. Pertanto il codice MXML risulterà di più facile<br />
lettura perché il codice responsabile del comportamento dei widget e delle<br />
procedure di calcolo, e i dati, che dovranno essere visualizzati ed elaborati,<br />
sono contenuti in altri file. A parte le istruzioni relative all’aspetto estetico<br />
dei componenti della GUI che di norma, ma non obbligatoriamente, sono con-<br />
tenuti nei cosiddetti fogli di stile, il nucleo del software viene programmato<br />
tramite codice ActionScript.<br />
ActionScript è un linguaggio di programmazione orientato agli oggetti<br />
basato, come Javascript del resto, su ECMAScript, un linguaggio standar-<br />
dizzato dall’European Computer Manufacturers Association. Con Action-<br />
Script si sviluppa tutta la logica della parte client dell’applicazione. Questo<br />
comprende il comportamento dell’interfaccia, cioè cosa deve fare il program-<br />
ma quando si clicca su un bottone o quando si trascinano oggetti col mouse<br />
(drag&drop), e le varie operazioni per cui il software è preposto come, ad<br />
esempio, il calcolo delle rate di un mutuo o la visualizzazione di una mappa<br />
etc..<br />
Inoltre è possibile rendere l’interfaccia dinamica, cioè si può, ad esempio,<br />
far vedere un bottone solo quando è possibile e logico premerlo per pren-<br />
dere una decisione. Questa possibilità è ottenibile o mediante appositi tag<br />
MXML che definiscono come debba presentarsi l’interfaccia in ben deter-<br />
minati momenti dell’applicazione, oppure per via programmatica, mediante<br />
ActionScript, impostando la proprietà “visible” dei componenti interessati al<br />
valore “true” o “false” a seconda che questi debbano risultare visibili o meno.<br />
Flex fornisce una ricca API che permette varie operazioni, tra cui il di-<br />
segno di primitive grafiche, la creazione di contenitori, cioè widget in grado<br />
di ospitarne altri al loro interno, e la gestione del comportamento di que-<br />
st’ultimi in seguito all’interazione con l’utente o al verificarsi di determinati<br />
eventi. Questi caratteristiche consentono allo sviluppatore di estendere la<br />
libreria dei widget con elementi totalmente personalizzati nel design e nelle<br />
funzionalità. Questi nuovi elementi, al pari di quelli predefiniti, possono es-<br />
sere aggiunti alla GUI dell’applicazione mediante un tool visuale di Flex che<br />
permette di disegnare l’interfaccia intuitivamente con pochi click di mouse e<br />
notevole risparmio di tempo.<br />
Un altro componente di Flex è il “Flex Data Services” uno strato software,
CAPITOLO 2. RIA E ADOBE FLEX 3 19<br />
risiedente sul server, che si occupa di ottimizzare lo scambio di dati col client,<br />
ma soprattutto di integrare le tecnologie già presenti sul server in modo che<br />
siano sfruttabili dall’applicazione ed, eventualmente, di permettere a questa<br />
di comunicare anche con altri server e altri client su Internet.[7]
Capitolo 3<br />
Testo 3D<br />
3.1 Introduzione<br />
Come prima applicazione di Adobe Flex introduciamo un’applicazione<br />
grafica scritta originariamente da Pavel Kaluzhny per il pacchetto software<br />
Flash con il linguaggio ActionScript 2.0 (vedi [24]). Nello svolgimento della<br />
tesi l’applicazione è stata portata in ActionScript 3.0 per poter funzionare in<br />
Flex 3, ciò ha comportato alcuni cambiamenti dovuti a modifiche apportate<br />
da Adobe alle librerie di base del linguaggio e all’aggiunta di righe di codice<br />
atte a sostituire quelle operazioni che in Flash si possono eseguire con gli<br />
strumenti di posizionamento, dimensionamento ecc. presenti nell’interfaccia<br />
ma che sono assenti in Flex.<br />
Il programma visualizza un campo di testo i cui caratteri si muovono in<br />
un ambiente tridimensionale indipendentemente l’uno dall’altro. La disposi-<br />
zione dei caratteri è tale da ricreare l’effetto lenzuolo, il testo sembra essere<br />
scritto su una tela invisibile che viene sventolata (vd. Figura 3.1).<br />
3.2 Modello matematico<br />
Le librerie standard di disegno di Flex (cioè quelle fornite insieme al<br />
pacchetto e non prodotte da terzi) non prevedono funzioni di disegno 3D,<br />
questa applicazione pertanto simula l’ambiente tridimensionale proiettando<br />
gli oggetti sul piano OXY come se osservati da una telecamera posta nel<br />
20
CAPITOLO 3. TESTO 3D 21
CAPITOLO 3. TESTO 3D 22<br />
Figura 3.1: Alcuni frame dell’animazione del testo.<br />
punto (0, 0, V P f) 1 . V P f è un numero arbitrario ma sufficientemente grande<br />
(in valore assoluto) da permettere un’ inquadratura ragionevole del piano<br />
proiettivo.<br />
Il testo da visualizzare viene scomposto nei singoli caratteri, ad ognuno<br />
di questi viene assegnata una celletta quadrata virtuale che lo contiene. Le<br />
1 Le proiezioni trasformano punti da uno spazio n-dimensionale ad uno spazio di dimen-<br />
sioni inferiori ad n. Nella grafica computerizzata si fa larghissimo uso di trasformazioni<br />
di proiezione dal 3D al 2D. La proiezione di un oggetto 3D è definita da un insieme di<br />
rette di proiezione, chiamate proiettori, aventi origine comune in un punto detto centro di<br />
proiezione o punto di vista. I proiettori passano attraverso tutti i punti dell’oggetto 3D e<br />
quindi intersecano un piano di proiezione formando la proiezione vera e propria. Grazie<br />
al fatto che la proiezione di un segmento è a sua volta un segmento, non è necessario pro-<br />
iettare tutti gli infiniti punti rappresentanti gli oggetti di una scena ma, al solito, risulta<br />
sufficiente proiettare i vertici dei segmenti di rappresentazione degli oggetti stessi. Questa<br />
classe di proiezioni prende il nome di proiezioni geometriche piane in quanto i proiettori<br />
sono linee rette e il codominio bidimensionale è il piano. Le proiezioni geometriche piane<br />
possono essere classificate in proiezioni prospettiche e proiezioni parallele. La distinzione<br />
risiede nella relazione esistente tra centro e piano di proiezione. Si parla di proiezione<br />
prospettica nel caso in cui la distanza tra il centro ed il piano di proiezione sia finita; al<br />
contrario, nel caso di distanza infinita si parla di proiezione parallela.(citazione da [14])
CAPITOLO 3. TESTO 3D 23<br />
cellette sono contigue e i vertici di queste giacciono sul piano di coordinate<br />
(u, v), inoltre il lato ha lunghezza 1 (vd. Figura 3.2).<br />
u<br />
v (0,0) (1,0) (2,0) (6,0)<br />
(0,1)<br />
H e l l o ,<br />
h a v e a<br />
n i c e<br />
d a y !<br />
(0,2) (1,2) (4,2)<br />
Figura 3.2: etichettatura dei vertici delle celle contenenti i caratteri, le etichette<br />
sono le coordinate dei vertici nel piano (u, v)<br />
Per ogni carattere si passano alla funzione makeShape 2 , come parame-<br />
tri, le coordinate (u, v) di tre dei quattro vertici della cella corrispondente.<br />
La funzione in questione assegna ad ogni vertice le coordinate (x, y, z) dello<br />
spazio tridimensionale. La scelta di quali coordinate assegnare ad ogni ver-<br />
tice è completamente libera ma siccome la posizione della cella, e quindi del<br />
carattere, deriva dal posizionamento dei tre vertici nello spazio, per ottenere<br />
effetti gradevoli è necessario che le formule usate per l’assegnamento godano<br />
di una certa regolarità. Ovviamente la disposizione relativa di una cella con<br />
le confinanti viene mantenuta.<br />
Ad ogni frame dell’animazione la celletta si dispone nello spazio tridi-<br />
mensionale in modo differente rispetto al frame precedente, creando così il<br />
movimento del carattere. Possiamo vedere alcuni screenshot del movimento<br />
di una lettera in Figura 3.3.<br />
Il passo successivo è proiettare i tre punti di ogni cella sul piano OXY .<br />
2 Il codice della funzione makeShape viene presentato nel paragrafo 3.4<br />
(5,3)
CAPITOLO 3. TESTO 3D 24<br />
Figura 3.3: Movimento di una singola lettera in alcuni frame dell’animazione.
CAPITOLO 3. TESTO 3D 25<br />
(x,0,z)<br />
(x,y,z)<br />
y<br />
O<br />
(x’,0,0)<br />
(x’,y’,0)<br />
x<br />
(0,0,VPf)<br />
Figura 3.4: Proiezione della coordinata x sul piano 0XY<br />
Indicato con (x ′ , y ′ ) la proiezione del punto (x, y, z) sul piano OXY , in Fi-<br />
gura 3.4 possiamo notare che il triangolo di vertici O, (0, 0, V P f) e (x ′ , 0)<br />
e quello di vertici (0, 0, z), O e (x, 0, z) sono omotetici pertanto vale la pro-<br />
porzione V P f/x ′ = (V P f − z)/x e pertanto x ′ = (V P f · x)/(V P f − z).<br />
Discorso analogo per la proiezione della coordinata y (vedi [14]). Questa<br />
operazione viene svolta dalla funzione projectPoint 3 .<br />
A questo punto si applicano delle trasformazioni affini al disegno dei sin-<br />
goli caratteri in modo che questi sembrino scritti sulla celletta immersa nello<br />
spazio 3D. L’applicazione, proiettati i tre punti di ogni cella che chiameremo<br />
P0, P1 e P2, crea un oggetto Sprite contenente all’interno un oggetto Text-<br />
Field. Successivamente posiziona a schermo l’oggetto Sprite alle coordinate<br />
di P0. Siamo, a questo punto nella situazione iniziale di Figura 3.5. Nell’at-<br />
tuale versione di ActionScript è possibile applicare ad ogni oggetto grafico<br />
delle matrici di trasformazione che lavorano in coordinate omogenee (vedi<br />
[22]).<br />
3 Il codice della funzione projectPoint viene presentato nel paragrafo 3.4<br />
z
CAPITOLO 3. TESTO 3D 26<br />
(1)<br />
(2)<br />
(3)<br />
P₀ºP’₀<br />
P₁<br />
la<br />
<br />
P‘₁<br />
A<br />
P₀ºP’₀<br />
A<br />
(4)<br />
P₁ºP’₁<br />
P₀ºP’₀<br />
P₁<br />
la<br />
P₀ºP’₀<br />
<br />
P‘₁<br />
lp<br />
lp<br />
P‘₂<br />
P₂<br />
P₂<br />
P₁ A P‘₂<br />
P‘₁<br />
A<br />
Figura 3.5: Trasformazione affine della cella contenente il carattere per disporsi<br />
coerentemente ai vertici proiettati<br />
lp<br />
P₂<br />
P‘₂<br />
P₂ºP’₂
CAPITOLO 3. TESTO 3D 27<br />
Le matrici sono della forma:<br />
M =<br />
⎛<br />
⎜<br />
⎝<br />
a b 0<br />
c d 0<br />
tx ty 1<br />
⎞<br />
⎟<br />
⎠<br />
(3.1)<br />
Per capire meglio il procedimento ricordiamo che dalla teoria delle tra-<br />
sformazioni affini conosciamo il significato geometrico di ogni elemento della<br />
matrice indicata in 3.1: a e d rappresentano i parametri di scaling rispetto<br />
a x e y, b e c quelli della deformazione di taglio rispettivamente in direzione<br />
dell’asse y e dell’asse x mentre tx e ty sono i parametri di traslazione che qui<br />
non interessano perchè le trasformazioni, come detto precedentemente, sono<br />
fatte rispetto all’oggetto contenitore Sprite già posizionato in P0.<br />
I punti trasformati di coordinate (x ′ , y ′ , 1) si ottengono ponendo (x ′ , y ′ , 1) =<br />
(x, y, 1) · M. Si vuole fare in modo che i vertici del TextField contenente il<br />
carattere P ′ 0 , P ′ 1 , P ′ 2<br />
combacino, tramite trasformazione affine, con i rispetti-<br />
vi punti proiettati. Col posizionamento dello Sprite nel punto P0 si ottiene<br />
P ′ 0 ≡ P0. Siccome qualsiasi trasformazione affine viene calcolata rispetto<br />
all’origine dell’oggetto contenitore, cioè rispetto al punto (0, 0) dello Sprite,<br />
le trasformazioni applicate al TextField risulteranno applicate rispetto a P0<br />
come voluto. Il codice calcola gli angoli α e φ ed applica uno scaling non<br />
uniforme al TextField di parametri cosφ · lp rispetto all’asse x e cosα · lp<br />
rispetto all’asse y dove lp è la lunghezza del segmento P2P0 e la è la lun-<br />
ghezza del segmento P1P0. A questo punto il TextField è scalato in modo<br />
tale che i punti P ′ 1 e P1 abbiano la stessa ordinata e i punti P ′ 2 e P2 la<br />
stessa ascissa. Siamo pertanto giunti al passo (2) di Figura 3.5. Adesso è<br />
necessario “shiftare” la coordinata y di P ′ 2 e la coordinata x di P ′ 1<br />
in modo<br />
che si sovrappongano rispettivamente a P2 e P1. Ciò si ottiene applicando<br />
una deformazione di taglio di parametro sinφ · lp rispetto all’asse y e uno<br />
di parametro sinα · la rispetto all’asse x. Queste due operazioni ci portano<br />
rispettivamente ai punti (3) e (4) di Figura 3.5 ([23]).<br />
3.3 Applicazioni possibili<br />
Quale può essere il significato di un’applicazione di questo tipo? Con<br />
l’avvento delle varie tecnologie di banda larga, le pagine web sono diventate
CAPITOLO 3. TESTO 3D 28<br />
sempre più ricche di immagini ed animazioni. Si sono create tecnologie per<br />
visualizzare applet, java in primis, che eseguendo le istruzioni di disegno<br />
del proprio codice permettono di scaricare e visualizzare animazioni senza<br />
ricorrere a grossi file gif* o in altri formati bitmap. Teoricamente nulla<br />
impedisce di applicare lo stesso principio per la grafica 3D.<br />
Dal lato pratico però esiste una certa carenza di librerie per la gestione di<br />
contenuti 3D per le applicazioni web fruibili via browser. Vediamo il perchè.<br />
La grafica 3D è usata in diversi campi. Per quel che riguarda il campo<br />
videoludico le aziende sviluppatrici di giochi si affidano a tecnologie quali<br />
OpenGL, Microsoft DirectX o ancora Mesa3D library, cioè a delle librerie<br />
che riescono ad accedere a memoria e chip delle schede grafiche usando come<br />
interfaccia i driver che vengono forniti dai produttori dell’hardware stesso.<br />
In questo modo le applicazioni risultano fluide nonostante l’enorme mole<br />
computazionale della grafica tridimensionale.<br />
Questa è generalmente la scelta obbligata per tutti i software in cui ve-<br />
locità, numero elevato di frame per secondo e alta qualità delle immagini si<br />
rendono necessari, si pensi ad applicazioni mediche o militari o ai sistemi<br />
di CAD. Abbiamo detto che una applicazione web deve essere fruibile da<br />
un’utenza il più possibile vasta e soprattutto accessibile dal browser. I fra-<br />
mework appena descritti sono progettati per i linguaggi C/C++ e per creare<br />
eseguibili specifici per un certo hardware e per un certo sistema operativo.<br />
Inoltre librerie come le DirectX sono disponibili solo per la famiglia di sistemi<br />
operativi Microsoft Windows.<br />
Accedere all’hardware specializzato per la grafica, disponibile sulla mac-<br />
china, è indispensabile per ottenere certe prestazioni ma sviluppare una<br />
tecnologia indipendente dalla piattaforma per il web non è semplice.<br />
Java 3D è una API per grafica tridimensionale per la piattaforma Ja-<br />
va. Funziona appoggiandosi a DirectX o OpenGl (dipendentemente dalla<br />
piattaforma) fornendo pertanto prestazioni “hardware-accelerated”. Inoltre<br />
è strutturata con uno stile object-oriented. Quest’ultimo fatto rappresenta<br />
un piccolo collo di bottiglia per le prestazioni insieme al fatto che il codice<br />
compilato deve essere interpretato in real-time dalla macchina virtuale Java.<br />
Le prestazioni sono comunque ottime e le applicazioni possono girare<br />
all’interno del browser come applet o vere e proprie RIA.
CAPITOLO 3. TESTO 3D 29<br />
A dimostrazione di quanto sia impegnativo per un’azienda creare e man-<br />
tenere un simile progetto, basti pensare alla storia di Java 3D 4 : inizialmente<br />
sviluppato da quattro aziende del calibro di: Intel, Silicon Graphics, Apple e<br />
Sun; lo sviluppo e mantenimento del framework venne interrotto per un paio<br />
d’anni (2003-2004), successivamente ne venne rilasciato il codice in modo da<br />
combinare il lavoro di numerosi volontari con quello di Sun.<br />
Adobe non ha rilasciato nessuna libreria per grafica e animazioni tridi-<br />
mensionali né per Flash né per Flex, molto probabilmente perché non esiste<br />
una forte richiesta in questo senso da parte dell’utenza di questi strumenti di<br />
sviluppo. Inoltre Adobe produce Director, pacchetto che permette di portare<br />
sul web applicazioni e giochi 3D ma che purtroppo non ha preso molto piede<br />
per la dimensione del plug-in necessario alla visualizzazione dei contenuti 5 e<br />
che vede la sua ultima versione datata all’anno 2004.<br />
Esiste tuttavia il promettente progetto Papervision3D 6 , una libreria open<br />
source scritta in ActionScript 3.0 che consente la gestione di scene 3D con<br />
buone prestazioni nonostante la totale mancanza di accesso alle potenzialità<br />
hardware delle schede grafiche.<br />
Data la carenza, o addirittura mancanza, di tool ufficiali, chi vuole svi-<br />
luppare piccoli effetti grafici 3D o piccoli giochi o limitate applicazioni tri-<br />
dimensionali a scopi didattici è portato a sviluppare da sé un motore 3D<br />
personalizzato per non appoggiarsi a codice di terze parti che molte volte è<br />
a pagamento o privo di documentazione e supporto o il cui mantenimento<br />
potrebbe essere interrotto in qualsiasi momento.<br />
Questa applicazione del testo 3D permette di mappare un campo di te-<br />
sto su una qualsiasi superficie tridimensionale ed è molto versatile. In molti<br />
siti di informazione sono presenti dei piccoli riquadri dove le notizie o della<br />
pubblicità scorre in verticale verso l’alto con le prime righe che scompaiono<br />
all’uscita del riquadro e quelle nuove che compaiono sul fondo. Come ve-<br />
dremo nel paragrafo 3.4, editando opportunamente la funzione makeShape,<br />
si può ottenere un effetto analogo ma con il testo che si perde pian piano<br />
4 vedi Bibliografia [15]<br />
5 vedi Bibliografia [16]<br />
6 vedi Bibliografia [16]
CAPITOLO 3. TESTO 3D 30<br />
nello spazio come i titoli di di una famosa saga di film di fantascienza 7 (vd.<br />
Figura 3.6).<br />
Figura 3.6: Effetto con il testo che si perde nello spazio.<br />
Sempre con opportune modifiche alla funzione makeShape possiamo map-<br />
pare il testo su qualsiasi tipo di superficie ottenendo vari effetti. In Figura 3.7<br />
vediamo il testo scritto sopra una supeficie che simula l’ondulazione di una<br />
bandiera, mentre in Figura 3.8 i caratteri appaiono scritti sulla superficie<br />
laterale di un cilindro.<br />
Figura 3.7: Il testo sembra essere stampato su una bandiera mossa dal vento.<br />
7 Star Wars, tutti gli episodi
CAPITOLO 3. TESTO 3D 31<br />
Figura 3.8: I caratteri del testo possono essere mappati su una qualsiasi<br />
superficie. In questo caso un cilindro che ruota rispetto al suo asse di simmetria.
CAPITOLO 3. TESTO 3D 32<br />
L’idea di fondo può risultare utile anche per portare su web contenuti<br />
televisivi. L’attuale sigla di apertura di Tgcom, rubrica informativa televisi-<br />
va, sfrutta un effetto del tutto simile a questo, visualizzando del testo che si<br />
muove in ambiente 3D. Si possono utilizzare applicazioni analoghe a questa<br />
per portare sul sito, magari come “intro”, la stessa sigla evitando però di<br />
sovraccaricare la pagina con filmati pesanti da scaricare. Infatti il codice<br />
compilato da Flex risulta enormemente più piccolo in termini di byte di un<br />
qualsiasi filmato raster.<br />
3.4 Analisi del codice<br />
Abbiamo detto che la funzione makeShape è quella che determina co-<br />
me verrà visualizzato il testo nell’ambiente 3D. Analizziamo il codice della<br />
funzione nel primo caso visto, cioè quello di Figura 3.1 :<br />
private function makeShape(u:Number, v:Number, p:Object):void {<br />
p.x = (u - 8) * 20;<br />
p.y = (4 - v) * 14 + Math.cos(Math.sqrt((u - 8) * (u - 8)<br />
+ (3 - v) * (3 - v)) / 2 + timer / 4) * 36;<br />
p.z = (v - 4) * 20;<br />
}<br />
Ricordiamo che i punti verranno proiettati sul piano OXY e che la tele-<br />
camera è posta in (0, 0, V P f) con, in questo esempio, V P f = 260. L’og-<br />
getto p rappresenta un punto in R 3 e ha le proprietà x, y e z. Al cre-<br />
scere di v corrisponde un aumento della coordinata z del punto, pertan-<br />
to le lettere della prime righe appariranno più lontane delle ultime e lo<br />
stesso varrà anche i singoli caratteri. Per la coordinata x non c’è niente<br />
di particolare da segnalare mentre per la y si può notare che il termine<br />
Math.cos(Math.sqrt((u − 8) ∗ (u − 8) + (3 − v) ∗ (3 − v))/2 + timer/4) ∗ 36<br />
crea un effetto ondulatorio concentrico. Il parametro timer “fa muovere”<br />
il fronte dell’onda in quanto viene incrementato di un’unità ad ogni frame<br />
dell’animazione.<br />
Vediamo adesso come si può editare il corpo della funzione makeShape<br />
per ottenere il testo mappato sulle superfici degli esempi successivi.
CAPITOLO 3. TESTO 3D 33<br />
Per il caso di Figura 3.6 abbiamo:<br />
p.x = (u - 8) * 20 ;<br />
p.y = (4 - v) * 20 +timer;<br />
p.z = (v - 4) * 20 -timer;<br />
Per quello di Figura 3.7:<br />
p.x = (u - 8) * 20;<br />
p.y = (4 - v) * 14 + Math.cos(u+timer/10)*20;<br />
p.z = (v - 4) * 20;<br />
mentre, per l’esempio di Figura 3.8 si è usato questo codice:<br />
if ( timer < 0 ) {<br />
p.x = (u - 8)*11.5;<br />
p.y = (4-v)*12;<br />
p.z = 0;<br />
}<br />
else if ( timer
CAPITOLO 3. TESTO 3D 34<br />
}<br />
else {<br />
x = 70*Math.sin((8-u)/6);<br />
p.y = (4-v)*12;<br />
z = -70*Math.cos((8-u)/6);<br />
p.x = x * Math.cos((timer-61)/6) - z * Math.sin((timer-61)/6);<br />
p.z = -200 + x * Math.sin((timer-61)/6) + z * Math.cos((timer-61)/6);<br />
}<br />
p.z=p.z+200;<br />
dove i vari controlli sul valore della variabile timer, che viene incrementata<br />
di una unità ad ogni frame, fanno sì che l’animazione sia composta da diversi<br />
“momenti”. Quello finale dimostra come il testo possa essere mappato su una<br />
superficie solida, in questo caso un cilindro.<br />
Vediamo adesso la funzione projectPoint che proietta i vertici delle cel-<br />
lette da R 3 sul piano proiettivo:<br />
private function projectPoint(p:Object):void {<br />
p.x = p.x * VPf / (VPf - p.z);<br />
p.y = -p.y * VPf / (VPf - p.z);<br />
}<br />
A questa funzione viene passato l’oggetto p che rappresenta un punto in R 3<br />
ed essa provvede a calcolare le coordinate x e y sul piano OXY le quali<br />
vengono assegnate a p stesso.<br />
In conclusione osserviamo il codice della funzione setPos:<br />
public function setPos (p0x:Number, p0y:Number,<br />
p1x:Number, p1y:Number, p2x:Number, p2y:Number):void {<br />
x=p0x;<br />
y=p0y;<br />
graphics.clear();<br />
var alpha:Number=Math.atan2(p1x-p0x,p1y-p0y);
CAPITOLO 3. TESTO 3D 35<br />
}<br />
var phi:Number=Math.atan2(p2y-p0y,p2x-p0x);<br />
var transfMatrix:Matrix = new Matrix();<br />
var la:Number=Math.sqrt((p1x-p0x)*(p1x-p0x)+(p1y-p0y)*(p1y-p0y));<br />
var lp:Number=Math.sqrt((p2x-p0x)*(p2x-p0x)+(p2y-p0y)*(p2y-p0y));<br />
transMatrix.a=lp*Math.cos(phi)/24;<br />
transMatrix.b=lp*Math.sin(phi)/24;<br />
transMatrix.c=la*Math.sin(alpha)/24;<br />
transMatrix.d=la*Math.cos(alpha)/24;<br />
tf.transform.matrix=transMatrix;<br />
La funzione setPos è un metodo della classe Char3D che è una sottoclas-<br />
se della classe Sprite. A questa funzione vengono passate come argomenti<br />
le coordinate dei punti P0, P1 e P2. All’interno della classe vi è la proprie-<br />
tà tf di tipo TextField. L’oggetto Char3D (che, ricordiamo, è uno Sprite)<br />
viene posizionato alle coordinate di P0, dopo di che viene cancellato il dise-<br />
gno del frame precedente dell’animazione. Vengono poi calcolati gli angoli<br />
α e φ mediante la funzione atan2 della classe Math, questo metodo calcola<br />
e restituisce l’angolo del punto y/x in radianti, misurato in senso antiora-<br />
rio a partire dall’asse x di un cerchio centrato nell’origine (citazione dalla<br />
documentazione ufficiale di Flex 2). Viene quindi creato un oggetto Matrix<br />
che rappresenta una matrice di trasformazione. Questo oggetto gode delle<br />
proprietà a, b, c, d e queste vengono impostate come descritto nel paragrafo<br />
3.2. Si noti che le proprietà a, b, c, d vengono divise per una costante (24<br />
nel nostro caso) che dipende dal font scelto e dalla dimensione inizialmente<br />
scelta per quest’ultimo. Infine la matrice di trasformazione viene applicata<br />
all’oggetto TextField.
Capitolo 4<br />
Simulatore 3D di urti elastici<br />
4.1 Introduzione<br />
Sempre inizialmente sviluppata da Pavel Kaluzhny, questa applicazione<br />
visualizza un cubo che ruota nello spazio rispetto a due degli assi coordinati<br />
con delle sferette costrette al suo interno. Queste sfere, fornite inizialmente<br />
di massa e velocità casuali, continuano a muoversi e scontrarsi l’un l’altra<br />
con urti perfettamente elastici in un ambiente inerziale. L’energia cinetica<br />
complessiva del sistema rimane immutata e pertanto le sferette continuano<br />
a muoversi all’infinito. Anche in questo caso l’applicazione è stata portata<br />
da Flash e ActionScript 2.0 a Flex con ActionScript 3.0.<br />
Sempre nello svolgimento della tesi, all’applicazione è stata aggiunta<br />
una GUI mediante la quale si possono controllare i parametri di massa e<br />
dimensione di ogni sfera e la rotazione del cubo.<br />
Il codice originario prevedeva un espediente tale da ottenere la corretta<br />
visualizzazione degli spigoli del cubo solamente per il movimento rotatorio,<br />
preimpostato, dato da alcuni angoli prefissati. Con l’aggiunta di coman-<br />
di nell’interfaccia in grado di regolare a piacimento la rotazione del cubo<br />
rispetto agli assi x e y si è reso necessario un cambiamento del codice.<br />
Anche per quel che riguarda le collisioni tra le sfere il codice di Kaluzhny<br />
non corrispondeva ad un modello fisico realistico ma solamente ad una ap-<br />
prossimazione di questo. È stato pertanto necessario riscrivere l’algoritmo<br />
relativo.<br />
36
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 37<br />
4.2 Modello matematico<br />
Figura 4.1: Screenshot del simulatore.<br />
Ad ogni vertice del cubo vengono assegnati delle coordinate nello spazio<br />
tridimensionale in modo tale che il baricentro del medesimo sia centrato<br />
nell’origine. Inizialmente ogni spigolo ha lunghezza uno, valore che viene<br />
controllato da un’altra variabile per poter gestire la dimensione del cubo con<br />
più semplicità. Ad ogni frame dell’animazione il cubo viene ruotato rispetto<br />
all’asse x e all’asse y pertanto una funzione calcola le nuove coordinate dei<br />
vertici del cubo in seguito alle due rotazioni.<br />
La classe Line, che nel codice rappresenta uno spigolo del cubo, importa<br />
il disegno vettoriale di una linea originariamente disegnata in Flash e prov-<br />
vede a posizionarla sullo schermo in modo coerente con la proiezione sul<br />
piano OXY dei due vertici corrispondenti. Il procedimento è il seguente.<br />
Ogni oggetto Line ha come proprietà le coordinate dei due vertici. Il codice<br />
provvede a calcolarne le due rotazioni. Successivamente viene calcolata la<br />
proiezione prospettica del primo vertice sul piano proiettivo OXY dal pun-<br />
to di osservazione (0, 0, V P f). La linea viene posizionata sullo schermo in<br />
corrispondenza di questo punto, quindi, un vertice della linea coincide con la
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 38<br />
ay<br />
(-1,1,-1)<br />
(-1,-1,-1)<br />
y<br />
(-1,1,1)<br />
(-1,-1,1)<br />
ax<br />
(1,-1,-1)<br />
O<br />
(1,1,-1)<br />
(1,1,1)<br />
(1,-1,1)<br />
Figura 4.2<br />
Piano<br />
proiettivo<br />
x<br />
(0,0,VPf )<br />
proiezione del primo vertice dello spigolo mentre il secondo è fuori posizione.<br />
Siccome il disegno della linea è importato da un file esterno e non è dise-<br />
gnata mediante il codice, deve essere scalata in modo che anche il secondo<br />
vertice coincida col corrispondente vertice dello spigolo. Vengono pertanto<br />
calcolate le rotazioni e la proiezione del secondo vertice dello spigolo e il di-<br />
segno della linea viene scalato con fattori shx = (p2.x − p1.x)/imagewidth<br />
e shy = (p2.y − p1.y)/imageheight dove shx è il fattore di scala rispetto<br />
all’asse x, shy è il fattore di scala rispetto all’asse y, pk.x e pk.y k = 1, 2 sono<br />
le coordinate dei due vertici dello spigolo e imagewidth e imageheight sono<br />
larghezza e altezza dell’immagine. Immagine che raffigura la linea col primo<br />
vertice nell’angolo in alto a sinistra e il secondo nell’angolo in basso a destra<br />
(l’immagine vettoriale importata ha larghezza e altezza pari a 100 pixel). A<br />
questo punto anche il secondo vertice della linea coincide col secondo vertice<br />
dello spigolo in questione (vedi Figura 4.3). Siccome l’immagine della linea<br />
è importato da un file di Flash in formato vettoriale lo scaling dell’immagine<br />
non comporta perdita di qualità.<br />
Le sfere vengono disegnate come dei cerchi colorati mediante le funzioni<br />
di disegno della libreria standard di ActionScript con l’accorgimento di ap-<br />
z
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 39<br />
p1<br />
file immagine punti proiettati su OXY<br />
p1<br />
primo passo - posizionamento<br />
p1<br />
p2<br />
secondo passo - scaling<br />
Figura 4.3: Posizionamento dell’immagine contenente il disegno di una linea in<br />
modo che coincida con lo spigolo del cubo sul piano proiettivo<br />
plicare un “gradiente”, cioè una particolare sfumatura sul bianco, per fornire<br />
l’illusione di una sfera che rifletta la luce di una sorgente luminosa sulla sua<br />
superficie. Il disegno della sfera viene scalato opportunamente, rispettando<br />
le formule della proiezione.<br />
Ad ogni frame dell’animazione il vettore posizione della sfera viene sommato<br />
a quello della velocità (ricordiamo che ogni sfera è dotato inizialmente di<br />
una certo vettore velocità casuale), successivamente si controlla se la nuova<br />
posizione della sfera esce fuori dal cubo come se questo fosse ancora nella<br />
posizione iniziale senza aver subito rotazioni ed infine si applicano al centro<br />
della sfera le stesse rotazioni del cubo. Così facendo, se si verificano urti<br />
contro una parete del cubo è sufficiente cambiare di segno l’opportuna coor-<br />
dinata (urto elastico contro parete, la parete è intesa come oggetto di massa<br />
infinita).<br />
Per quel che riguarda invece le collisioni tra le sfere il codice di Kaluzhny<br />
non corrispondeva ad un modello fisico realistico ma solamente ad una ap-<br />
prossimazione di questo. È stato pertanto necessario riscrivere l’algoritmo<br />
relativo. Ricordiamo che in un urto perfettamente elastico, tra due sfere si<br />
p2<br />
p2
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 40<br />
conservano la quantità di moto e l’energia cinetica totali. Da questo princi-<br />
pio si ottiene che in un urto centrale (cioè quando la velocità relativa dei due<br />
corpi è diretta secondo la retta che unisce i due centri di massa) la velocità<br />
di avvicinamento prima dell’urto è opposta alla velocità di allontanamento<br />
dopo l’urto. Chiamate con v1,v2,v fin<br />
1 ,v fin<br />
2 ,m1,m2 rispettivamente le componenti<br />
delle velocità delle due sfere prima e dopo l’urto e le masse delle stesse,<br />
si ottengono le equazioni:<br />
v fin<br />
1<br />
v fin<br />
2<br />
= (m1 − m2)v1 + 2m2v2<br />
m1 + m2<br />
= (m2 − m1)v2 + 2m1v1<br />
m1 + m2<br />
(4.1)<br />
(4.2)<br />
In ambiente tridimensionale le cose sono più complesse.Indichiamo con P1<br />
e P2 i centri delle due sfere. Il codice, che vedremo nel paragrafo 4.6, calcola<br />
il vettore P1P2, la sua norma e quindi il versore risultante P1P2/ <br />
P1P2 . Il<br />
versore trovato è ortogonale al piano di collisione. Successivamente calcola<br />
la componente ortogonale al piano di collisione di v1. A questo punto ottiene<br />
anche la componente parallela al piano semplicemente come differenza di v1<br />
con la componente ortogonale. Le stesse operazioni vengono svolte anche per<br />
v2. In un urto non centrale le componenti tangenti al piano non subiscono<br />
variazioni dopo l’urto mentre le velocità scalari nelle direzioni ortogonali<br />
al piano obbediscono alle 4.1 e 4.2. Infine i nuovi vettori delle velocità<br />
sono uguali alla somma delle componenti ortogonali appena trovate e quelle<br />
parallele al piano di collisione che rimangono, come detto sopra, inalterate. 1 .<br />
Quando in Flex si aggiungono elementi grafici sul monitor bisogna set-<br />
tare l’indice relativo alla display list dell’oggetto contenitore dell’elemento<br />
in questione. Flex sovrappone i vari elementi in base alla display list nel<br />
senso che gli oggetti risulteranno come disegnati su fogli trasparenti posti<br />
uno sopra l’altro nell’ordine dettato dall’indice di ogni elemento. Questi fo-<br />
gli sono impilati a partire dall’indice 0 a crescere, per cui un oggetto con un<br />
certo indice può risultare sovrapposto ad uno di indice inferiore ma non il<br />
contrario.<br />
Nella nostra applicazione dobbiamo decidere quando una sfera “sta da-<br />
vanti” ad un’altra e fare lo stesso con gli spigoli del cubo. Per quel che<br />
1 vedi Bibliografia [11, 12]
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 41<br />
I vettori delle velocità vengono scomposti in componente ortogonale e parallela<br />
Le componenti ortogonali subiscono una variazione, quelle parallele rimangono<br />
immutate<br />
Figura 4.4: I nuovi vettori velocità sono la composizione della componente<br />
parallela e della nuova componente ortogonale
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 42<br />
riguarda le sfere si nota facilmente che una sferetta nasconde, parzialmen-<br />
te o meno, tutte quelle che sono più distanti dal centro di proiezione. Ad<br />
ogni frame una routine assegna l’indice di profondità ad ogni elemento da<br />
disegnare in base al valore che viene impostato alla proprietà, di tipo nume-<br />
rico, zposition. Per gli oggetti rappresentanti una sfera il codice assegna alla<br />
proprietà zposition la distanza del suo centro dal centro di proiezione.<br />
Siccome le sfere sono contenute nel cubo si deduce che un qualsiasi spi-<br />
golo sta davanti a tutte le sfere oppure dietro a tutte. Il cubo è un poliedro<br />
convesso pertanto una faccia, se intendiamo il cubo solido e non con le facce<br />
trasparenti, o è totalmente visibile o non lo è per niente. Queste due osser-<br />
vazioni ci permettono di affermare che se si riesce a stabilire che una faccia<br />
è visibile allora tutti gli spigoli della medesima devono essere disegnati di<br />
fronte alle sfere e viceversa.<br />
Dato il particolare centro di proiezione (0, 0, V P f), per stabilire se una<br />
faccia è visibile è sufficiente trovare l’intersezione del piano che la contiene<br />
con la retta di equazioni:<br />
x = 0<br />
y = 0.<br />
L’intersezione trovata è ovviamente un punto sull’asse z. Se il punto<br />
trovato ha come coordinata un valore compreso tra 0 e V P f la faccia è<br />
visibile altrimenti no.<br />
Il codice funziona in questo modo. Ad ogni oggetto Line viene passato<br />
un ulteriore punto appartenente ad una delle due facce a cui appartiene il<br />
relativo spigolo. A questo punto si possono calcolare i parametri direttori<br />
del piano, cioè i parametri a,b,c,d dell’equazione ax + by + cz + d = 0, in<br />
quanto si conoscono le coordinate di tre punti non allineati.<br />
Ricordiamo che, indicati i punti con (xk, yk, zk) k = 1, 2, 3, tali coefficienti<br />
si ottengono mediante l’equazione:<br />
<br />
<br />
x − x1<br />
<br />
<br />
x2 − x1<br />
<br />
x3 − x1<br />
y − y1<br />
y2 − y1<br />
y3 − y1<br />
z − z1<br />
z2 − z1<br />
z3 − z1<br />
<br />
<br />
<br />
<br />
<br />
= 0.<br />
<br />
<br />
L’intersezione con la retta si trova semplicemente con z = −d/c.
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 43<br />
La soluzione si trova assegnando alla variabile zposition dell’oggetto Line<br />
una costante di valore assoluto maggiore della massima distanza possibile di<br />
una sfera dal centro di proiezione e di segno positivo se la faccia contenente<br />
lo spigolo risulta visibile, di segno negativo altrimenti.<br />
La variabile zposition risulta pertanto impostata per ogni oggetto ed una<br />
routine, ad ogni frame, provvede a inserire tutti questi valori in un array,<br />
ad ordinarlo in modo crescente, e ad assegnare ad ogni oggetto, come indice<br />
all’interno della display list, l’indice che il relativo valore occupa nell’ar-<br />
ray. Così facendo sia gli spigoli del cubo sia le sfere verranno visualizzate<br />
correttamente.<br />
Notiamo che uno spigolo appartiene contemporaneamente a due distinte<br />
facce del cubo e che noi calcoliamo l’equazione di una delle due facce, quella<br />
contente il terzo punto passato all’oggetto. Questo non crea problemi per-<br />
ché se uno spigolo appartiene contemporaneamente ad una faccia visibile ed<br />
una invisibile allora le sferette e lo spigolo in questione non possono essere<br />
intersecate da uno stesso proiettore e pertanto non si presentano problemi<br />
di sovrapposizione erronea della sfera sulla linea o viceversa.<br />
Il procedimento illustrato è una semplice variante del “backface culling” o<br />
“backface removal” mediante i quali si stabilisce che una faccia di un poliedro<br />
convesso è visibile se l’angolo tra il vettore normale alla faccia applicato in<br />
un punto qualsiasi di questa e il proiettore di tale punto è compreso tra i 90<br />
e −90 gradi.<br />
Indicato con → n la normale e con → e il proiettore, la condizione di visibilità<br />
risulta essere → e · → n≥ 0. Se il poliedro non è convesso o se sulla scena vi è più<br />
di un oggetto può capitare che alcune facce siano solo parzialmente visibili,<br />
pertanto il “backface culling” non è sufficiente. In ogni caso viene sovente<br />
utilizzato come primo passo in modo da evitare procedimenti più costosi dal<br />
punto di vista computazionale per quelle facce che sono totalmente invisibili. 2<br />
4.3 Interfaccia<br />
A parte mostrare alcuni dei numerosi widget disponibili in Flex per la<br />
costruzione dell’interfaccia di un’applicazione, si sono create due classi che<br />
2 vedi Bibliografia [13]
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 44<br />
ne estendono le funzionalità; esse sono totalmente riutilizzabili e non hanno<br />
dato segno di instabilità nel corso della stesura della presente.<br />
La prima è contenuta nel file “AdvancedPanel.as” ed è una sottoclasse<br />
della classe Panel di Flex. Estende il Panel di Flex nel senso che colma due<br />
grosse lacune che non sono presenti in altri toolkit per interfacce. Permette<br />
infatti di ridimensionare la finestra creata dalla classe Panel in modo inte-<br />
rattivo cliccando sull’apposito talloncino in basso a destra e, cliccando sulla<br />
“barra del titolo” e trascinando il mouse, di spostare la finestra nella posizione<br />
desiderata come si è soliti fare in ambiente Desktop. Durante l’operazione di<br />
trascinamento della finestra il puntatore del mouse assume la caratteristica<br />
forma a croce. Il widget Panel è presente nel tool visuale di disegno di Flex<br />
pertanto anche AdvancedPanel, essendo un suo derivato, è stato presente<br />
in tale tool. Ora il programmatore in fase di sviluppo può aggiungere ta-<br />
le widget nell’interfaccia semplicemente trascinandolo e posizionandolo nella<br />
finestra di disegno dell’applicazione.<br />
La seconda classe è contenuta nel file “tentWrapper.as”. La libreria di<br />
Flex fornisce dei meccanismi per mostrare o nascondere i widget dell’interfac-<br />
cia con degli effetti vari. Quando l’utente seleziona una sfera per modificarne<br />
i parametri, si apre, con un effetto a tendina, un riquadro apposito contente<br />
i parametri stessi e i widget necessari per poterli modificare. L’obiettivo era<br />
quello di ottenere che, quando l’utente seleziona una nuova sfera per modifi-<br />
carne i parametri, il riquadro si chiudesse con un nuovo effetto a tendina e si<br />
riaprisse visualizzando i parametri della nuova sfera. Siccome l’effetto a ten-<br />
dina che chiude il riquadro dura una certa frazione di tempo, le istruzioni che<br />
aggiornano i dati del riquadro non possono essere eseguite immediatamente<br />
dopo l’istruzione che avvia l’effetto di chiusura, ma l’aggiornamento dei dati<br />
deve avvenire solamente a riquadro chiuso perchè altrimenti si scorgerebbero<br />
i dati della nuova sfera prima della completa chiusura dello stesso. Creato<br />
un oggetto tentWrapper si assegna alla proprietà visualElement di questo un<br />
qualsiasi widget dell’interfaccia e alla proprietà toDo un oggetto funzione,<br />
cioè un puntatore ad una funzione che svolge le attività di aggiornamento<br />
dei dati o qualsiasi altra cosa l’utente desideri succeda in mezzo ai due ef-<br />
fetti. Il codice creato, provvede in modo trasparente ad eseguire la funzione<br />
referenziata da toDo solamente quando finisce il primo effetto e ad iniziare il
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 45<br />
secondo alla fine delle operazioni di tale funzione. La classe fornisce i metodi<br />
show, close dal significato autoesplicativo e update che è una combinazione<br />
dei due. Anche gli effetti possono essere personalizzati e i metodi della classe<br />
possono essere applicati ad ogni oggetto UIComponent cioè ad ogni widget<br />
dell’interfaccia.<br />
4.4 Applicazioni possibili<br />
Dopo un’indagine sui principali motori di ricerca l’autore è riuscito a tro-<br />
vare solamente una piccola applicazione simile a questa 3 che, pur sfruttando<br />
il motore 3D di Microsoft Silverlight 4 , non appare molto fluida (15-16 frame<br />
per secondo mentre il simulatore qui descritto non presenta nessun problema<br />
a 30 o più fps a parità di macchina) a testimonianza di quanto sia ostico<br />
portare nelle pagine web contenuti 3D.<br />
Le limitazioni del nostro simulatore sono le stesse di altre simulazioni<br />
(2D) esistenti: solamente due sfere possono scontrarsi allo stesso tempo e se<br />
lo scontro avviene simultaneamente fra tre o più sfere il codice lo considera<br />
come due o più collisioni tra due sfere; inoltre il rilevamento del momento<br />
esatto degli urti non è precisissimo, basandosi unicamente sulla verifica della<br />
distanza tra i centri di due sfere. Tali semplificazioni sono però usuali anche<br />
in software che vengono utilizzati a scopo di simulazione in ambito univer-<br />
sitario e non per illustrare le possibilità di una tecnologia RIA come può<br />
essere la nostra applicazione. Ad esempio la facoltà di scienze atmosferiche<br />
dell’università dell’Illinois usa un modello fisico analogo per una serie di pro-<br />
grammi Java utili allo studio di comportamenti atmosferici dove gli scontri<br />
fra particelle giocano un ruolo importante. 5<br />
In effetti la principale applicazione di un software simile è quello di illustrare<br />
concetti fisici.<br />
I comandi dell’interfaccia permettono di selezionare il numero di sfere e<br />
3 http://bubblemark.com/3d/silverlight1.1.htm<br />
4 SilverLight è una tecnologia progettata per lo sviluppo di RIA. È molto simile a Flex<br />
nelle intenzioni ed è un diretto concorrente di Adobe in questo senso<br />
5 vedi http://www.atmos.uiuc.edu/courses/atmos100/userdocs/3Dcollisions.<br />
html per una descrizione del modello fisico e http://www.atmos.uiuc.edu/courses/<br />
atmos100/all_programs.html per una lista di applicativi in cui è utilizzato tale modello
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 46<br />
di cambiarne i parametri di dimensione e massa. Se l’utente seleziona una<br />
singola sfera e ne riduce al minimo la massa, può osservare che, ad ogni scon-<br />
tro con le altre, la sua velocità aumenta di molto; se poi reimposta la massa<br />
al valore di partenza avrà aumentato la quantità di moto del sistema e potrà<br />
verificarne visivamente l’effetto complessivo. La possibilità di modificare la<br />
dimensione delle sfere e la loro massa può introdurre il concetto di densità di<br />
un corpo. Similmente si potrebbero implementare comandi per gestire forze<br />
esterne o urti anelastici.<br />
In ambito informatico, tale applicazione è stata utilizzata per dimostrare<br />
la velocità di calcolo che l’applicazione RIA, sviluppata in Flex, con il motore<br />
Flash Player, è in grado di realizzare su qualsiasi browser, anche su PC di<br />
potenza non elevata.<br />
4.5 Il modello di gestione degli eventi<br />
Il sistema di gestione degli eventi di Flex permette al programmatore<br />
di far reagire l’applicazione agli input che l’utente invia ad essa attraverso<br />
l’interfaccia grafica. Il modello, che aderisce ad uno standard de facto 6 , è<br />
per lo più analogo a quello di altre tecnologie orientate alla programmazione<br />
web. Rimandando alla documentazione ufficiale per una trattazione detta-<br />
gliata, vediamo i principi base di tale modello. Con il termine “evento” si<br />
intende il verificarsi di una qualsiasi delle possibili interazioni tra l’utente ed<br />
uno dei widget dell’applicazione. Si vuole che una certa porzione di codice<br />
venga eseguita automaticamente a seguito dell’evento. Vediamo le operazio-<br />
ni necessarie prendendo come widget di esempio un “NumericStepper”, un<br />
elemento della GUI che permette di specificare un valore numerico da un<br />
insieme ordinato mediante inserimento diretto, cioè cliccando col mouse sul<br />
campo contenente il numero e editandolo con la tastiera, o mediante due<br />
pulsantini laterali (vedi Figura 4.5). Vediamo e commentiamo un esempio<br />
minimale:<br />
myNumericStepper.addEventListener...<br />
...(NumericStepperEvent.CHANGE,listeningFunction);<br />
6 Document Object Model (DOM) Level 3 Events Specification
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 47<br />
.........<br />
Figura 4.5: Un NumericStepper<br />
public function listeningFunction(event:NumericStepperEvent):void{<br />
}<br />
trace("Il valore scelto è: "+ event.value);<br />
L’istanza della classe NumericStepper è rappresentata dalla variabile di no-<br />
me “myNumericStepper”. Si deve chiamare, tramite myNumericStepper, il<br />
metodo “addEventListener” che permette di specificare una funzione che<br />
verrà automaticamente eseguita al verificarsi dell’evento. Questo metodo<br />
richiede pertanto due parametri. Il primo è il tipo di evento per cui de-<br />
sideriamo una risposta da parte dell’applicazione e che, nel nostro caso, è<br />
“NumericStepperEvent.CHANGE”. Questo parametro è una stringa costan-<br />
te, ogni classe rappresentante gli eventi di un widget definisce una di queste<br />
stringhe per ogni tipo di evento. Il secondo parametro è il riferimento alla<br />
funzione (“Listener”) che deve essere eseguita come risposta all’interazione<br />
dell’utente con il NumericStepper. Quando l’utente cambia il valore del Nu-<br />
mericStepper, Flex confeziona un oggetto “NumericStepperEvent”, contenen-<br />
te numerose informazioni sull’evento stesso, e lo invia come parametro alla<br />
funzione listener. La firma della funzione listener, public function listening-<br />
Function(event:NumericStepperEvent):void, deve dichiarare come parametro<br />
proprio l’oggetto NumericStepperEvent che Flex gli passerà in automatico.<br />
Il corpo della nostra funzione listener, listeningFunction, scrive il valore in-<br />
dicato nel NumericStepper a dimostrazione che l’oggetto “event” contiene<br />
le informazioni dell’evento. Nel nostro caso l’unica informazione rilevante<br />
dell’evento è proprio il valore contenuto nel widget.<br />
Una caratteristica importante degli eventi è il cosiddetto “flusso degli<br />
eventi”. Ipotizziamo una situazione in cui un widget è contenuto in un
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 48<br />
pannello. Il pannello a sua volta è contenuto nello “Stage”, oggetto che<br />
rappresenta l’area principale di ogni applicazione Flex, cioè il contenitore di<br />
tutti i componenti dell’interfaccia. Quando si verifica un evento a livello del<br />
widget (ad esempio un click del mouse), il Flash Player genera un oggetto<br />
che lo rappresenta, e fa compiere a tale oggetto un percorso che parte dallo<br />
Stage, giunge fino al widget e ritorna allo Stage. Il tragitto dallo Stage<br />
al widget viene chiamato “fase di cattura”, quando l’evento è al livello del<br />
widget siamo invece nella “fase di target”, infine il viaggio di ritorno verso lo<br />
Stage è la “fase di bubbling”<br />
Stage<br />
Panel<br />
Widget<br />
Figura 4.6: Flusso degli eventi<br />
Non tutti gli eventi partecipano a tutte e tre le fasi del tragitto, inoltre,<br />
di default, i widget dell’interfaccia non possono “ascoltare” un evento nella<br />
sua fase di cattura a meno che non siano stati esplicitamente impostati per<br />
questo.<br />
Nel prossimo paragrafo vedremo un esempio in cui questa caratteristica<br />
viene messa in risalto.<br />
4.6 Analisi del codice<br />
Nella sezione 4.3 abbiamo presentato la AdvancedPanel, che fornisce un<br />
pannello spostabile e ridimensionabile. Vediamone il codice:
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 49<br />
package MyLibrary{<br />
import flash.display.DisplayObjectContainer;<br />
import flash.events.MouseEvent;<br />
import flash.geom.Point;<br />
import mx.containers.Panel;<br />
import mx.events.FlexEvent;<br />
import mx.managers.CursorManager;<br />
public class AdvancedPanel extends Panel{<br />
public function AdvancedPanel(){<br />
super();<br />
addEventListener(FlexEvent.CREATION_COMPLETE, init);<br />
}<br />
private function init(event:FlexEvent):void {<br />
Container= parent as DisplayObjectContainer;<br />
addEventListener(MouseEvent.MOUSE_DOWN, checkResize);<br />
addEventListener(MouseEvent.MOUSE_DOWN, thisOverAll);<br />
titleBar.addEventListener(MouseEvent.MOUSE_DOWN, startMove);<br />
titleBar.addEventListener(MouseEvent.MOUSE_UP, resetCursor);<br />
titleBar.addEventListener(MouseEvent.MOUSE_OUT, manageMouseOut);<br />
titleBar.addEventListener(MouseEvent.MOUSE_MOVE, manageMouseOut);<br />
}<br />
private function manageMouseOut(event:MouseEvent):void{<br />
if(!event.buttonDown)<br />
resetCursor();<br />
}<br />
public function resetCursor(event:MouseEvent=null):void{<br />
CursorManager.removeCursor(cursorID);<br />
}<br />
public function startMove(event:MouseEvent):void{<br />
oldMouseX=event.stageX;<br />
oldMouseY=event.stageY;<br />
cursorID = CursorManager.setCursor(moveCursorSymbol);<br />
Container.addEventListener(MouseEvent.MOUSE_MOVE, doMove);<br />
}
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 50<br />
public function doMove(event:MouseEvent):void{<br />
var newMouseX:Number;<br />
var newMouseY:Number;<br />
newMouseX=event.stageX;<br />
newMouseY=event.stageY;<br />
if(event.buttonDown ){<br />
x+=newMouseX-oldMouseX;<br />
y+=newMouseY-oldMouseY;<br />
oldMouseX=newMouseX;<br />
oldMouseY=newMouseY;<br />
}<br />
else Container.removeEventListener(MouseEvent.MOUSE_MOVE, doMove);<br />
}<br />
public function checkResize(event:MouseEvent):void{<br />
if(event.target!= this)<br />
return;<br />
if( event.localX > width-8 && event.localY > height-8)<br />
this.stage.addEventListener(MouseEvent.MOUSE_MOVE,doResize);<br />
}<br />
public function doResize(event:MouseEvent):void{<br />
var globalCoord:Point=this.localToGlobal(new Point(0,0));<br />
var newWidth:Number=event.stageX-globalCoord.x;<br />
var newHeight:Number=event.stageY-globalCoord.y;<br />
if(event.buttonDown ){<br />
if ((width>minWidth || newWidth>width) && newWidth>minWidth)<br />
width=newWidth;<br />
if ((height>minHeight || newHeight>height) && newHeight>minHeight)<br />
height=newHeight;<br />
}<br />
else<br />
this.stage.removeEventListener(MouseEvent.MOUSE_MOVE,doResize);<br />
}
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 51<br />
private function thisOverAll(event:MouseEvent):void{<br />
Container.setChildIndex(this,Container.numChildren-1);<br />
}<br />
public function draw():void{<br />
graphics.clear();<br />
graphics.lineStyle(2);<br />
graphics.moveTo(width - 6, height - 1)<br />
graphics.curveTo(width - 3, height - 3, width - 1, height - 6);<br />
graphics.moveTo(width - 6, height - 4)<br />
graphics.curveTo(width - 5, height - 5, width - 4, height - 6);<br />
}<br />
protected override function updateDisplayList(...<br />
...unscaledWidth: Number, unscaledHeight:Number):void {<br />
super.updateDisplayList(unscaledWidth, unscaledHeight);<br />
draw();<br />
}<br />
private var Container:DisplayObjectContainer;<br />
private var oldMouseX:Number;<br />
private var oldMouseY:Number;<br />
private var cursorID:Number = 0;<br />
[Embed(source="/assets/move.png")]<br />
}<br />
}<br />
private var moveCursorSymbol:Class;<br />
Commentiamone i metodi più significativi.<br />
Il costruttore “AdvancedPanel” chiama il costruttore della superclasse e<br />
fa in modo che si avvi la funzione “init” solamente quando il Flash Player ha<br />
completato le operazioni di inizializzazione interne al componente. Il meto-<br />
do “init” memorizza il contenitore del nostro AdvancedPanel nella variabile<br />
Container, la proprietà “parent” è impostata correttamente proprio perché<br />
la funzione “init” si avvia quando Flash Player ha terminato alcune opera-<br />
zioni di start-up del componente. Successivamente vengono registrate alcune<br />
funzioni come Listener di quegli eventi del mouse che servono a spostare il
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 52<br />
pannello e a ridimensionarlo.<br />
Cominciamo col vedere i metodi preposti allo spostamento del pannello.<br />
Il metodo “startMove”, che viene chiamato quando l’utente clicca la barra del<br />
titolo del pannello per spostarlo, registra le coordinate del medesimo al mo-<br />
mento del click e comincia ad ascoltare l’eventuale movimento del mouse per<br />
l’operazione di trascinamento vera e propria. Il metodo “doMove” si occupa<br />
di muovere effettivamente il pannello. Per prima cosa registra le coordinate<br />
del mouse, successivamente controlla se l’utente sta ancora tenendo premu-<br />
to il pulsante del mouse oppure se l’ha rilasciato. Nel primo caso muove<br />
effettivamente il pannello decidendo la direzione di movimento in base alla<br />
differenza tra le coordinate del mouse al momento del click sulla barra del<br />
titolo e quelle attuali. Nel secondo caso smette di registrare i movimenti del<br />
mouse perché si è conclusa l’operazione di trascinamento.<br />
Vediamo ora i metodi che permettono il ridimensionamento del pannello.<br />
“checkResize” è il Listener che risponde ai click dell’utente sul pannello. Se<br />
il click è avvenuto sull’angolo in basso a destra il codice imposta un nuovo<br />
Listener, “doResize”, per registrare i movimenti del mouse e ridimensiona-<br />
re il pannello, se il click è avvenuto in un’altra zona non effettua nessuna<br />
operazione. Si noti l’istruzione<br />
if(event.target!= this)<br />
return;<br />
all’inizio del metodo. Ipotizziamo che all’interno del pannello sia posizionato<br />
un widget. Un eventuale click sul widget fa sì che il Flash Player chiami il<br />
metodo “checkResize” quando l’evento è in fase di bubbling. Le istruzioni<br />
appena viste controllano che il click sia stato fatto proprio sul pannello e<br />
non su uno dei widget contenuti all’interno di questo. Se il click è stato fatto<br />
su un widget interno al pannello la funzione termina. Questo controllo è<br />
necessario perché se l’evento viene raccolto in fase di bubbling dal pannello,<br />
le informazioni sulle coordinate del punto su cui si è fatto click sono rela-<br />
tive al widget e non al pannello, provocando ovvi problemi nelle operazioni<br />
successive. Il metodo “doResize” ridimensiona la finestra facendo attenzione<br />
che questa non diventi più piccola delle dimensioni minime impostate.
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 53<br />
Concludiamo il paragrafo presentando il segmento di codice responsabile<br />
della computazione dei nuovi vettori delle velocità di due sfere in seguito ad<br />
un urto. Si può notare come le istruzioni seguano passo passo il modello<br />
presentato nel paragrafo 4.2:<br />
// versore ortogonale al piano di collisione<br />
var versore:Object=new Object;<br />
versore.x=ball2.px-px;<br />
versore.y=ball2.py-py;<br />
versore.z=ball2.pz-pz;<br />
//la norma per ottenere il versore<br />
var norma:Number=Math.sqrt(versore.x*versore.x+<br />
+versore.y*versore.y+versore.z*versore.z);<br />
// normalizzo versore<br />
versore.x=versore.x/norma;<br />
versore.y=versore.y/norma;<br />
versore.z=versore.z/norma;<br />
// componente ortogonale di v1<br />
var v1n:Number=(vx*versore.x+vy*versore.y+vz*versore.z);<br />
// vettore ortogonale di v1<br />
var vett1n:Object=new Object;<br />
// calcolo vettore ortogonale di v1<br />
vett1n.x=v1n*versore.x;<br />
vett1n.y=v1n*versore.y;<br />
vett1n.z=v1n*versore.z;<br />
// vettore parallelo di v1<br />
var vett1p:Object={x:vx-vett1n.x,y:vy-vett1n.y,z:vz-vett1n.z};<br />
// componente ortogonale di v2<br />
var v2n:Number=(ball2.vx*versore.x+ball2.vy*versore.y+ball2.vz*versore.z);<br />
// vettore ortogonale di v2<br />
var vett2n:Object=new Object;<br />
// calcolo vettore ortogonale di v2<br />
vett2n.x=v2n*versore.x;<br />
vett2n.y=v2n*versore.y;
CAPITOLO 4. SIMULATORE 3D <strong>DI</strong> URTI ELASTICI 54<br />
vett2n.z=v2n*versore.z;<br />
// vettore parallelo di v2<br />
var vett2p:Object=...<br />
...{x:ball2.vx-vett2n.x,y:ball2.vy-vett2n.y,z:ball2.vz-vett2n.z};<br />
// nuova componente ortogonale di v1<br />
var v1nfin:Number=...<br />
...(v1n*(mass-ball2.mass)+2*ball2.mass*v2n)/(mass+ball2.mass);<br />
// nuova componente ortogonale di v2<br />
var v2nfin:Number=(v2n*(ball2.mass-mass)+2*mass*v1n)/(mass+ball2.mass);<br />
// nuovo vettore ortogonale di v1<br />
var vett1nfin:Object=...<br />
...{x:v1nfin*versore.x,y:v1nfin*versore.y,z:v1nfin*versore.z};<br />
// nuovo vettore ortogonale di v2<br />
var vett2nfin:Object=...<br />
...{x:v2nfin*versore.x,y:v2nfin*versore.y,z:v2nfin*versore.z};<br />
// nuove velocità per questa sfera<br />
vx=vett1p.x+vett1nfin.x;<br />
vy=vett1p.y+vett1nfin.y;<br />
vz=vett1p.z+vett1nfin.z;<br />
// nuove velocità per ball2<br />
ball2.vx=vett2p.x+vett2nfin.x;<br />
ball2.vy=vett2p.y+vett2nfin.y;<br />
ball2.vz=vett2p.z+vett2nfin.z;
Capitolo 5<br />
Disegno di curve<br />
5.1 Introduzione<br />
Questo programma permette il disegno di segmenti di linea retta e di<br />
forme chiuse delimitate da linee miste. L’idea chiave dell’applicazione è<br />
quella di poter disegnare linee miste chiuse semplicemente posizionando sul<br />
monitor dei punti di controllo. Ricordato che una linea mista è una linea in<br />
parte spezzata e in parte curva, i punti di controllo corrispondenti alla parte<br />
spezzata della linea coincidono con i vertici dei relativi segmenti mentre i<br />
punti di controllo corrispondenti alla parte curva della linea sono i punti di<br />
controllo di una curva B-Spline. In Figura 5.1 vediamo un esempio. I punti<br />
P1, P6, P8, P10 separano un tratto curvo da un tratto di linea spezzata, il<br />
punto P7 è semplicemente un punto interno di una parte spezzata, i punti<br />
da P1 a P6 sono i punti di controllo di una curva B-Spline come lo sono i<br />
punti P8, P9, P10.<br />
Chiamiamo duri quei punti di controllo che sono vertici di un segmento<br />
di una parte spezzata della linea e morbidi i punti di controllo delle B-Spline<br />
che disegnano le parti curve.<br />
I tratti curvilinei possono avere un numero qualsiasi di punti di control-<br />
lo e l’utente può modellare la curva semplicemente spostandoli col mouse.<br />
Questo rappresenta un approccio diverso da quello di molti software per la<br />
creazione di illustrazioni basati sul disegno vettoriale come Adobe Illustrator<br />
55
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 56<br />
P₁<br />
P₂<br />
P₁₀<br />
P₃<br />
P₄ P₅<br />
Figura 5.1: Esempio di forma delimitata da linea mista chiusa<br />
o Corel Draw 1 , dove le linee curve sono aggiunte a schermo posizionando il<br />
primo e ultimo punto di controllo di una curva di Bezier e impostando la<br />
direzione tangente in corrispondenza di questi due punti (vedi [18]). Inoltre,<br />
sempre nella tipologia di software sopra citata, per creare curve composte,<br />
è necessario collegare manualmente curve singole, e per ottenere una cer-<br />
ta regolarità, impostare, sempre manualmente, le direzioni tangenti di ogni<br />
sottocurva.<br />
5.2 Funzionamento<br />
P₈<br />
L’applicazione presenta due pannelli, il primo di questi contiene i vari<br />
tool di disegno mentre il secondo contiene la “tela” su cui si aggiungeran-<br />
no le linee e le forme volute. Entrambi i pannelli appartengono alla classe<br />
AdvancedPanel (vedi paragrafo 4.3) pertanto sono trascinabili col mouse e<br />
ridimensionabili.<br />
Il pannello dei comandi contiene i seguenti controlli:<br />
• Bottone “Draw lines”, per disegnare linee<br />
1 Si intendono quei software rivolti a grafici per illustrazioni artistiche, e non pacchetti<br />
rivolti alla progettazione industriale o software CAD<br />
P₉<br />
P₆<br />
P₇
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 57<br />
Figura 5.2: Screenshot dell’applicazione<br />
• Bottone “Draw polygons”, per disegnare poligoni<br />
• Bottone “Select objects”, per selezionare e spostare oggetti all’interno<br />
dell’area di disegno.<br />
• Bottone “Select ctrl points”, per selezionare i punti di controllo di linee<br />
e forme e spostarli all’interno dell’area di disegno.<br />
• Bottone “Soften edges”, con cui è possibile cliccare su un punto di<br />
controllo per renderlo morbido o, se già lo fosse, duro. (punti rispetti-<br />
vamente di colore verde e blu in Figura 5.1).<br />
• Due ColorPicker, con cui è possibile selezionare il colore delle linee o<br />
del bordo e del riempimento delle forme.<br />
• Un ComboBox, mediante il quale si può cambiare lo spessore di una<br />
linea o del bordo di una forma.<br />
• Due NumericStepper, tramite cui è possibile scalare gli oggetti sullo<br />
schermo.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 58<br />
Figura 5.3: Pannello con gli strumenti per disegnare
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 59<br />
È possibile selezionare un solo bottone per volta.<br />
Si possono disegnare linee e poligoni selezionando i rispettivi tool, ognuno<br />
col proprio pulsante. Per disegnare una linea è sufficiente cliccare due volte<br />
nell’area di disegno per impostare la posizione dei due vertici del segmento.<br />
Per disegnare un poligono, si deve cliccare sull’area almeno tre volte per<br />
ottenere un triangolo, ad ogni ulteriore click si ottiene un poligono con un<br />
lato in più. Per terminare il disegno del poligono si preme il tasto Esc. Il tasto<br />
Esc può essere premuto anche quando si è impostato solamente il primo punto<br />
di un segmento o non si è ancora cliccato per la terza volta per ottenere un<br />
triangolo, abbandonando così l’operazione e potendo ricominciare da capo.<br />
Per spostare i punti di controllo di un oggetto, per cambiare la “morbi-<br />
dezza” di un punto o ancora per scalare o cambiare i colori di un oggetto<br />
è necessario prima selezionare l’oggetto desiderato con l’apposito tool. Per<br />
selezionare un oggetto si clicca sul bottone “Select objects” e successivamen-<br />
te sull’oggetto di interesse. L’oggetto verrà contornato da una cornice rossa<br />
che ne indica lo stato di selezione e si porrà automaticamente in primo piano<br />
sovrapponendosi agli altri oggetti.<br />
In fondo al pannello contenente il disegno vero e proprio è presente un<br />
check box che, quando spuntato, crea degli effetti di colori e di trasparenze<br />
tra gli eventuali oggetti sovrapposti sull’area di disegno. Inoltre, sempre in<br />
fondo al pannello, è presente il bottone di stampa.<br />
5.3 Modello matematico<br />
Le sezioni curvilinee delle forme chiuse sono rappresentate da curve B-<br />
Spline. Ricordiamo che l’equazione di una curva B-Spline di ordine k 2 e<br />
punti di controllo {P0, . . . , Pn} è:<br />
n<br />
P(t) = Ni,k(t)Pi, tk−1 ≤ t ≤ tn+1<br />
i=0<br />
(5.1)<br />
dove la successione {tj} è una sequenza non decrescente di valori denominati<br />
nodi e le Ni,k(t) sono particolari funzioni di miscelamento, polinomiali a<br />
tratti di grado k − 1, dette “funzioni B-Spline”.<br />
2 L’ordine k di una curva B-Spline è uguale al grado della curva polinomiale a tratti<br />
più uno.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 60<br />
Le curve B-Spline utilizzate sono di tipo Open in modo che interpolino<br />
il primo e l’ultimo punto di controllo delle sezioni curvilinee di una forma,<br />
facendo sì che questa risulti chiusa (vedi [19]).<br />
Quando l’utente seleziona il tool “Soften edges”, può cliccare sui punti<br />
di controllo per ammorbidirli. Al primo punto cliccato ci troviamo nella<br />
situazione di Figura 5.4, otteniamo una curva di grado due 3 con tre punti di<br />
controllo 4 , indicati con P0, P1 e P2, di cui P0 e P2 sono considerati duri anche<br />
se sono rispettivamente il primo e l’ultimo punto di controllo della curva<br />
mentre il punto P1, quello su cui si è cliccato, diventa un punto morbido.<br />
Ora, se si clicca su P2, la curva guadagna un punto di controllo come si vede<br />
P₀<br />
P₁<br />
P₂<br />
Figura 5.4: I punti di controllo della curva sono tre. Il grado della curva è due.<br />
in Figura 5.5. La curva B-Spline così ottenuta cresce di grado e diventa una<br />
3 Grado due è il più alto possibile con tre soli punti di controllo<br />
4 In letteratura i punti di controllo vengono generalmente indicizzati a partire da zero.<br />
Si è qui mantenuta tale convenzione differentemente da quanto visto in Figura 5.1
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 61<br />
P₀<br />
P₁<br />
P₂<br />
P₃<br />
Figura 5.5: I punti di controllo della curva sono quattro. Il grado della curva è<br />
tre.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 62<br />
cubica 5 . Se si continua a cliccare sul primo o sull’ultimo punto di controllo<br />
di una curva si ottiene una nuova curva con un punto di controllo in più ma<br />
sempre di grado tre, che, pertanto, rappresenta il massimo grado previsto<br />
(vedi Figura 5.6).<br />
P₀<br />
P₄<br />
P₁<br />
P₂<br />
P₃<br />
Figura 5.6: I punti di controllo della curva sono cinque. La curva rimane sempre<br />
cubica.<br />
Vediamo come è definita la sequenza dei nodi, necessaria per la costru-<br />
zione di una curva B-Spline, nel caso specifico di questa applicazione. Dati<br />
i punti di controllo {P0, P1, . . . , Pn} e l’ordine k della curva, la sequenza dei<br />
nodi T = {ti} n+k<br />
i=0<br />
è costruita secondo questi accorgimenti:<br />
1. la sequenza è non decrescente 6<br />
2. il valore più piccolo è assunto uguale a zero<br />
3. la sequenza è composta da n + k + 1 elementi<br />
5 Grado tre è il più alto possibile con quattro punti di controllo<br />
6 Proprietà comune ad ogni tipo di curva B-Spline
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 63<br />
4. k vale tre se n = 2 o quattro se n ≥ 3<br />
5. i valori costituiscono una parametrizzazione sugli interi, ossia sono<br />
maggiori di una unità rispetto al precedente tranne il primo (zero)<br />
e ultimo valore che sono ripetuti k volte 7<br />
Ricapitoliamo. Al primo punto reso morbido, indicati con P0, P1 e P2 i punti<br />
di controllo, la curva avrà grado due e sequenza dei nodi T = {0, 0, 0, 1, 1, 1}.<br />
Se aggiungo un punto di controllo allo stesso segmento curvo, come detto<br />
precedentemente, la curva diventa cubica, cioè di grado tre, con sequenza<br />
dei nodi T = {0, 0, 0, 0, 1, 1, 1, 1}. Se si continua a cliccare sul punto iniziale<br />
o finale di una curva, aumentandone così il numero di punti di controllo, il<br />
grado rimane tre ma la sequenza dei nodi varia in questo modo:<br />
⎧<br />
5 punti di controllo, n = 4, k = 4 −→ T = {0, 0, 0, 0, 1, 2, 2, 2, 2}<br />
⎪⎨<br />
⎪⎩<br />
6 punti di controllo, n = 5, k = 4 −→ T = {0, 0, 0, 0, 1, 2, 3, 3, 3, 3}<br />
7 punti di controllo, n = 6, k = 4 −→ T = {0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4}<br />
8 punti di controllo, n = 7, k = 4 −→ T = {0, 0, 0, 0, 1, 2, 3, 4, 5, 5, 5, 5}<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
Inizialmente si erano scelte le curve di Bezier per disegnare i contorni delle<br />
forme. Purtroppo questa scelta presentava parecchi svantaggi. Col crescere<br />
dei punti di controllo, infatti, cresce anche il grado della curva polinomiale.<br />
Ciò comporta un pesante rallentamento in tutte quelle operazioni in cui<br />
la curva deve essere ridisegnata di continuo ed in tempo reale, ad esempio<br />
quando si spostano i punti di controllo della medesima con l’apposito tool.<br />
L’utilizzo di curve di Bezier composte risolve il problema del grado alto ma,<br />
per ottenere una certa regolarità della curva, si richiede, da parte dell’utente<br />
o di una procedura automatica, di posizionare con un certo criterio i punti<br />
di controllo sacrificando di molto la flessibilità.<br />
5.4 Applicazioni possibili<br />
Le curve B-Spline sono più intuitive e più facili da controllare, mediante<br />
il posizionamento dei punti di controllo, rispetto alle curve di Bezier. Nono-<br />
stante ciò sono raramente implementate nei programmi di grafica 2D, mentre<br />
7 Il primo e ultimo valore ripetuti k volte caratterizzano le B-Spline di tipo Open
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 64<br />
sono uno standard nella grafica tridimensionale (vedi [18]). La scelta delle<br />
B-Spline per la nostra applicazione, permette di avere curve cubiche indi-<br />
pendentemente dal numero di punti di controllo; ciò permette un compor-<br />
tamento uniforme da parte di ogni sezione curvilinea delle forme disegnate<br />
sullo schermo. Inoltre l’utente non deve preoccuparsi di collegare più sezioni<br />
di curve composte per ottenere una certa regolarità della curva, problema<br />
che si presenterebbe con le curve di Bezier.<br />
Questo approccio fa sì che il nostro applicativo, magari con l’implemen-<br />
tazione di qualche altra funzionalità 8 , rappresenti un valido tool di disegno<br />
per bambini magari da aggiungere come gadget all’interno di siti web per<br />
l’infanzia.<br />
Vedremo nel paragrafo 5.5.2 come questa applicazione sia stata progetta-<br />
ta in modo che fosse facile integrare le operazioni di disegno in altri software.<br />
Si potrebbe pertanto utilizzare la funzionalità di disegnare forme chiuse mi-<br />
ste del nostro programma, per aggiungere ad un software di fotoritocco uno<br />
strumento intuitivo e versatile per scontornare immagini. Ad esempio, l’u-<br />
tente potrebbe disegnare una forma che ricopra la parte dell’immagine che<br />
si vuole mantenere e premere un bottone che cancelli il resto. Siccome le<br />
curve B-Spline permettono di avere molti punti di controllo senza appesan-<br />
tire l’applicazione, l’utente può posizionare, in fase di creazione del poligono<br />
iniziale, molti punti di controllo sul contorno desiderato in modo che questi<br />
siano relativamente vicini l’uno all’altro. Dopo di che può ammorbidire i<br />
punti di interesse per quelle parti dell’immagine che sono curvilinee. Data<br />
la vicinanza dei punti di controllo le curve sembreranno interpolare i punti<br />
stessi consentendo di scontornare l’immagine con precisione.<br />
5.5 Struttura del codice<br />
5.5.1 Classi astratte e polimorfismo<br />
Nell’Appendice A si illustrano i fondamenti del paradigma della program-<br />
mazione ad oggetti. Approfondiamo qui l’aspetto del polimorfismo, introdu-<br />
8 Possibilità di disegnare primitive (cerchi, quadrati...), di cancellare oggetti etc.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 65<br />
cendo il concetto delle classi astratte e dei metodi virtuali perché il codice<br />
dell’applicazione fruisce di queste caratteristiche.<br />
Nell’architettura di un programma possono esistere classi che rappresen-<br />
tano entità aventi un comportamento simile. In letteratura è tipico l’esempio<br />
di classi che rappresentano alcuni tipi di animali. Si avranno pertanto la clas-<br />
se “Cane”, “Gatto”, “Lupo” ecc.. Ognuna di queste classi, ad esempio, avrà<br />
il metodo “emetti_verso” che stamperà a video le onomatopee dei versi dei<br />
vari animali. Sempre nell’esempio classico tutte queste classi condivideranno<br />
la stessa superclasse che chiameremo “Animale”. Per sfruttare il concetto di<br />
polimorfismo dobbiamo definire un metodo “emetti_verso” anche in questa<br />
classe. In questo modo, se definiamo una variabile di tipo “Animale” ed<br />
assegnamo a questa il riferimento ad una istanza di una delle classi rappre-<br />
sentanti un animale, possiamo chiamare il metodo “emetti_verso” attraverso<br />
questa variabile ed ottenere la stampa del verso corrispondente all’istanza.<br />
Vediamo un esempio in pseudo-codice:<br />
\\ creo una variabile di tipo Animale<br />
\\ e assegno a questa il riferimento ad un oggetto di tipo Cane<br />
var myPet:Animale=new Cane;<br />
\\ chiamo il metodo emetti_verso tramite la variabile myPet<br />
myPet.emetti_verso();<br />
\\ Stampa a video:<br />
\\ "Bau Bau"<br />
Come possiamo implementare le istruzioni del corpo del metodo “emet-<br />
ti_verso” all’interno della classe “Animale”? Questa classe è talmente gene-<br />
rale per quel che riguarda il metodo in questione, che non ha semplicemente<br />
senso scrivere delle istruzioni all’interno del metodo. L’unica cosa importan-<br />
te è che si possa invocare il metodo “emetti_verso” attraverso una variabile<br />
di tipo “Animale” in modo che tutte le istanze delle varie sottoclassi abbiano<br />
una interfaccia comune. Ovviamente le sottoclassi “Cane”, “Gatto”, “Lupo”<br />
devono fare l’“override” di questo metodo implementando le istruzioni per<br />
la stampa a video del verso corretto. In gergo informatico il metodo “emet-
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 66<br />
ti_verso”, a livello della classe “Animale”, viene chiamato metodo virtuale.<br />
Le classi aventi metodi virtuali vengono indicate come classi astratte.<br />
In ActionScript è sufficiente non includere alcuna istruzione nel corpo<br />
del metodo “emetti_verso” a livello della classe “Animale”, è necessario co-<br />
munque lasciare le due parentesi graffe che delimitano il blocco di istruzioni<br />
(vuoto) del metodo. Il metodo deve essere invece contrassegnato con la<br />
parola chiave override nelle varie sottoclassi.<br />
ActionScript ha qualche forma di controllo in meno e qualche limitazione<br />
rispetto a linguaggi come Java e C++, vediamo in che senso. Se avessimo<br />
programmato la classe “Animale” in Java avremmo dovuto dichiarare i me-<br />
todi senza corpo con la parola chiave “abstract” togliendo del tutto il corpo<br />
della funzione cioè anche le due parentesi graffe prive di codice al loro in-<br />
terno, allo stesso modo avremmo dovuto dichiarare abstract anche l’intera<br />
classe. Inoltre il compilatore Java non permetterebbe la creazione diretta<br />
di oggetti “Animale”, cosa questa che porta maggiore chiarezza all’interno di<br />
software molto complessi.<br />
In ActionScript se un metodo di una classe derivata ha lo stesso nome di<br />
un metodo della superclasse deve essere per forza contrassegnato con la pa-<br />
rola chiave override ed è pertanto soggetto al meccanismo del polimorfismo.<br />
C++ è più flessibile: senza scendere nei particolari diciamo solamente che<br />
un metodo è polimorfico solamente se è contrassegnato con la parola chiave<br />
“virtual” nella classe base, altrimenti una classe derivata può implementare<br />
un metodo con lo stesso nome ma questo si comporterà semplicemente come<br />
un altro metodo e non permetterà il meccanismo del polimorfismo.<br />
Il linguaggio C++ è molto apprezzato e versatile ma molti utenti non<br />
ne usano tutte le potenzialità perché portano facilmente a degli errori di<br />
programmazione, inoltre molti compilatori non sono del tutto compatibili<br />
con lo standard ANSI proprio per la grande complessità del linguaggio.<br />
Bisogna comunque dire che C++ e Java appartengono alla categoria dei<br />
cosiddetti linguaggi di “sistema”, cioè quei linguaggi nati per costruire ap-<br />
plicazioni molto grosse ed (eventualmente) “da zero”, cioè senza il supporto<br />
di framework esterni, al contrario dei linguaggi di “scripting” progettati per<br />
fare da collante fra diverse applicazioni o per far comunicare diversi tipi di<br />
tecnologie. I linguaggi appartenenti alla prima categoria sono generalmente
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 67<br />
più difficili da imparare, più verbosi e meno espressivi, ma obbligano a strut-<br />
turare di più e meglio il codice impedendo al medesimo di diventare troppo<br />
complesso da gestire. I linguaggi della seconda categoria sono caratterizzati<br />
da una ripida curva di apprendimento, sono molto versatili e permettono<br />
di condensare complesse operazioni in pochissime righe di codice, ma sono<br />
progettati per costruite macro funzionanti all’interno di altre applicazioni,<br />
per aiutare gli amministratori di sistemi nei compiti ripetitivi o ancora per<br />
far dialogare software diversi che magari utilizzano protocolli di comunica-<br />
zione incompatibili fra loro. Alcuni di questi sono Python, Perl, Tcl e Ruby.<br />
Secondo l’autore, ActionScript, a dispetto del nome, si colloca a metà strada<br />
tra queste due categorie.<br />
Vedremo, nei prossimi paragrafi, come sono strutturate le classi principali<br />
della nostra applicazione.<br />
5.5.2 Classe DrawingTarget<br />
La classe DrawingTarget funge da regista per ogni operazione di questa<br />
applicazione. Il codice si avvale delle facilitazioni della programmazione ad<br />
oggetti ma si è preferito mantenere la logica principale del codice raccolta in<br />
un blocco singolo per facilitare l’integrazione di questa limitata applicazione<br />
di disegno, in software di più ampio respiro. Nella classe DrawingTarget è<br />
presente la proprietà drawingArea di tipo UIComponent (vedi Appendice A)<br />
che contiene il riferimento al componente su cui l’utente andrà a disegnare.<br />
La scelta del tipo di drawingArea permette di poter includere le funzionalità<br />
di disegno su qualsiasi elemento visuale di Flex. Chiaramente tali funzioni<br />
possono essere utili all’interno di quei widget dotati di un’area predisposta a<br />
visualizzare un contenuto principale, tipo pannelli (classe Panel), tele (clas-<br />
se Canvas) o qualsiasi loro derivato come la nostra classe AdvancedPanel<br />
(vedi 4.3). Pertanto, aggiunti in un altro progetto i widget dell’interfaccia<br />
e i file della nostra applicazione, è sufficiente creare un’istanza della classe<br />
DrawingTarget e passare a tale oggetto il riferimento del componente su cui<br />
si vuole poter disegnare.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 68<br />
5.5.3 Classe DrawingObject<br />
La classe DrawingObject è la superclasse di tutte le classi rappresentanti<br />
quegli oggetti che possono essere disegnati sull’apposita area della nostra<br />
applicazione. Linee e poligoni, che nella versione attuale del software sono<br />
gli unici elementi a poter essere aggiunti sullo schermo, sono rappresentati<br />
dalle classi Line e Polygon che sono sottoclassi di DrawingObject. La classe<br />
DrawingObject, pertanto, fornisce un’interfaccia comune ad ogni elemento<br />
sull’area di disegno e può essere considerata come classe base per altri tipi<br />
di oggetti grafici in future implementazioni.<br />
Nella classe DrawingObject possiamo notare la dichiarazione di metodi<br />
il cui corpo non contiene istruzioni. Questi, come detto precedentemente,<br />
sono metodi virtuali. DrawingObject è, pertanto, una classe astratta.<br />
Il principale tra questi, il metodo draw, è quello preposto a disegnare<br />
l’oggetto sullo schermo. Le sottoclassi di DrawingObject, come vedremo,<br />
fanno l’ovverride di questo metodo implementando le operazioni di disegno<br />
vere e proprie, in particolare la classe Line provvede a disegnare una linea e<br />
la classe Polygon un poligono.<br />
Questa struttura semplifica la scrittura del codice. Ad esempio, duran-<br />
te l’esecuzione dell’applicazione, il software mantiene un’array contenente i<br />
riferimenti di tutti gli oggetti disegnati dall’utente. Questi riferimenti sono<br />
variabili di tipo DrawingObject a cui sono state assegnate degli oggetti Line<br />
o Polygon. Si possono chiamare quei metodi senza corpo della classe Dra-<br />
wingObject per tutti gli elementi dell’array e, grazie al polimorfismo, per<br />
ogni elemento verrà invocato il metodo corrispondente all’effettiva classe di<br />
appartenenza.<br />
La classe DrawingObject ha altri metodi senza corpo, virtuali, oltre a<br />
draw. calcBaricenter è preposto al calcolo delle coordinate del baricentro 9 .<br />
Siccome le classi Line e Polygon, come vedremo nel pargarfo 5.5.4, implemen-<br />
tano in modo diverso i punti di controllo, il metodo calcBaricenter non è in<br />
grado di calcolare il baricentro di tali punti a livello della classe DrawingOb-<br />
9 Inteso come “media” dei punti di controllo. L’uso del baricentro come punto rispetto a<br />
cui applicare trasformazioni affini quando non diversamente specificato dall’utente è una<br />
scelta seguita in applicativi simili a questo. Vedi http://www.disi.unige.it/person/<br />
MagilloP/GRAFICA04/sugger2D.html
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 69<br />
ject. Esso rimane quindi virtuale in tale contesto mentre nelle sottoclassi ne<br />
viene fatto l’override specificando nei rispettivi corpi le istruzioni specifiche.<br />
Quando l’utente attiva il tool di selezione, potrebbe avere delle difficoltà<br />
a muovere il mouse esattamente sopra una linea o una qualsiasi forma mol-<br />
to allungata avente uno spessore di pochi pixel. DrawingObject estende la<br />
classe Sprite, tale classe contiene una proprietà di nome hitArea, sempre di<br />
tipo Sprite, che funge da area sensibile agli eventi del mouse nel senso che se<br />
l’utente fa scorrere il mouse sopra tale sprite, viene generato un “messaggio”<br />
recepibile dall’oggetto che si vuole selezionare. Tale area, nel caso di una<br />
linea, sarà uguale alla linea stessa solamente di spessore tale da permetterne<br />
la selezione mentre, nel caso di una forma chiusa, avrà lo stessa forma del<br />
confine di questa ma, anche qui, con spessore maggiorato 10 . Il metodo add-<br />
SelectionHitArea si occupa di disegnare la hitArea. La hitArea deve essere<br />
disegnata per ogni tipo di oggetto, ma il modo con cui questo effettivamente<br />
avviene dipende dal tipo di oggetto, pertanto anche questo metodo rimane<br />
virtuale nella classe DrawingObject. Gli ultimi due metodi che permettono<br />
ad ogni elemento disegnabile di avere un’interfaccia comune ma di non poter<br />
essere implementati nella loro comune classe base sono: doScaling, che per-<br />
mette lo scaling dell’oggetto selezionato, rispetto al baricentro, mediante gli<br />
appositi widget dell’interfaccia e drawGrid, che disegna una cornice attorno<br />
all’oggetto selezionato.<br />
5.5.4 Le classi Line e Polygon<br />
Le classi Line e Polygon sono sottoclassi di DrawingObject.<br />
Queste due classi implementano in modo diverso i punti di controllo<br />
mediante i quali vengono disegnati i corrispondenti oggetti. La classe Li-<br />
ne, ovviamente, contiene delle proprietà con le coordinate dei due estremi<br />
del segmento. La classe Polygon. invece contiene un array con i punti di<br />
controllo della forma chiusa delimitata da una linea mista. Come detto pre-<br />
cedentemente questi punti possono essere morbidi o duri. Nell’esempio di<br />
10 Tale area sarà ovviamente invisibile perché si tratta solamente di un accorgimento<br />
tecnico
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 70<br />
Figura 5.1 i punti P1, P6, P7, P8 e P10 sono duri mentre i punti P2, P3, P4, P5<br />
e P9 sono morbidi.<br />
Queste due classi fanno l’override dei metodi virtuali di DrawingObject:<br />
draw, calcBaricenter, addSelectionHitArea, doScaling e drawGrid. Ad esem-<br />
pio, all’interno della classe Line, è finalmente possibile e sensato scrivere il<br />
corpo del metodo calcBaricenter proprio perché tale classe ha nozione delle<br />
coordinate degli estremi del segmento e, pertanto, è possibile calcolarne il<br />
baricentro come punto di mezzo.<br />
Il metodo draw della classe Line semplicemente disegna un segmento<br />
di linea in corrispondenza dei due estremi mentre il discorso per la classe<br />
Polygon è più complesso e viene descritto nella prossimo paragrafo.<br />
5.5.5 La classe BSpline<br />
Vediamo ora come è organizzato il codice responsabile del disegno dei<br />
tratti curvilinei delle nostre forme chiuse. La classe mediante la quale si ge-<br />
stiscono questi tratti è la classe BSpline. Questa è abbastanza specializzata,<br />
nel senso che è progettata per creare curve BSpline con tutte le caratteri-<br />
stiche viste nel paragrafo 5.3, ciononostante non prevede nessun metodo di<br />
disegno. Il disegno effettivo della curva è demandato a metodi esterni alla<br />
classe e, nel nostro caso, alla classe Polygon. Quando l’utente, dopo aver se-<br />
lezionato il tool “Soften edges”, clicca su un vertice di un oggetto Polygon per<br />
renderlo morbido viene invocato il metodo createBSplineObjects della classe<br />
Polygon che crea un oggetto BSpline per ogni tratto curvo della forma su<br />
cui si sta operando. Ad esempio se l’utente avesse appena cliccato sul punto<br />
P5 giungendo così alla situazione di Figura 5.1, il metodo createBSplineO-<br />
bjects avrebbe creato due oggetti BSpline e ne avrebbe salvato i riferimenti<br />
nell’array BSplineObjects della classe Polygon. Ovviamente il metodo non<br />
crea solamente le istanze della classe BSpline ma inizializza opportunamente<br />
tali oggetti. Ovvero setta la proprietà n, cioè il numero meno uno dei punti<br />
di controllo della curva, e la proprietà k, l’ordine della curva. Inoltre per<br />
ogni oggetto BSpline invoca il metodo computefdmValuesArray che svolge le<br />
seguenti operazioni:<br />
1. crea, e salva nella proprietà di tipo Array splineKnots, il vettore con-
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 71<br />
tenente la sequenza dei nodi costruita con il criterio illustrato prece-<br />
dentemente<br />
2. crea, e salva nella proprietà di tipo Array knots, una sequenza di valori,<br />
formante una partizione uniforme dell’intervallo di definizione della<br />
curva [tk−1, tn+1]. Il numero di elementi di splineKnots è quality · (n −<br />
k+2), dove “quality” è una proprietà di tipo numerico impostata in fase<br />
di creazione dell’oggetto BSpline mediante il relativo “costruttore” 11 .<br />
3. crea una matrice, o meglio un Array contenente a sua volta Array 12 , di<br />
nome fdmValues, contenente, per ogni valore del vettore knots, i cor-<br />
rispondenti k valori delle funzioni B-Spline (funzioni di miscelamento)<br />
che danno un contributo nella 5.1.<br />
La funzione createBSplineObjects esamina, uno ad uno, i punti di con-<br />
trollo dell’oggetto Polygon nello stesso ordine con cui sono stati posizionati<br />
sull’area di disegno e crea gli oggetti BSpline man mano che incontra seg-<br />
menti curvi13 . Quindi, riferendoci sempre al caso della Figura 5.1, crea come<br />
primo oggetto BSpline quello relativo alla curva ⌢<br />
P1P6 e successivamente quello<br />
relativo alla curva ⌢<br />
P8P10. Le proprietà dei due oggetti BSpline vengono<br />
quindi impostate in questa maniera 14 :<br />
11 Il “costruttore” è un metodo che ha lo stesso nome della classe di appartenenza. Viene<br />
invocato automaticamente durante la creazione di un oggetto e, generalmente, è utilizzato<br />
per inizializzare alcune o tutte le proprietà di una classe.<br />
12 Esiste, nella libreria di Flex, la classe Matrix, ma questa non rappresenta una matrice<br />
generica ma solamente matrici 3x3 utilizzate per le trasformazioni affini di oggetti visuali.<br />
13 Se il primo punto dell’oggetto Polygon considerato è morbido allora gli oggetti BSpline<br />
vengono creati a partire dalla curva successiva a quella contenente tale punto.<br />
14 In questo esempio la proprietà quality dei due oggetti BSpline è impostata col valore<br />
20.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 72<br />
Curva:<br />
⌢<br />
P1P6<br />
n: 5<br />
k: 4<br />
splineKnots: {0, 0, 0, 0, 1, 2, 3, 3, 3, 3}<br />
knots: {0, .05, .1, . . . , 1, . . . , 2, . . . , 2.90, 2.95, 3} 60 valori<br />
⎛<br />
⎞<br />
fdmValues:<br />
1<br />
⎜<br />
⎝ ...<br />
0<br />
...<br />
0<br />
...<br />
0<br />
⎟<br />
... ⎟<br />
⎠ 60 righe<br />
0 0 0 1<br />
Curva:<br />
⌢<br />
P8P10<br />
n: 2<br />
k: 3<br />
splineKnots: {0, 0, 0, 1, 1, 1}<br />
knots: {0, .05, .1, . . . , 0.9, 0.95, 1} 20 valori<br />
⎛<br />
⎞<br />
fdmValues:<br />
1<br />
⎜<br />
⎝ ...<br />
0<br />
...<br />
0<br />
⎟<br />
... ⎟<br />
⎠ 20 righe<br />
0 0 1<br />
Notiamo la forma delle due matrici fdmValues. Il numero delle righe coin-<br />
cide con il numero di elementi del vettore knots, cioè per ogni valore del<br />
parametro t ogni riga contiene i k valori di quelle funzioni Ni,k(t) che forni-<br />
scono un contributo alla sommatoria a secondo membro dell’equazione 5.1.<br />
Ad esempio, la prima riga della matrice fdmValues relativa alla curva ⌢<br />
P1P6<br />
è {1, 0, 0, 0} perchè per il valore del parametro t = 0 le funzioni B-Spline che<br />
portano un contributo sono Nj,4(t), j = 0, 1, 2, 3 che, calcolate appunto in<br />
t = 0, restituiscono i valori {1, 0, 0, 0}.<br />
Si sarà notato che fino ad ora non sono stati inviati agli oggetti BSpline<br />
informazioni sulle coordinate dei punti di controllo. Il codice calcola i valori<br />
delle funzioni B-Spline mediante la formula di ricorrenza di Cox - de Boor<br />
(vedi [19]). Nella equazione 5.1 la valutazione delle funzioni di miscelamen-<br />
to nei punti del vettore knots è, dal punto di vista computazionale, molto<br />
onerosa. Siccome gli array splineKnots, knots e l’array di array fdmValues di-<br />
pendono unicamente dal numero di punti di controllo, e non dalle coordinate<br />
degli stessi, possono essere settati ogni volta che un punto viene reso morbido
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 73<br />
e lasciati inalterati quando invece si spostano alcuni punti di controllo 15 op-<br />
pure l’intero oggetto 16 . I riferimenti ai punti di controllo delle curve, con le<br />
relative coordinate, verranno passati agli oggetti BSpline nel codice del me-<br />
todo draw. Quando si clicca su un punto di controllo per renderlo morbido,<br />
il codice, come abbiamo visto, invoca il metodo createBSplineObjects per<br />
creare ed impostare gli oggetti BSpline e, successivamente, il metodo draw<br />
per disegnare effettivamente la curva. Il metodo draw, a sua volta, chiama<br />
il metodo “computeCurve” che svolge i calcoli della equazione 5.1 avvalen-<br />
dosi però dei dati contenuti nella proprietà fdmValues, cosa che velocizza<br />
esponenzialmente il calcolo. Siccome quando si rende morbido un punto il<br />
metodo draw viene chiamato una volta sola, l’overhead dovuto alla creazio-<br />
ne degli oggetti BSpline è trascurabile. Quando invece si effettuano quelle<br />
operazioni sulle curve di un oggetto o sull’oggetto intero che comportano il<br />
ridisegno dell’oggetto in rapida successione, il fatto che il metodo draw debba<br />
soltanto eseguire una sommatoria numerica, e non il calcolo delle funzioni di<br />
miscelamento, consente di ottenere un applicativo fluido e leggero.<br />
Per ogni elemento del vettore knots, il metodo “computeCurve” esegue<br />
la sommatoria di 5.1 sostituendo a Pi le coordinate dei punti di controllo e<br />
usando gli elementi della matrice fdmValues per i valori delle funzioni Ni,k.<br />
Inoltre salva i risultati negli array “xValues” e “yValues”. Il metodo draw<br />
disegna la curva unendo, con dei piccoli segmenti, uno dopo l’altro i punti<br />
(xValues[n],yValues[n]), cioè i punti aventi come prima coordinata un ele-<br />
mento del vettore xValues e come seconda un elemento di yValues, entrambi<br />
presi con lo stesso indice all’interno dei rispettivi vettori. Siccome il nu-<br />
mero di elementi di knots è uguale a quello dei vettori xValues e yValues,<br />
e, siccome un maggior numero di elementi di questi due vettori implica un<br />
aspetto più “liscio” della curva disegnata, si deve trovare un valore del para-<br />
metro quality che assicuri una grafica gradevole senza sacrificare la fluidità<br />
dell’applicazione. Si noti che il vettore knots ha un numero di elementi diret-<br />
tamente proporzionale non solo al parametro quality ma anche al numero di<br />
nodi compresi nell’intervallo di definizione. Pertanto le curve “lunghe”, cioè<br />
con un alto numero di punti di controllo, avranno la stessa qualità grafica di<br />
15 Mediante l’apposito tool “Select ctrl points”.<br />
16 Mediante l’apposito tool “Select objects”.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 74<br />
Click su punto di controllo<br />
con tool “Soften Edges”<br />
createBSplineObjects<br />
draw<br />
computeCurve computeCurve computeCurve<br />
Crea...<br />
Usa<br />
Usa<br />
Usa<br />
Oggetto BSpline 1<br />
● fdmValues<br />
Oggetto BSpline 2<br />
● fdmValues<br />
Oggetto BSpline 3<br />
● fdmValues<br />
Figura 5.7: Diagramma riassuntivo delle operazioni svolte dal codice in risposta<br />
al click su un punto di controllo mediante il tool “Soften edges”.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 75<br />
quelle “corte”.<br />
5.6 La gestione degli eventi del mouse all’interno<br />
dell’applicazione<br />
Nell’implementare la nostra applicazione si è presentata ladifficoltà di<br />
gestione degli eventi del mouse.<br />
A disposizione dell’utente esiste il tool “Select ctrl points”, che permette<br />
di selezionare i punti di controllo dell’oggetto selezionato, e di muoverli a<br />
piacimento all’interno dell’area di disegno, per modificarne la forma.<br />
Quando l’utente muove il mouse sopra un punto, questo si colora di giallo<br />
per indicarne la selezione e, se l’utente clicca sul punto, questo può essere<br />
trascinato.<br />
La gestione degli eventi di questa operazione era inizialmente organizzata<br />
nella maniera seguente. I punti sono impostati per reagire agli eventi “Mou-<br />
seEvent.MOUSE_OVER” e “MouseEvent.MOUSE_OUT”, cioè quando il<br />
puntatore del mouse passa sopra un punto o ne esce fuori.<br />
Quando l’utente passa sopra un punto, il codice lo colora di giallo e lo<br />
considera selezionato (impostando a “true” apposite proprietà della classe<br />
ControlPoint rappresentante i punti di controllo). Se l’utente clicca sul pun-<br />
to, l’applicazione inizia a registrare il movimento del mouse per muovere il<br />
punto (evento “MouseEvent.MOUSE_MOVE”) e si interrompe l’ascolto de-<br />
gli eventi MOUSE_OVER e MOUSE_OUT 17 perché, trascinando il mou-<br />
se con una certa velocità, il puntatore può uscire e rientrare sul punto di<br />
controllo ma non si vuole che questo venga continuamente deselezionato e<br />
riselezionato.<br />
Appena si inizia a muovere il punto, il codice ascolta il momento in cui<br />
l’utente rilascerà il pulsante del mouse (evento “MouseEvent.MOUSE_UP”).<br />
Il rilascio del mouse può avvenire col puntatore fuori dal punto (movimen-<br />
to veloce del mouse), allora il codice provvede a deselezionare il punto e a<br />
riattivare l’ascolto degli eventi MOUSE_OVER e MOUSE_OUT. Se inve-<br />
17 Mediante il metodo “removeEventListener”, il cui utilizzo è analogo a quello di<br />
addEventListener ma interrompe l’ascolto dell’evento specificato.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 76<br />
ce il rilascio avviene col puntatore all’interno del punto il codice ricollega<br />
semplicemente l’ascolto degli eventi MOUSE_OVER e MOUSE_OUT alle<br />
funzioni di selezione e deselezione dei punti di controllo.<br />
Quanto esposto descrive gli aspetti principali della logica con cui era<br />
inizialmente implementata l’operazione di selezione e movimento dei punti<br />
di controllo dell’oggetto selezionato. Si presenta però un problema nella<br />
situazione in cui l’utente ha selezionato un punto, ha cliccato sopra questo<br />
ed ha iniziato a spostarlo trascinando il mouse, poi rilascia il pulsante del<br />
mouse con il puntatore posizionato sul punto di controllo.<br />
Seguendo lo schema di Figura 5.8, si vede che non si attiva la funzione di<br />
deselezione del punto di controllo. Nonostante ciò dovrebbe riattivarsi l’a-<br />
scolto dell’evento MOUSE_OUT sul punto mosso e, all’uscita del puntatore<br />
dal punto, questo dovrebbe deselezionarsi. Se l’utente, dopo il rilascio del<br />
pulsante, esegue immediatamente un movimento repentino col mouse, il pun-<br />
tatore potrebbe uscire dal punto prima che l’applicazione cominci a registrare<br />
l’evento MOUSE_OUT. In questo caso il punto non verrebbe deselezionato<br />
compromettendo, ovviamente, la consistenza interna dell’applicazione.<br />
Come si vede la gestione degli eventi del mouse è delicata e porta facil-<br />
mente a sottili errori di programmazione.<br />
Una soluzione è quella di assegnare una hitArea al punto di controllo ap-<br />
pena ci si clicca sopra per muoverlo. Questa hitArea può essere, ad esempio,<br />
l’elemento più grande nel quale il punto può muoversi 18 .<br />
Un’altra soluzione, probabilmente più elegante, è quella di separare com-<br />
pletamente le operazioni di selezione e deselezione dei punti da quelle ne-<br />
cessarie al movimento di questi. Per fare ciò, non si disattiva l’ascolto degli<br />
eventi MOUSE_OUT e MOUSE_OVER quando si clicca sul punto da muo-<br />
vere ma si salva in una nuova variabile il riferimento del punto che l’utente<br />
intende muovere; in questo modo i punti verranno selezionati e deselezionati<br />
senza i problemi esposti sopra. Inoltre, fino a quando l’utente non rilascia<br />
il mouse, l’applicazione conosce quale punto deve spostare qualunque sia la<br />
18 Nell’applicazione si tratta di un oggetto “Canvas” contente l’area di disegno e che<br />
funge da cornice atta a contenere eventuali punti morbidi di un oggetto che fuoriescono<br />
da questa.
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 77<br />
NO<br />
Selezionato tool<br />
“Select ctrl points”<br />
MOUSE_OVER Seleziona punto<br />
MOUSE_OUT Deseleziona punto<br />
Click su un punto<br />
di controllo<br />
Fine ascolto MOUSE_OVER<br />
Fine ascolto MOUSE_OUT<br />
MOUSE_MOVE sul punto selezionato<br />
MOUSE_UP sul punto selezionato<br />
Al momento del<br />
rilascio il puntatore è dentro il<br />
punto di controllo?<br />
SÌ<br />
L‘utente<br />
deseleziona tool<br />
“Select ctrl points”?<br />
SÌ<br />
STOP<br />
L‘utente muove il mouse<br />
e poi rilascia<br />
NO<br />
Deseleziona il<br />
punto di controllo<br />
Figura 5.8: Sequenza logica seguita dal codice per muovere i punti di controllo
CAPITOLO 5. <strong>DI</strong>SEGNO <strong>DI</strong> CURVE 78<br />
posizione del puntatore, mettendosi al riparo da eventuali movimenti bruschi<br />
da parte dell’utente.
Capitolo 6<br />
La distribuzione sul Web:<br />
confronto tra Flex e Matlab<br />
6.1 Introduzione<br />
Durante il corso di Laurea sono entrato in contatto con diversi pacchetti<br />
software. Uno di questi è MATLAB, di cui ho potuto approfondire le po-<br />
tenzialità e che, in ambiente accademico, riveste un ruolo importante tra gli<br />
strumenti di sviluppo di applicativi.<br />
Finora si sono viste le potenzialità di Flex per portare contenuti alta-<br />
mente dinamici ed interattivi sul web. I linguaggi e gli standard su cui è<br />
basato Flex però sono stati progettati per rendere possibile la realizzazione<br />
delle più diverse tipologie di software e non sono specializzati verso il calcolo<br />
scientifico e numerico o verso ambiti ingegneristici. Il pacchetto MATLAB<br />
è invece prettamente rivolto al calcolo numerico, offre la possibilità di crea-<br />
re applicazioni, anche dotate di GUI, molto rapidamente ed è corredato da<br />
numerosi “Toolbox”, pacchetti aggiuntivi che ne estendono le capacità e sono<br />
rivolti ad ambiti scientifici ed ingegneristici.<br />
Avendo avuto la possibilità di utilizzare questi due ambienti di svilup-<br />
po, MATLAB e Flex, ho voluto dapprima approfondire le possibilità che il<br />
primo offre per distribuire le proprie applicazioni sul web e successivamente<br />
presentare i dovuti confronti tra i due software tenendo conto dei principali<br />
aspetti del ciclo di sviluppo di un’applicazione: la scrittura del codice e la<br />
79
CAPITOLO 6. MATLAB PER IL WEB 80<br />
distribuzione dell’applicativo stesso.<br />
Nei prossimi paragrafi, pertanto, vedremo alcune opzioni, offerte da MA-<br />
TLAB stesso, per portare sul web le applicazioni con esso costruite. Una di<br />
queste è quella di trasformare una applicazione MATLAB in una applicazio-<br />
ne stand-alone che, come vedremo, sarà direttamente eseguibile dal compu-<br />
ter dell’utente. Con questo approccio il web viene impiegato semplicemente<br />
come veicolo per distribuire l’applicativo stesso.<br />
MATLAB inoltre fornisce la possibilità di interfacciare il proprio codice<br />
con varie tecnologie, tra le quali la piattaforma .NET e l’applicativo Excel<br />
di Microsoft e il linguaggio Java. Esamineremo cosa offre la cooperazione<br />
tra i linguaggi MATLAB e Java sempre nell’ottica di permettere all’utente<br />
di accedere al software realizzato con MATLAB attraverso il web.<br />
Infine presenteremo un confronto tra Flex e MATLAB soprattutto evi-<br />
denziando per quale tipologia di applicazioni sia meglio scegliere l’uno o<br />
l’altro come ambiente di sviluppo.<br />
6.2 Distribuire un’applicazione MATLAB in forma-<br />
to eseguibile attraverso il web<br />
Questa possibilità ci viene offerta dal MATLAB Compiler, strumento<br />
compreso nel pacchetto, che converte il codice MATLAB in codice C/C++<br />
e lo compila creando un eseguibile. In alternativa, il Compiler può creare<br />
delle librerie che possono essere usate per implementare applicazioni scritte<br />
in C/C++. È possibile, inoltre, utilizzare il “deploytool”, che permette di<br />
compilare il proprio codice mediante la GUI di MATLAB senza usare il<br />
compilatore dalla riga di comando.<br />
Per testare il tutto si è considerata una piccola applicazione MATLAB,<br />
dotata di GUI, che visualizza una curva spline, parametrica, interpolante<br />
tre punti (in corrispondenza dei valori del parametro 0, 1/2 e 1) e tangente<br />
ad una retta passante per il primo punto 1 . Mediante la GUI l’utente può<br />
specificare le coordinate dei tre punti e la direzione della retta (vedi Figura<br />
htm<br />
1 Reperibile qui: http://www.pitchup.com/tinyprojects/3pointsspline/spline.
CAPITOLO 6. MATLAB PER IL WEB 81<br />
6.1). Il test ha dato esito positivo, è sufficiente indicare a MATLAB quale m-<br />
Figura 6.1: Applicazione per testare il MATLAB Compiler<br />
file compilare e selezionare l’opzione “applicazione stand-alone” per ottenere<br />
un eseguibile di pochi kilobyte. Tutto il linguaggio MATLAB è compilabile,<br />
esistono però delle limitazioni riguardanti alcuni toolbox e le GUI predefinite<br />
del pacchetto.<br />
A questo punto l’eseguibile ottenuto può essere distribuito fornendo un link<br />
al file appena creato all’interno di una pagina web. In questo modo però non<br />
abbiamo un’applicazione Internet vera e propria ma utilizziamo il web come<br />
strumento per distribuire la nostra applicazione.<br />
Ottenuto il file eseguibile l’utente può avviare l’applicazione anche su<br />
un computer che non include MATLAB nel proprio parco software a patto<br />
che su tale macchina sia installato il “MATLAB Component Runtime” di cui<br />
tratteremo nel prossimo paragrafo.
CAPITOLO 6. MATLAB PER IL WEB 82<br />
6.3 Il MATLAB Component Runtime<br />
Il MATLAB Component Runtime è l’insieme di librerie a link dinami-<br />
co necessarie al funzionamento delle applicazioni create con il MATLAB<br />
Compiler su computer che non hanno MATLAB installato.<br />
Il MATLAB Component Runtime si installa con il tool “MCRInstaller”<br />
che automatizza il tutto. Questo però occupa 171 megabyte di spazio su<br />
disco 2 , rendendone ostico l’eventuale download dal web in mancanza di una<br />
connessione performante. Inoltre, le applicazioni che si vogliono distribuire,<br />
funzioneranno solo se la piattaforma su cui sono state compilate coincide<br />
con quella della macchina target. Pertanto un utente con sistema operativo<br />
Gnu/Linux non potrà far funzionare applicazioni compilate su un computer<br />
con Windows anche con il MCR installato.<br />
Molte Università forniscono sul proprio sito web un link per il download<br />
del MCRInstaller e i link per le vari applicazioni sviluppate in MATLAB. La<br />
distribuzione del MCR è legale e gratuita.<br />
6.4 Matlab e Java<br />
Sempre compreso in MATLAB, troviamo il MATLAB Builder for Java.<br />
Questo tool trasforma il codice MATLAB in una o più classi Java e, ad ogni<br />
funzione MATLAB, corrisponde un metodo Java che può essere invocato da<br />
un’altra applicazione Java. Infatti questo strumento non prevede la creazione<br />
di applicazioni stand-alone, ma solamente di componenti Java che fungono da<br />
librerie per altre applicazioni. In ogni caso è sufficiente scrivere un minuscolo<br />
frammento di codice Java per chiamare i metodi delle classi creati dal Builder<br />
per ottenere un’applicazione eseguibile.<br />
L’“m-file” contente il codice dell’applicazione di test usata poc’anzi è di<br />
tipo function. I parametri che questa funzione MATLAB accetta in input<br />
servono per specificare delle opzioni della GUI mentre, quelli restituiti in<br />
output, servono per poter controllare tale interfaccia da codice esterno, en-<br />
trambi, pertanto, non sono fondamentali. Il MATLAB Compiler, istruito per<br />
2 Nella sua versione per la famiglia di sistemi operativi Windows, questa dimensione è<br />
pressoché analoga a quella delle altre piattaforme.
CAPITOLO 6. MATLAB PER IL WEB 83<br />
creare un’applicazione stand-alone, generava, nell’esempio precedente, il co-<br />
dice necessario per invocare la funzione “spl” senza parametri in input. Que-<br />
sto è possibile perchè il parametro in input della funzione è di tipo ”varargin”<br />
e pertanto la funzione può essere invocata senza parametri obbligatori.<br />
6.5 Costruzione di un’applicazione Java<br />
Vediamo adesso le operazioni necessarie per creare un’applicazione Java<br />
in quanto, con tale linguaggio, come si vedrà in seguito, è possibile sfruttare<br />
un’altra possibilità per portare contenuti MATLAB sul web.<br />
Anche per il MATLAB Builder for Java è disponibile una GUI per non ri-<br />
correre alla riga di comando. Si adopera questo tool per indicare a MATLAB<br />
di convertire il m-file “spl.m” in codice Java.<br />
Creiamo un progetto di nome “spl” e aggiungiamo a questo il file spl.m,<br />
dopo di che clicchiamo sul bottone preposto alla trasformazione del codice.<br />
Il Builder genera anche dei comodi file HTML con la documentazione delle<br />
classi e dei metodi Java appena creati. A questo punto editiamo questo file<br />
Java che chiameremo “wrapper.java”:<br />
import com.mathworks.toolbox.javabuilder.*;<br />
import spl.*;<br />
public class wrapper{<br />
}<br />
}<br />
public static void main(String[] args){<br />
try{<br />
}<br />
splclass instance = new splclass();<br />
instance.spl(0);<br />
catch (Exception e){<br />
}<br />
System.out.println("Exception: " + e.toString());<br />
Le prime due righe sono obbligatorie e servono ad importare classi e metodi<br />
necessari alla creazione dell’applicazione; la prima riga corrisponde al codice
CAPITOLO 6. MATLAB PER IL WEB 84<br />
contenuto nell’archivio “javabuilder.jar” fornito insieme al pacchetto, mentre<br />
la seconda si riferisce all’archivio “spl.jar” ottenuto grazie al Builder for Java.<br />
Analizzando la documentazione HTML generata dal Builder si vede co-<br />
me, nel nostro caso, dobbiamo instanziare la classe “splclass” e, tramite<br />
l’oggetto creato, chiamare il metodo “spl”. La ”firma” di spl è:<br />
public java.lang.Object[] spl(int nargout,<br />
java.lang.Object... rhs)<br />
throws com.mathworks.toolbox.javabuilder.MWException<br />
Spl richiede pertanto un parametro in input (“nargout”) di tipo “int” (nu-<br />
mero intero) indicante il numero di elementi restituiti dalla funzione MA-<br />
TLAB, siccome la funzione in MATLAB restituisce solamente un “handle”<br />
per manipolare la GUI possiamo passare il valore 0.<br />
Il secondo parametro (“rhs”) di tipo “java.lang.Object...” rappresenta<br />
un array a lunghezza variabile equivalente al “varargin” di MATLAB, nel<br />
nostro caso non passiamo nessun valore dato che questi parametri settano<br />
semplicemente delle opzioni della GUI.<br />
Si notino i blocchi try/catch, sono indispensabili in quanto sia il costrut-<br />
tore della classe splclass sia il metodo spl possono sollevare eccezioni.<br />
La documentazione ufficiale descrive la API “MWArray” che permette di<br />
gestire nel codice Java i vari tipi di matrici di MATLAB.<br />
Se non è stato fatto in precedenza si deve scaricare il Java Development<br />
Kit (JDK) dal sito http://java.sun.com, il compilatore Java, per compilare<br />
il file wrapper.java.<br />
Dopo averlo installato compiliamo col comando 3 :<br />
javac -classpath javabuilder.jar;spl.jar wrapper.java<br />
Per eseguire l’applicazione utilizziamo invece il comando 4 :<br />
java -classpath .;javabuilder.jar;spl.jar wrapper<br />
3 Si assume che i file javabuilder.jar e spl.jar siano nella stessa cartella del file<br />
wrapper.java e che la directory corrente coincida con la cartella contenente questi file.<br />
4 Alternativamente è possibile creare un archivio eseguibile “jar”, con l’omonimo tool<br />
fornito insieme al JDK, in modo da ottenere un singolo file avviabile con un semplice click.
CAPITOLO 6. MATLAB PER IL WEB 85<br />
Anche in questo caso, per far girare l’applicazione, è necessario che sulla<br />
macchina sia installato MATLAB o il MCR.<br />
Inoltre non è prevista la possibilità di creare applet o applicazioni com-<br />
patibili con la tecnologia “Java Web Start”.<br />
Questa limitazione, come anche nel caso precedente in cui si creava un<br />
programma C/C++, non ci consente di sviluppare delle applicazioni web<br />
vere e proprie ma solamente di permettere il download di queste da un sito<br />
web.<br />
Il vantaggio di usare Java è quello di poter scrivere programmi con un<br />
linguaggio più semplice del C/C++ e che, rispetto a questo, ha una libreria<br />
standard che permette la creazione di ogni genere di applicazione senza dover<br />
ricorrere ad API di sistema o a codice di terze parti.<br />
Pertanto è possibile scrivere in Java tutte quelle funzionalità in cui MA-<br />
TLAB non eccelle, in quanto non rappresentanti l’obiettivo principe del<br />
pacchetto, per costruire, ad esempio, software altamente interattivo e gra-<br />
ficamente appetibile sfruttando magari il bagaglio di algoritmi MATLAB<br />
sviluppati precedentemente.<br />
6.5.1 MATLAB e le servlet Java<br />
Si è approfondito come interfacciare Java con MATLAB anche per un<br />
altro motivo, ossia per utilizzare la tecnologia delle “Servlet” Java, le quali<br />
sono dei programmi lato-server che permettono di generare contenuto dina-<br />
mico nelle pagine web, rientrando di diritto nel campo delle applicazioni web<br />
e non più nella semplice distribuzione di software mediante il web.<br />
Con questa tecnologia, analoga alla CGI (vedi 1.6), l’utente, raggiunta<br />
l’apposita pagina, compila un modulo con i dati di input, l’invia al server che<br />
calcola la risposta, con l’ausilio del codice MATLAB trasformato in Java, e<br />
la invia, formattata come pagina HTML, all’utente.<br />
Per verificare le potenzialità si è seguito il demo “VarArgServlet” suggerito<br />
dalla documentazione MATLAB, per il quale è necessario disporre di un web<br />
server 5 predisposto alle Servlet Java (ad esempio “Tomcat” in quanto open<br />
5 Un web server è un programma (e, per estensione, il computer) che si occupa di fornire,<br />
su richiesta del browser, una pagina web (spesso scritta in HTML). Le informazioni inviate<br />
dal web server viaggiano in rete trasportate dal protocollo HTTP. L’insieme di webserver
CAPITOLO 6. MATLAB PER IL WEB 86<br />
source, affidabile e facile da configurare).<br />
Mentre le funzioni MATLAB possono rimanere pressocché invariate, è<br />
necessario creare almeno un file Java che svolga le operazioni di lettura<br />
dell’input inviato dall’utente e di formattazione della pagina HTML.<br />
Dopo aver seguito le istruzioni di compilazione del codice e aver posi-<br />
zionato i file nelle giuste directory del webserver, questo è pronto a ricevere<br />
l’input dell’utente tramite la pagina web contenente il modulo (vedi Figura<br />
6.2).<br />
Figura 6.2: Pagina contenente il form per inviare i dati al web server<br />
L’applicazione sul server riceve i valori immessi dall’utente e restituisce<br />
una pagina HTML contenente i dati di media e deviazione standard oltre ad<br />
un grafico con il “plot” dei valori stessi (vedi Figura 6.3). Sopra il plot pos-<br />
siamo notare dei comandi, questi servono per ingrandire, spostare o ruotare<br />
in 3D il grafico e sono offerti dalla funzionalità “WebFigures” di MATLAB,<br />
pertanto, questi strumenti, non devono essere programmati a parte ma sono<br />
disponibili per tutti i grafici.<br />
presenti su Internet forma il World Wide Web (WWW), uno dei servizi più sfruttati della<br />
Grande Rete (citazione da [17]).
CAPITOLO 6. MATLAB PER IL WEB 87<br />
Figura 6.3: La risposta dal web server
CAPITOLO 6. MATLAB PER IL WEB 88<br />
Se si salva la pagina web di Figura 6.3 possiamo vedere che questa è<br />
costituita da codice HTML, file immagine contenti il grafico e file con codice<br />
Javascript, che registrano le richieste dell’utente mediante i tool forniti da<br />
WebFigures e richiedono alla Servlet l’immagine aggiornata.<br />
Siccome sia la pagina per l’invio dei dati, sia gli elementi costituenti quella<br />
ottenuta in risposta, sono quelli del web classico, il browser non ha bisogno<br />
di nessun plug-in per visualizzare il tutto, inoltre, dato che la Servlet gira sul<br />
web server, l’utente non deve nemmeno installare il MCR né, tanto meno,<br />
MATLAB.<br />
6.6 Confronto tra i due pacchetti<br />
Prima di illustrare le differenze tra MATLAB e Flex è necessario fare<br />
una precisazione. Due prodotti così evoluti, complessi e di successo come<br />
quelli che andremo a paragonare possiedono un numero di funzionalità tal-<br />
mente elevato da coprire pressoché qualsiasi esigenza un utente possa avere.<br />
MATLAB, ad esempio, è nato come come strumento per il calcolo numerico<br />
eppure include due toolbox (il “Symbolic Math Toolbox” e il “Extended Sym-<br />
bolic Math Toolbox”) per la matematica simbolica e, come abbiamo visto,<br />
diverse possibilità per distribuire le proprie applicazioni sul web. D’altra<br />
parte Flex rappresenta una evoluzione di Adobe Flash. Entrambi i prodotti,<br />
infatti, creano delle applicazioni che funzionano mediante lo stesso runtime<br />
environment, ma mentre Flash è più orientato verso l’animazione grafica ed<br />
è carente dal versante della creazione di RIA, Flex colma questa lacuna pur<br />
mantenendo molte delle caratteristiche di disegno ed animazione vettoriali di<br />
Flash, sia mediante la programmazione diretta di queste attraverso le proprie<br />
librerie sia permettendo l’importazione dei file creati con Flash. Nonostante<br />
ciò Flex e MATLAB mantengono i loro punti di forza negli ambiti per cui<br />
sono stati inizialmente progettati ed un confronto tra i due deve tenere conto<br />
di questo aspetto.<br />
Iniziamo a considerare le differenze tra i linguaggi dei due pacchetti. In-<br />
dicheremo con “linguaggio Matlab” il linguaggio di programmazione di MA-<br />
TLAB non avendo questo un suo nome proprio. Esistono letteralmente cen-<br />
tinaia di linguaggi di programmazione. Per confrontarne due si dovrebbe
CAPITOLO 6. MATLAB PER IL WEB 89<br />
valutare la semantica, la sintassi e l’implementazione interna di ciascuno e<br />
ciò va ben oltre le conoscenza dell’autore e lo scopo di questo documento. Si<br />
possono però fare alcune osservazioni di carattere generale.<br />
Il linguaggio Matlab è interpretato, questa caratteristica permette a MA-<br />
TLAB di fornire un ambiente di sviluppo interattivo dove l’utente può im-<br />
mettere comandi nell’apposita “command window” ed ottenere una risposta<br />
immediata senza dover prima compilare il codice. Inoltre, nonostante sia pos-<br />
sibile la programmazione orientata agli oggetti, tale linguaggio viene quasi<br />
sempre utilizzato in maniera procedurale per svariati motivi tra cui il fatto<br />
che l’utente di MATLAB è generalmente interessato all’aspetto scientifico del<br />
codice che sta scrivendo e meno alla struttura del medesimo ma soprattutto<br />
perché le prime versioni del linguaggio non prevedevano tale paradigma di<br />
programmazione e pertanto tale possibilità viene generalmente vista come<br />
una caratteristica aggiuntiva, come in effetti è, di secondaria importanza<br />
(vedi [20, 21]).<br />
Il linguaggio Matlab inoltre è imperniato sul concetto di matrice, nel<br />
senso che permette di creare e manipolare matrici di varie dimensioni con<br />
grande facilità. Questa caratteristica porta dei vantaggi in vari campi e<br />
caratterizza decisamente il linguaggio.<br />
ActionScript è un linguaggio molto differente. Mentre il linguaggio Ma-<br />
tlab può decisamente essere considerato un linguaggio di scripting e molto<br />
specializzato, ActionScript, a dispetto del nome, ha un carattere molto più<br />
generale e assomiglia per numerosi aspetti ad un linguaggio di sistema. Pri-<br />
ma di tutto è un linguaggio compilato e ciò non permette di utilizzarlo in<br />
un ambiente interattivo. In secondo luogo il processo di scrittura, compi-<br />
lazione, debug è molto più lento rispetto a MATLAB proprio per questa<br />
caratteristica di essere un linguaggio compilato.<br />
ActionScript, a differenza del linguaggio Matlab, nasce ad oggetti anche<br />
se il paradigma di programmazione si è evoluto nel corso delle tre versioni<br />
del linguaggio. Il programmatore ActionScript è più propenso ad utilizzare<br />
la programmazione orientata agli oggetti perché la documentazione e la let-<br />
teratura in generale indirizzano in tale direzione fin dai primi rudimenti del<br />
linguaggio.<br />
Mentre il linguaggio Matlab è indirizzato al calcolo numerico e alla mani-
CAPITOLO 6. MATLAB PER IL WEB 90<br />
polazione di matrici, ActionScript non ha una sua pecularietà, anzi è molto<br />
simile ad altri linguaggi come Java. Ciò comporta la scrittura di molte più<br />
righe di codice nel caso di algoritmi numerici e scientifici rispetto a MA-<br />
TLAB. Anche per questo motivo, ossia per l’alto numero di righe di codice<br />
necessario per fare qualcosa di minimamente interessante, rende necessaria<br />
una solida e rigorosa struttura del codice e, pertanto, altamente indicata la<br />
programmazione orientata agli oggetti.<br />
6.7 Considerazioni<br />
In questo capitolo abbiamo visto alcune possibilità di portare applicazioni<br />
MATLAB sui computer non aventi questo pacchetto installato anche se le<br />
opzioni offerte non si limitano a quelle presentate in questa trattazione.<br />
Flex, ovviamente, è molto più specializzato sotto questo aspetto, in quan-<br />
to non solo permette di distribuire applicazioni sul web che potranno essere<br />
installate sul computer dell’utente come i normali programmi Desktop grazie<br />
al runtime Air, ma permette di creare componenti visualizzabili all’interno<br />
dei browser a tutta pagina o integrati in pagine HTML esistenti.<br />
Per scegliere quale dei due software sia il miglior ambiente di sviluppo<br />
per le proprie applicazioni bisogna valutare alcuni aspetti.<br />
Questi includono il considerare cosa si vuole ottenere, quale tipologia di<br />
applicazione si vuole costruire e quanto tempo si ha a disposizione.<br />
Se l’applicazione comprende molto calcolo numerico o ingegneristisco,<br />
MATLAB permette un tempo di sviluppo molto più rapido di Flex per le<br />
caratteristiche dei linguaggi interni appena viste. Se l’applicazione, magari<br />
sempre di stampo scientifico, non comprende codice per il quale il linguaggio<br />
o i toolbox di MATLAB possano essere di aiuto probabilmente Flex è la<br />
scelta migliore.<br />
Se l’obiettivo primario invece è quello di creare software il più possibile<br />
fruibile dall’utente via web attraverso il browser allora la scelta di Flex è<br />
altamente consigliata.<br />
Se invece si vuole semplicemente distribuire l’applicazione permettendo<br />
il download di questa attraverso un link in una pagina web allora, come<br />
abbiamo visto, MATLAB offre più possibilità in questo senso. Bisogna in
CAPITOLO 6. MATLAB PER IL WEB 91<br />
ogni caso considerare che il Flash Player e il MATLAB Component Runtime,<br />
ossia i runtime environment necessari per l’esecuzione delle applicazioni sui<br />
computer degli utenti, hanno dimensioni molto differenti. In particolare il<br />
MCR è molto più pesante del runtime di Flex e non tutti gli utenti potrebbero<br />
permettersi di scaricarlo in mancanza di una connessione a banda larga.<br />
Infine molte Facoltà dispongono di ingenti quantità di codice scritte per<br />
MATLAB. In questo caso probabilmente la scelta migliore potrebbe essere<br />
quella di interfacciare il codice MATLAB con Java o con la piattaforma<br />
.NET per sfruttare le caratteristiche di tali tecnologie senza dover rinunciare<br />
al codice preesistente.
Appendice A<br />
Flex ed alcune caratteristiche<br />
della programmazione<br />
orientata agli oggetti<br />
Il motivo principale della nascita e dello sviluppo della programmazione<br />
orientata agli oggetti, avvenuta intorno agli anni ’60, risiede nella necessi-<br />
tà di trovare un paradigma che permettesse di gestire software sempre più<br />
complessi.<br />
Quando scriviamo un programma Flex, anche banale, con pochi controlli e<br />
un’interfaccia limitata, in realtà creiamo un qualcosa la cui complessità è<br />
paragonabile a molte migliaia di righe di codice scritte in linguaggi quali il C<br />
col solo ausilio della libreria standard di tale linguaggio e le Api del sistema<br />
operativo. Questo è dovuto al fatto che il livello di astrazione dello strato<br />
software fornito dal Runtime Environment di Flex e delle sue librerie di base<br />
(cioè fornite col pacchetto stesso) è ben differente e molto più alto di quello<br />
delle Api di un sistema operativo. Flex permette allo sviluppatore di creare<br />
velocemente applicazioni comprensive di interfaccia grafica, di stampare, di<br />
creare disegni vettoriali, di interfacciarsi con i vari protocolli di comunicazio-<br />
ne di Internet, di gestire database e comunicazioni lato server e soprattutto<br />
di, vero punto di forza, creare una fruttuosa sinergia tra un linguaggio di pro-<br />
grammazione vero e proprio e le tecnologie regine dello sviluppo web quali<br />
xml/xhtml, fogli di stile ma anche altri linguaggi come Java, Javascript e<br />
92
APPEN<strong>DI</strong>CE A. LE CARATTERISTICHE DELLA OOP 93<br />
Php. Ognuna di queste possibilità è accessibile tramite la libreria di Flex in<br />
modo molto intuitivo e, velocemente, se ne possono utilizzare le principali<br />
caratteristiche.<br />
Al programmatore professionista deve però essere data la possibilità di<br />
personalizzare al massimo ogni caratteristica e di poter accedere al livello<br />
di astrazione più basso di ogni tecnologia con cui ci si può interfacciare; ad<br />
esempio è possibile usare il protocollo http in maniera del tutto trasparente<br />
per accedere a risorse sul web eppure la classe HTTPService permette di<br />
gestire ogni più piccola caratteristica di questo fondamentale protocollo.<br />
Il paradigma della programmazione orientata agli oggetti 1 permette di<br />
organizzare una libreria enorme come quella di Flex in modo che appaia<br />
ordinata ed intuitiva allo sviluppatore. Le quattro caratteristiche di tale<br />
paradigma sono la modularità, l’incapsulamento dei dati, l’ereditarietà e il<br />
polimorfismo. Data la complessità di tale libreria, questa si rivela un ottimo<br />
strumento per illustrare questi concetti.<br />
La modularità si basa sul concetto di classe che è l’elemento fondamenta-<br />
le di un linguaggio OOP: una classe è l’unione di un insieme di dati, chiamati<br />
proprietà, e di alcune funzioni, chiamate metodi. Una classe è lo “stampo”<br />
con cui vengono creati gli oggetti. Gli oggetti sono istanze delle rispettive<br />
classi. Ad esempio la classe Button, che in Flex permette aggiungere un pul-<br />
sante nell’interfaccia, possiede svariati proprietà fra cui le coordinate della<br />
posizione del pulsante stesso e il testo dell’eventuale etichetta posta sopra<br />
di esso. Ogni oggetto Button ha pertanto le proprietà delle coordinate della<br />
posizione, impostati col valore della propria posizione e col campo del testo<br />
impostato con la stringa del proprio testo visualizzato. I metodi sono nor-<br />
mali funzioni che però operano generalmente sul singolo oggetto tramite il<br />
quale vengono invocati. Ad esempio se si ha un Button di nome “Pippo” e<br />
si invoca il metodo “move”, che prende in input due numeri e si occupa di<br />
spostare il pulsante nelle nuove coordinate, questo sposterà solamente il pul-<br />
sante Pippo nella nuova posizione e aggiornerà le proprietà delle coordinate<br />
sempre limitatamente all’oggetto in questione.<br />
Per ogni proprietà e ogni metodo di una classe si può specificare uno<br />
1 d’ora in poi OOP da Object-Oriented programming
APPEN<strong>DI</strong>CE A. LE CARATTERISTICHE DELLA OOP 94<br />
“specificatore di visibilità”, cioè un attributo che specifica se l’utente (inte-<br />
so come programmatore) della classe può avere accesso alla risorsa. Questi<br />
specificatori possono variare da linguaggio a linguaggio sia come nomi sia in<br />
numero ma i principali sono due e, in ActionScript come nella quasi totalità<br />
dei linguaggi OOP, sono chiamati private e public. Se una proprietà o un<br />
metodo è dichiarato public allora l’utente può accedervi da ogni parte del co-<br />
dice. Gli elementi public rappresentano l’interfaccia della classe cioè i servizi<br />
che la classe mette a disposizione dell’utenza. Ogni classe ragionevolmente<br />
complessa avrà però proprietà e metodi utili unicamente al proprio meccani-<br />
smo interno e che, quindi, non solo non offrono direttamente servizi all’utente<br />
ma non devono essere alterati inavvertitamente, pena errori nel codice molto<br />
difficili da scovare in progetti di grosse dimensioni. Questi elementi saran-<br />
no quindi dichiarati come private e non saranno accessibili dall’esterno della<br />
classe. Se apriamo la documentazione di Flex e analizziamo la guida di riferi-<br />
mento di una qualsiasi classe, notiamo che le proprietà e i metodi privati non<br />
sono documentati proprio perché riguardano l’implementazione interna della<br />
classe e non sono utili all’utente. Gli specificatori di visibilità permettono il<br />
cosiddetto incapsulamento dei dati.<br />
Con ereditarietà si intende la possibilità di creare classi che ereditano le<br />
proprietà e i metodi di un’altra classe che chiameremo superclasse. La classe<br />
che eredita viene chiamata sottoclasse. Oltre ad ereditare caratteristiche e<br />
comportamenti la sottoclasse ne introduce di nuovi o modifica alcuni metodi<br />
della superclasse. La sottoclasse sarà pertanto una versione più specializzata<br />
della superclasse. Ogni sottoclasse può avere, a sua volta, altre sottoclassi<br />
che ereditano da questa. Viene a crearsi una struttura ad albero avente come<br />
radice la classe Object, la classe base di qualsiasi tipo di oggetto in Flex.<br />
Ritorniamo alla nostra classe Button. Questa è una sottoclasse della<br />
classe UIComponent, la classe base per tutti i componenti visuali, interattivi<br />
o meno. Ad esempio le proprietà di tipo numerico height e width, rappresen-<br />
tanti rispettivamente altezza e larghezza del componente, hanno significato<br />
per qualsiasi elemento visuale e sono pertanto ereditati da tutte le sottoclas-<br />
si di UIComponent. Anche molti metodi vengono ereditati come il metodo<br />
move appena visto. Esiste inoltre la possibilità di dichiarare un metodo con<br />
la parola chiave “override”. Tali metodi rimpiazzano quelli della superclas-
APPEN<strong>DI</strong>CE A. LE CARATTERISTICHE DELLA OOP 95<br />
se. Ovviamente, per coerenza, dovrebbero (nonostante non sia obbligatorio)<br />
svolgere la stessa funzione logica del metodo della superclasse di cui si vuole<br />
fare l’override. Se creiamo una classe SpecialButton che eredita da Button,<br />
e vogliamo un metodo move che lasci una scia tra la vecchia posizione del<br />
bottone e quella nuova, possiamo fare l’override di tale metodo.<br />
Abbiamo detto che tutti gli elementi visuali in Flex sono sottoclassi della<br />
classe UIComponent. Siccome la classe UIComponent implementa il metodo<br />
move, tutte le classi derivate dispongono di questo metodo, o, ereditato<br />
direttamente da UIComponent, o ridefinito mediante override. Supponiamo<br />
di voler scrivere una funzione che prende in input un valore numerico e un<br />
un riferimento ad un qualsiasi elemento visuale e trasli orizzontalmente verso<br />
destra l’elemento di un numero di pixel pari al primo parametro. La nostra<br />
funzione potrebbe essere:<br />
public function trasl(numOfPix:Number, visEl:UIComponent):void{<br />
}<br />
visEl.move(visEl.x+numOfPix,visEl.y);<br />
L’esempio è minimale, inoltre, per ottenere lo stesso risultato, basterebbe<br />
invocare il metodo move direttamente mediante l’oggetto interessato alla<br />
traslazione, in ogni caso è sufficiente ad illustrare il principio del polimorfi-<br />
smo. È possibile passare come secondo parametro del metodo “trasl” qualsiasi<br />
oggetto di tipo UIComponent o di qualsiasi tipo derivato da tale classe. Il<br />
metodo move che verrà invocato sarà il metodo move relativo alla classe<br />
dell’oggetto pertanto, se l’oggetto fosse uno SpecialButton di cui sopra, il<br />
metodo move invocato sarebbe quello più specializzato che disegna una scia<br />
tra le due posizioni dell’elemento. Nei linguaggi “tipati”, cioè in quei linguag-<br />
gi in cui per ogni variabile deve esserne dichiarato il tipo, tradizionalmente<br />
era necessario scrivere codice diverso per ogni tipo di parametro. Nel nostro<br />
caso una funzione diversa per ogni tipo di elemento visuale di cui si vuole<br />
ottenere la traslazione. La caratteristica del polimorfismo permette di scri-<br />
vere un solo frammento di codice valido per qualsiasi oggetto appartenente<br />
ad una classe derivante da UIComponent pur mantenendo la caratteristica<br />
di linguaggio tipato.
Glossario<br />
account: Iscrizione registrata su un server che permette, tramite l’inseri-<br />
mento di una userid e di una password, di accedere alla rete e/o ai<br />
servizi, 2<br />
API: (Acronimo: Application Programming Interface, interfaccia di pro-<br />
grammazione delle applicazioni) Insieme di convenzioni che il program-<br />
matore segue affinché il proprio software possa avvalersi dei servizi del<br />
sistema operativo o di librerie esterne, 8<br />
banda: (larghezza di) Quantità di dati per unità di tempo che può passare<br />
su una connessione, e che viene poi divisa tra i vari utenti, 13<br />
barra di progresso: Componente dell’interfaccia grafica usato per segnalare<br />
lo stato di avanzamento di una operazione, 16<br />
browser: Programma per la visualizzazione dei documenti multimediali che<br />
costituiscono il World Wide Web, 4<br />
cache: Zona di memoria (principale o secondaria) adibita a contenere prov-<br />
visoriamente dati di frequente utilizzo allo scopo di consentirne un<br />
rapido riutilizzo, 16<br />
compilatore: programma che traduce un file di testo, contenente le istru-<br />
zioni di un programma, in un formato (compilato) eseguibile da un<br />
computer o da un apposito programma interprete , 13<br />
database: Archivio elettronico in cui sono raccolte e organizzate delle in-<br />
formazioni e consultabili o modificabili in base alle proprie esigenze,<br />
8<br />
96
GLOSSARIO 97<br />
debugger: Software che semplifica l’individuazione e la correzione di errori<br />
di programmazione, 17<br />
directory: Una directory è un’area su disco per l’immagazzinamento dei<br />
file. Le directory sono composte da file a altre subdirectory, 16<br />
DOM: (Acronimo Document Object Model) É una interfaccia standard in-<br />
dipendente dal linguaggio usato che permette a degli script di accedere,<br />
modificare o creare elementi che costituiscono le pagine web (bottoni,<br />
campi di testo, colori, dimensione del testo etc.) rendendo le pagine<br />
web dinamiche ed interattive, 7<br />
dominio: Parte dell’indirizzo Internet che ne stabilisce l’appartenenza ad<br />
una categoria di sistemi o ad una area geografica, 12<br />
editor: Software per redigere file di testo, 17<br />
form: Modulo virtuale da compilare on line che viene inviato al server, 6<br />
framework: Software che vengono progettati per diventare l’intelaiatura e<br />
le fondamenta di altri programmi, 15<br />
garbage collection: Funzionalità di un linguaggio di programmazione che<br />
provvede automaticamente a rilasciare al sistema operativo il controllo<br />
delle aree di memoria non più utilizzate dal codice del programma, 14<br />
gif: (Acronimo: Graphics Interchange Format) è un formato per immagini<br />
di tipo bitmap molto utilizzato nel World Wide Web, sia per immagini<br />
fisse che per le animazioni, 28<br />
GUI: Acronimo: Graphical User Interface, interfaccia grafica utente, 2<br />
IDE: (Acronimo Integrated development environment) Ambiente di svilup-<br />
po integrato, un software ad interfaccia grafica comprendente tutti i<br />
tool necessari allo sviluppo di un programma organizzati in modo da<br />
risultare facilmente accessibili, 17<br />
Internet-Point: Luogo in cui si può accedere ad Internet generalmente con<br />
una tariffa a tempo, 4
GLOSSARIO 98<br />
interpretato: (Linguaggio) Linguaggio di programmazione di alto livello<br />
il cui codice non è direttamente eseguito dal sistema operativo della<br />
macchina ma viene interpretato da un secondo software che genera il<br />
codice eseguibile, 6<br />
Intranet: Rete privata che utilizza gli stessi protocolli di Internet, 14<br />
mainframe: Un mainframe è un computer grande e dotato di elevata capa-<br />
cità di elaborazione, 2<br />
mark-up: (linguaggio di) Metodo di formattazione di un testo in cui, gene-<br />
ralmente, si usano dei comandi delimitati da coppie di virgolette (mark o tag) e , usato per terminare il comando<br />
stesso, mediante i quali i contenuti all’interno vengono impaginati e<br />
formattati di conseguenza, 5<br />
motore di ricerca: Strumento per ricercare informazioni su Internet in base<br />
all’argomento, dopo aver inserito una parola o una frase-chiave, 16<br />
offline: Letteralmente “non il linea”, scollegati da Internet, 17<br />
open source: software il cui codice viene rilasciato con una licenza che<br />
permette a chiunque di analizzarlo e modificarlo, 15<br />
peer to peer: (oppure p2p) Applicazione che non comunica con un server<br />
centrale ma permette di creare reti composte da nodi (peer) che si<br />
comportano contemporaneamente da client e server verso gli altri nodi<br />
del network, 3<br />
plugin: Modulo software che interagisce con un altro programma per am-<br />
pliarne le funzioni, 8<br />
programmazione ad oggetti: La programmazione orientata agli oggetti è un<br />
paradigma di programmazione, che prevede di raggruppare in un’unica<br />
entità (la classe) sia le strutture dati che le procedure che operano su di<br />
esse, creando per l’appunto un “oggetto” software dotato di proprietà<br />
(dati) e metodi (procedure) che operano sui dati dell’oggetto stesso<br />
(citazione da [9] ), 14
GLOSSARIO 99<br />
provider: Fornitore dei servizi Internet, 2<br />
scaricare: (o download) Prelevare un file da internet e salvarne una copia<br />
sulla macchina locale, 2<br />
scripting: (Linguaggio di) Linguaggio di programmazione di alto livello,<br />
interpretato e generalmente potente e facile da imparare, 6<br />
sorgente: file di testo, contenente le istruzioni di un software, che verrà in<br />
seguito compilato, 13<br />
stand-alone: In questa trattazione con il termine si intende un software che<br />
funziona come una normale applicazione Desktop e non all’interno di<br />
un Browser, 8<br />
UNIX: Sistema operativo per computer, 3<br />
URL: Formato standard per identificare una risorsa Internet accessibile<br />
tramite Word Wide Web, il modo universale di definire un indirizzo<br />
Internet, 5<br />
widget: Elemento dell’interfaccia utente, 8
Bibliografia e sitografia<br />
[1] Daniel Manrique, X Window System Architecture,<br />
Overview HOWTO, 2001<br />
[2] National Center for Supercomputing Applications presso<br />
l’Università dell’Illinois, The Common Gateway Interfa-<br />
ce, specification v. 1.1, URL: http://hoohoo.ncsa.uiuc.<br />
edu/cgi/<br />
[3] Marco Casario, Il Ritorno d’investimento (ROI)<br />
di una RIA, pubblicato da Augitaly, URL:<br />
http://www.augitaly.com/flexgala/index.php?<br />
cmd=newsreader&id=50, 2007<br />
[4] Dana Moore, Raymond Budd and Edward Benson, Pro-<br />
fessional Rich Internet Applications: AJAX and Beyond,<br />
pubblicato da Wiley Publishing, Inc., 2007<br />
[5] Andrea Giammarchi, Guida AJAX: Descrizione tecni-<br />
ca e teorica, URL: http://javascript.html.it/guide/<br />
lezione/2565/descrizione-tecnica-e-teorica/<br />
[6] JAVA TM WEB START OVERVIEW, White Paper, SUN<br />
Microsystems, 2005<br />
[7] Adobe Flex 2, Technical white paper, Adobe Inc., 2006<br />
[8] Mike Chambers, Macromedia Flash MX Security,<br />
pubblicato da Macromedia Inc., 2002<br />
100
BIBLIOGRAFIA E SITOGRAFIA 101<br />
[9] Wikipedia, the free encyclopedia, voce Programmazione<br />
orientata agli oggetti, URL: http://it.wikipedia.org/<br />
wiki/Programmazione_orientata_agli_oggetti, 2007<br />
[10] Jeff Kamerer, Making Flash websites searchable ,<br />
URL: http://www.adobe.com/devnet/flash/articles/<br />
flash_searchability.html, 2006<br />
[11] Sergio Rosati, Fisica Generale 2 ◦ ed, pubblicato da Casa<br />
Editrice Ambrosiana Milano, 1994<br />
[12] Thomas Smid, Elastic Collision in Three Dimen-<br />
sions, URL: http://www.plasmaphysics.org.uk/<br />
collision3d.htm<br />
[13] John David N. Dionisio, Hidden Surface Removal, URL:<br />
http://myweb.lmu.edu/dondi/share/cg/hsr.<strong>pdf</strong><br />
[14] Riccardo Scateni, Paolo Cignoni, Claudio Montani, Ro-<br />
berto Scopigno, Fondamenti di grafica tridimensionale<br />
interattiva, pubblicato da McGraw-Hill, 2005<br />
[15] Wikipedia, the free encyclopedia, voce Java 3D, URL:<br />
http://en.wikipedia.org/wiki/Java_3D, 2008<br />
[16] Davide Beltrame, Introduzione a Papervi-<br />
sion3D, pubblicato da Html.it, URL: http:<br />
//flash.html.it/articoli/leggi/2213/<br />
introduzione-a-papervision3d/, 2007<br />
[17] Wikipedia, the free encyclopedia, voce Web server, URL:<br />
http://it.wikipedia.org/wiki/Web_server, 2008<br />
[18] Microsoft Developer Network, articolo Anatomy of a pa-<br />
th, URL: http://msdn.microsoft.com/en-us/library/<br />
cc294864.aspx<br />
[19] Carl de Boor, A Practical Guide To Splines, Revised<br />
Edition, pubblicato da Springer, 2001
BIBLIOGRAFIA E SITOGRAFIA 102<br />
[20] The MathWorks, MATLAB R○ 7 Getting Started Guide,<br />
11 ◦ edizione, 2008<br />
[21] The MathWorks, MATLAB R○ 7 Classes and Object-<br />
Oriented Programming, 2008<br />
[22] Adobe, Programming ActionScript 3.0, 2008<br />
[23] Dagnino Catterina, Lamberti Paola, Elementi di Ma-<br />
tematica Numerica per la Grafica, Levrotto&Bella,<br />
2008<br />
[24] Lifaros , David Hirmes, JD Hooge, Ken Jokol, Pavel Ka-<br />
luzhny, Ty Lettau, Jamie McDonald, Gabriel Mulzer, Kip<br />
Parker, Keith Peters, Paul Prudence, Glen Rhodes, Man-<br />
ny Tan, Jared Tarbell, Brandon Williams, Flash Math<br />
Creativity, second edition, Friends Of Ed, 2004