La Pascalina La Pascalina

Transcript

La Pascalina La Pascalina
La Pascalina
di
Ricchi Luca, Giampaoli Marco
rivista da
Stefano Cacciaguerra Ph. D. in Informatica
Indice
Introduzione ........................................................................................................................................ 3
Specifiche iniziali................................................................................................................................. 3
Sviluppo del progetto .......................................................................................................................... 4
Funzionalità della Pascalina ............................................................................................................ 5
Script .................................................................................................................................................. 8
Conclusioni ....................................................................................................................................... 15
2
Introduzione
Lo svolgimento di questo elaborato consiste nella progettazione e nella realizzazione di
una particolare macchina, presentata durante il corso di Storia e Didattica dell’Informatica,
precisamente la “Pascalina”.
La “Pascalina” è la precorritrice della moderna calcolatrice.
Essa è stata inventata nel 1642 dal filosofo e matematico francese Blaise Pascal ed è una
macchina che permette di addizionare e sottrarre, tenendo però conto del riporto.
Per molto tempo è stata considerata la prima calcolatrice meccanica inventata, anche se
questo merito andrebbe alla calcolatrice di Wilhelm Schickard.
La sua notorietà fu amplificata dall'accurata descrizione contenuta nell'Encyclopédie, che
la rese il punto di riferimento per la realizzazione molte calcolatrici successive.
Della “Pascalina” furono costruiti una cinquantina di esemplari per operazioni sia in base
decimale che nell'unità monetaria dell'epoca.
In particolare, il primo esemplare fu costruito da Pascal per aiutare il padre, funzionario
delle imposte, a gestire la propria contabilità e, quindi, a lavorare in lire.
La nostra realizzazione della suddetta macchina nella sua versione decimale e non
finanziaria, è da destinarsi alla realtà virtuale di Second Life, che permette ad ogni utente
registrato di sviluppare un qualsiasi oggetto tridimensionale, la sua relativa interazione con
un ipotetico avatar tramite un particolare linguaggio di scripting ed il suo salvataggio nel
proprio inventario a disposizione di utilizzi e future modifiche.
Specifiche iniziali
La macchina si presenta come un parallelepipedo di ottone (Fig. 1).
Su una superficie laterale di questo parallelepipedo sono applicate sei ruote dentate
collegate ad ingranaggi interni alla scatola.
Figura 1: la Pascalina
3
Ogni ruota rappresenta in maniera incrementale da destra verso sinistra la
rappresentazione di una cifra di un numero:
avremo dunque all’estrema destra le unità, successivamente le decine e così via fino alle
centinaia di migliaia per la sesta ruota a sinistra della visione frontale.
Ogni ruota è dotata di una numerazione statica, rappresentata da un cerchio esterno più
grande e da una dinamica con un cerchio interno, entrambe numerate da 0 a 9.
Con il termine “dinamica” si intende il fatto che i numeri si muovano insieme alla ruota e
cambino dunque la loro orientazione rispetto allo spettatore.
Nella parte superiore alle ruote troviamo le sei fessure corrispondenti.
Esse indicano il valore che ha assunto la relativa ruota fino a quel momento, durante i
calcoli.
Muovendo la barra sottostante le sei fessure, verso l’alto, copriamo quest’ultime per
scoprirne altrettante.
Nel caso in cui si desideri effettuare un’addizione, useremo solo gli indici della riga
superiore, mentre per la sottrazione saranno necessario entrambe le righe, usate
naturalmente una alla volta.
Il totale delle dodici fessure scoprono i valori di sei rulli cartacei.
Ogni rullo srotolato (Fig. 2), si presenta in questo modo:
Figura 2: il rullo cartaceo srotolato
Sviluppo del progetto
Per la realizzazione del progetto è stato necessario procedere suddividendo lo sviluppo in
due fasi.
La prima fase, ovvero la realizzazione grafica, è risultata essere la parte più semplice
considerando il basso numero di primitive necessarie ad elaborare la struttura della
macchina da visualizzare; tuttavia questa netta separazione tra grafica e fase di scripting,
col senno di poi, non è risultata essere la migliore delle scelte: abbiamo riscontrato infatti
uno stretto legame di realizzazione tra primitive e script; quest’ultimo dipende fortemente
dal modo in cui vengono realizzate le prims e può anche capitare di complicare troppo la
grafica per poi non riuscire a lavorare agevolmente con il codice di interazione.
La seconda fase, ovvero quella di scripting, ha richiesto la comprensione di un linguaggio
mai visto prima, ma con una sintassi molto simile a quella del C Ansi e perciò facilmente
affrontabile.
Questa fase sviluppa le funzionalità e l’interazione con l’avatar, fondamentale a
dinamicizzare un oggetto che altrimenti sarebbe inutilizzabile. Nel successivo paragrafo
approfondiremo le suddette funzionalità per poi passare al dettaglio dello script.
4
Funzionalità della Pascalina
Tramite questa macchina è possibile eseguire le operazione aritmetiche di addizione,
sottrazione e moltiplicazione.
Premettiamo che ogni ruota fino alla penultima a sinistra, ovvero quella delle decine di
migliaia compresa, al termine di ogni giro completo segnala il riporto, tramite ingranaggi,
alla ruota successiva che effettua uno scatto in senso orario memorizzando il valore.
Supponiamo di voler sommare 12 e 28:
ci limiteremo a rappresentare i due numeri tramite le ruote dentate.
Opereremo dunque nel seguente modo:
1. ruota di 1 scatto le decine
2. ruota di 2 scatti le unità
Figura 3: stato della Pascalina dopo il passo 2.
3. ruota di 2 scatti le decine
Figura 4: stato della Pascalina dopo il passo 3.
5
4. ruota di 8 scatti le unità
Da notare il fatto che alla fine del passo 4. la ruota delle unità avrà compiuto un giro
completo e dunque segnalerà il riporto alla ruota della decine, la quale aggiungerà uno
scatto.Naturalmente alla fine del passo 4. i rulli cartacei mostreranno nelle fessure della
riga superiore i numeri (Fig. 5):
Figura 5: stato della Pascalina dopo il passo 4.
Prima di passare alla seconda operazione è necessario azzerare la macchina. Per
mantenere un maggiore realismo di utilizzo abbiamo pensato di non implementare un
pulsante di “reset” ma bensì di lasciare l’azzeramento manuale della Pascalina vera e
propria.
La procedura di azzeramento consiste nei seguenti passi:
1. assegna ad ogni ruota gli scatti mancanti ad arrivare a 9 per arrivare ad avere la
seguente situazione (Fig. 6):
Figura 6: stato della Pascalina dopo il passo 1.
6
2. ruota di uno scatto la ruota delle unità
In questo modo dopo il passo 1 avremo un nove in ogni fessura superiore e
successivamente effettuando un ulteriore scatto alle unità trasmetteremo un riporto che
per un effetto a catena si trascinerà fino alla sesta ruota a sinistra, azzerando la macchina.
Siamo ora pronti ad effettuare la sottrazione.
Eseguiamo ad esempio l’operazione 5-3.
Poiché il complemento a 9 del numero 3 è 6 possiamo sommare a 5 (il nostro minuendo) il
numero 6 per ottenere 11 come risultato. A questo punto basta sommare mentalmente la
prima cifra, 1, alle rimanenti, nel nostro caso 1, ottenendo 2.
Questo è come dire:
5-3=5+6–9
ma anche:
5 – 3 = 5 + (6 – 9)
e quindi:
5 – 3 = 5 + (-3)
Si può, perciò, affermare che la Pascalina faceva le sottrazioni come somma di numeri
negativi utilizzando il metodo del complemento a 9 del sottraendo.
Arrivando alla pratica:
Supponiamo di voler sottrarre da 82 il 27:
Opereremo dunque nel seguente modo:
1. sposta verso l’alto la barra
2. ruota di 2 scatti le decine
3. ruota di 7 scatti le unità
Figura 7: stato della Pascalina dopo il passo 3.
7
A questo punto la macchina indicherà il numero 72 che è il complemento a 9 di 27. Questo
numero va sommato a 82 dopo aver riabbassato la barra e azzerato lo strumento,
procedendo con il metodo della somma. Il risultato mostrato è 154 e sommando 1 a 54
avremo finalmente 55.
Dopo aver azzerato lo strumento possiamo procedere con una moltiplicazione:
1. spostare la barra verso il basso
2. aggiungere il moltiplicando tante volte quante dice la prima cifra del moltiplicatore a
partire dalla prima ruota (Fig. 8)
3. ripetere il passo 2 tante volte quante sono le cifre del moltiplicatore usando ogni
volta la ruota successiva.
Supponiamo di voler moltiplicare 21 x 23
Inserisco 21 tre volte partendo dalla prima ruota arrivando ad avere:
Figura 8: stato della Pascalina dopo il passo 2.
poi inserisco 21 due volte partendo dalla seconda ruota, nelle fessure viene mostrato il
risultato corretto, 483.
Per quanto pionieristica fosse, la Pascalina non riusciva a svolgere in modo agevole e
poco oneroso le operazioni di divisione.
Queste operazioni erano comunque possibili ma dovevano essere svolte per mezzo di
sottrazioni successive.
8
Script
Second Life promuove un proprio linguaggio di scripting il Linden Script Language (LSL),
utile ad animare gli oggetti.
Poiché durante lo sviluppo ci è capitato molto spesso di ripetere per diversi oggetti script
pressoché identici, mostreremo solo quelli relativi ad una particolare sezione della
macchina, mettendo in evidenza quali parti di codice variano per le altre.
La ripetizione è stata una scelta obbligata anche dalla limitazione che il mondo virtuale di
Second Life offre mettendo a disposizione durante lo sviluppo di un oggetto, un solo livello
di gerarchia.
In questo modo non è possibile replicare sotto-oggetti del principale e “linkarli” come tali,
bensì tutti devono appartenere ad un unico oggetto con una sola ed unica “root prim”.
La struttura principale è sviluppata con un parallelepipedo, leggermente inclinato per
facilitare la visualizzazione della superficie di interesse. Questa parte ha come unica
funzionalità la descrizione dell’oggetto:
default
{
state_entry()
{
llSetText("Blaise Pascal's \"Pascaline\", 1642 \n \n \n \n \n \n ", <1.0,1.0,1.0>, 1.0);
}
on_rez(integer start_param)
{
llResetScript();
}
}
Con la stessa primitiva è stata realizzata la barra che copre le fessure ed i denti delle ruote
numerate e che si muove a coprire una delle due righe nella parte superiore.
Script per la barra:
string operazione = "+";
default
{
touch_start(integer total_number)
{
vector pos = llGetLocalPos();
if(operazione == "+")
{
operazione = "-";
pos += <0,0.22,0>;
}
else if(operazione == "-")
{
operazione = "+";
pos -= <0,0.22,0>;
}
llSetPos(pos);
}
on_rez(integer start_param)
{
// Restarts the script every time the object is rezzed
llResetScript();
}
}
9
State default:
touch_start: al tocco la barra si sposta o in alto o in basso, in base alla posizione
precedente memorizzata dalla variabile globale operazione.
Le restanti componenti sono cilindri più o meno schiacciati ed incastonati all’interno di altre
primitive.
Consideriamo la sezione relativa, ad esempio, alle centinaia.
Avremo 3 oggetti fondamentali, ovvero il rullo cartaceo, il raggio della ruota dentata, ed il
bullone numerato.
Stato default del rullo cartaceo:
integer scatti;
integer scatti_completati;
default
{
state_entry()
{
llListen(448, "", NULL_KEY, "");
}
listen( integer channel, string name, key id, string message )
{
if(channel == 448)
{
scatti = (integer)message;
state rotating;
}
}
on_rez(integer start_param)
{
llResetScript();
}
}
State default:
state_entry: il rullo si mette in ascolto sul canale chat 448.
listen: l’handler dell’evento intercetta un messaggio e dopo aver controllato che
proviene dal canale di interesse, pone l’oggetto allo state rotating.
Stato rotating del rullo cartaceo:
state rotating
{
state_entry()
{
scatti_completati = 0;
llSetTimerEvent(0.5);
}
timer()
{
rotation rot;
10
rotation delta;
if(++scatti_completati <= scatti)
{
rot = llGetLocalRot();
delta = llEuler2Rot(<0.0,0.0,36.0*DEG_TO_RAD>);
delta.s *= -1;
rot = delta * rot;
llSetLocalRot(rot);
}
else{
state default;
}
}
on_rez(integer start_param)
{
llResetScript();
}
}
State rotating:
state_entry: viene azzerata la variabile globale scatti_completati e viene impostato
un timer di 0,5 secondi per far si che la rotazione avvenga dando il senso del
movimento all’osservatore.
timer: intercetta l’evento scatenato dal timer e compie una rotazione del rullo di 36
gradi, a meno che non abbia completato gli scatti da eseguire, e quindi è possibile
ritornare allo stato di default.
Stato default del raggio della ruota dentata:
integer scatti;
integer scatti_completati;
default
{
state_entry()
{
llListen(448, "", NULL_KEY, "");
}
listen( integer channel, string name, key id, string message )
{
if(channel == 448)
{
scatti = (integer)message;
state rotating;
}
}
on_rez(integer start_param)
{
llResetScript();
}
}
State default:
state_entry: il raggio si mette in ascolto sul canale chat 448.
listen: l’handler dell’evento intercetta un messaggio e dopo aver controllato che
proviene dal canale di interesse pone l’oggetto allo state rotating.
11
Stato rotating del raggio della ruota dentata:
state rotating
{
state_entry()
{
scatti_completati = 0;
llSetTimerEvent(0.5);
}
timer()
{
rotation rot;
rotation delta;
if(++scatti_completati <= scatti)
{
rot = llGetLocalRot();
delta = llEuler2Rot(<0.0,0.0,36.0*DEG_TO_RAD>);
delta.s *= -1;
rot = delta * rot;
llSetLocalRot(rot);
}
else{
state default;
}
}
on_rez(integer start_param)
{
llResetScript();
}
}
State rotating:
state_entry: viene azzerata la variabile globale scatti_completati e viene impostato
un timer di 0,5 secondi per far si che la rotazione avvenga dando il senso del
movimento all’osservatore.
timer: intercetta l’evento scatenato dal timer e compie una rotazione del raggio di 36
gradi, a meno che non abbia completato gli scatti da eseguire, e quindi è possibile
ritornare allo stato di default.
Stato default del bullone della ruota dentata:
list NUMS = ["1","2","3","4","5","6","7","8","9"];
integer scatti;
integer scatti_completati;
integer scatti_effettivi = 0;
default
{
state_entry()
{
llListen(448, "", NULL_KEY, "");
}
touch_start(integer total_number)
{
llDialog(llDetectedKey(0),"Scegliere di quante tacche girare\nla ruota delle centinaia.", NUMS, 448);
}
listen( integer channel, string name, key id, string message )
{
if(channel == 448)
{
12
scatti = (integer)message;
state rotating;
}
}
link_message(integer sender_num, integer num, string str, key id)
{
if(str == "3"){
llSay(448, "1");
// questo si fa perchè altrimenti il bullone non
// riesce a parlare con se stesso e quindi non gira.
// This is a little hack.
scatti = 1;
state rotating;
}
}
on_rez(integer start_param)
{
llResetScript();
}
}
State default:
state_entry: il bullone si mette in ascolto sul canale chat 448.
touch_start: al tocco del bullone compare un Dialog per permettere all’utente di
scegliere tra gli input elencati nella list globale NUMS indicante i possibili scatti da
eseguire sulla relativa ruota (Fig. 9).
Figura 9: dialog di input per la scelta del numero di scatti
listen: viene intercettato l’input dell’utente.
link_message: l’handler intercetta i messaggi degli oggetti linkati con il bullone, in
particolare del bullone delle decine che comunica un eventuale riporto.
Stato rotating del bullone della ruota dentata:
state rotating
{
state_entry()
{
scatti_completati = 0;
llSetTimerEvent(0.5);
}
timer()
13
{
rotation rot;
rotation delta;
if(++scatti_completati <= scatti)
{
rot = llGetLocalRot();
delta = llEuler2Rot(<0.0,0.0,36.0*DEG_TO_RAD>);
delta.s *= -1; // little hack
rot = delta * rot;
llSetLocalRot(rot);
}
else{
if(scatti_effettivi + scatti > 9)
{
scatti_effettivi = (scatti_effettivi + scatti) - 10;
llMessageLinked(LINK_SET, 0, "4", NULL_KEY);
}
else
{
scatti_effettivi += scatti;
}
llSetTimerEvent(0);
state default;
}
}
on_rez(integer start_param)
{
llResetScript();
}
}
State rotating:
state_entry: viene azzerata la variabile globale scatti_completati e viene impostato
un timer di 0,5 secondi per far si che la rotazione avvenga dando il senso del
movimento all’osservatore.
timer: ogni 0,5 secondi avviene uno scatto di 36 gradi a meno che non li abbia già
effettuati tutti e quindi posso controllare e segnalare l’eventuale riporto e poi
ritornare allo stato di default.
Successivamente, ad ogni oggetto è stata applicata una texture per l’upload della quale, è
necessario pagare 10 L$, reperibili all’interno del mondo virtuale con relativa facilità.
14
Conclusioni
Siamo dunque riusciti con successo, a realizzare in un mondo virtuale, una riproduzione
funzionante della macchina calcolatrice inventata da Blaise Pascal nel 1642, capace di
effettuare le operazioni aritmetiche elementari di somma, addizione e moltiplicazione.
Su tutti gli elementi fabbricati sono stati concessi i permessi di modifica e di copia ed
incluse nel box contenitore anche le texture utlizzate durante lo sviluppo.
In tal modo possono essere cambiate a proprio piacimento le dimensioni e le
caratteristiche dell’oggetto.
Una possibile e considerevole espansione del progetto, potrebbe essere quella di
aggiungere una rappresentazione grafica del funzionamento interno della macchina,
dunque creare ad uno ad uno tutti i suoi ingranaggi, al fine di assicurarsi una maggiore
comprensione da parte degli utenti del futuro museo dell’informatica.
SITOGRAFIA
Riferimenti Web
Second Life Wiki. (2008)
http://wiki.secondlife.com/wiki/LSL_Portal
Wikipedia (2008)
http://it,wikipedia.org/wiki/Pascalina
15

Documenti analoghi

Pascalina - percorsi mediali

Pascalina - percorsi mediali Pascalina è punto di riferimento per la costruzione delle successive calcolatrici. La prima Pascalina, Pascal la realizza per aiutare il padre, funzionario d’imposte, ed è utilizzata per gestire la...

Dettagli