28.05.2013 Views

TESI DI LAUREA (.pdf ~ 7MB)

TESI DI LAUREA (.pdf ~ 7MB)

TESI DI LAUREA (.pdf ~ 7MB)

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!