GEObject: un ambiente di modellazione geometrica 2D, interattivo, incrementale ed object oriented

Maria Alberta Alberti, Paolo Evi, Daniele Marini

Dipartimento di Scienze dell'Informazione
Via Comelico 39 - 20135 MILANO - Italy
tel: +392 55006 358
fax: +392 55006 334

Sommario

Diverse tecniche di modellazione geometrica

Gli approcci tradizionali alla modellazione geometrica interattiva si basano sulla descrizione algebrica dei vincoli geometrici. Per mentenerne la consistenza durante le trasformazioni geometriche, si ricorre a dei "solutori di vincoli" (constraint solver ) numerici. Infatti una figura è pensata come il luogo dei punti dello spazio che soddisfano un determinato sistema di equazioni, applicare una trasformazione geometrica significa quindi cambiare i termini noti delle equazioni e risolvere nuovamente il sistema. Questo approccio, che richiede all'utilizzatore una conoscenza matematica elevata, presenta il limite di non fornire soluzioni sempre predicibili (i vincoli, infatti, possono non definire univocamente una figura), oltre all'elevato costo computazionale per il mantenimento dei vincoli stessi.

L'approccio adottato in GEObject è viceversa di tipo procedurale, si basa cioè sulla specifica costruttiva delle proprietà geometriche e delle relazioni (o vincoli) tra gli oggetti che compongono la figura. Attraverso l'interfaccia grafica l'utente è in grado di realizzare complesse figure geometriche mimando l'approccio manuale del disegnatore che faccia uso di riga e compasso. La costruzione geometrica cosi' realizzata definisce un insieme di vincoli tra gli oggetti che compongono la figura. Quand si sottopone una figura così costruita a una trasformazione geometrica, vengono ripetuti automaticamente tutti i passi della costruzione, a partire dalla nuova posizione degli oggetti trasformati. Questo procedimento garantisce la consistenza dei vincoli imposti durante la costruzione.

Per capire meglio questo approccio supponiamo di voler disegnare un segmento ed il proprio asse; dopo aver tracciato un segmento a partire dai suoi estremi A e B, si determina la retta ortogonale al segmento e passante per il suo punto medio. Usando riga e compasso è possibile ottenere tale retta disegnando 2 cerchi centrati rispettivamente in ciascun estremo del segmento e con raggio pari al segmento stesso, e intersecandoli per ottenere la coppia di punti per i quali passa l'asse del segmento. In figura 1 è mostrato il risultato del procedimento.

Alla figura così ottenuta è possibile applicare delle trasformazioni, per esempio traslare un estremo del segmento. Dopo una tale operazione l'asse precedentemente disegnato non sarà più tale, ma sarà comunque possibile ricalcolarne la nuova posizione ripetendo automaticamente il processo di costruzione precedentemente realizzato (vedi figura 2).

Usando il paradigma riga-compasso come tecnica di modellazione geometrica si ottengono cosi' due grossi benefici: si evita di dover specificare algebricamente i vincoli tra gli oggetti (il che richiederebbe all'utilizzatore una buona preparazione matematica) e non si deve ricorrere ad un constraint solver numerico per mantenere i vincoli in seguito ad una trasformazione geometrica (con notevole riduzione del costo computazionale).

Fig 1 - Costruzione asse del segmento

Fig 2 - Trasformazione asse del segmento

L'interfaccia di GEObject

Il sistema GEObject fornisce un insieme base di strumenti per eseguire costruzioni geometriche. Essi possono essere divisi in: oggetti primitivi, metodi di creazione e metodi di interazione. Come si vedrà nei successivi paragrafi si possono estendere gli strumenti base, definendone di nuovi. In questo senso GEObject si presenta come un sistema incrementale.

Gli oggetti primitivi sono un insieme di entità geometriche che possono essere direttamente istanziate (ovvero disegnate) dall'utente: sono il punto, la retta, la semiretta, il segmento, il cerchio, l'arco, l'angolo, il poligono. Premendo il bottone sinistro del mouse in un qualunque punto del foglio da disegno, verrà visualizzato un menù dove sono elencate queste entità geometriche di base. Come si puo' vedere in figura 3 esse sono strutturate secondo una gerarchia (evidenziata dalla indentazione) che riflette la gerarchia interinseca nella geometria euclidea. Il sistema è stato infatti costruito in modo perfettamente aderente alla disciplina che si propone di studiare: questa è una condizione irrinunciabile che ogni buon sistema orientato alla didattica deve possedere.

Una volta selezionato l'oggetto che si vuole disegnare, sarà neccessario indicare quale, tra i metodi di creazione, si vuole utilizzare. Per esempio un cerchio puo' essere disegnato a partire dal suo centro e da un altro punto, o a partire da 3 punti non allineati, o a partire dal centro e dal raggio ... (vedi figura 4). Una volta selezionato il metodo di creazione, l'utente è invitato a specificare i parametri neccessari a tracciare l'oggetto richiesto, che potrà cosi' venire disegnato.

Quando un oggetto geometrico viene disegnato esso non è semplicemente un insieme di pixel attivati sullo schermo: esso continua ad essere un vero e proprio oggetto geometrico che ne conserva tutte le sue proprietà, a loro volta derivate dalla classe di appartenenza.

Questo risulta evidente se, invece di premere il mouse sullo sfondo, lo si preme su un oggetto precedentemente disegnato. Il sistema riconosce l'azione di interrogazione dell'oggetto e fornisce un menù di metodi di interazione (specifici per ogni classe di oggetti) con i quali manipolare l'oggetto stesso (figura 5).

Tra i metodi di interazione principali c'è il metodo traslazione (per applicare una trasformazione geometrica di traslazione; è comune a tutti gli oggetti geometrici), il metodo hide (per nascondere un oggetto) ed il metodo intersect che è lo strumento fondamentale per creare legami, cioè vincoli, tra gli oggetti geometrici.

Fig 3 - Menu oggetti geometrici

Fig 4 - Metodi di creazione del cerchio

Fig 5 - Metodi di interazione della retta

Riepilogando, l'interfaccia di GEObject fornisce 3 classi di strumenti atti a creare e manipolare figure geometriche:

gli oggetti primitivi:
ordinati secondo la gerarchia della geometria euclidea
i metodi di creazione:
diversi per ogni oggetto primitivo, che consentono di disegnare lo stesso oggetto a partire dall'insieme di parametri più convenienti
i metodi di interazione:
anch'essi specifici per ogni tipo di oggetto, che consentono di manipolare le entità disegnate e di stabilire vincoli geometrici tra esse.

GEObject e le trasformazioni geometriche

Un potente strumento fornito da GEObject, come detto, è sicuramente quello delle trasformazioni geometriche. Poter modificare una figura nella sua forma e dimensione, conservandone pero' le proprietà geometriche e le relazioni con altri oggetti geomtrici (come per esempio vincoli di parallelismo, di ortogonalità, ...) è estremamente utile sia per verificare teoremi e proprietà geometriche, sia per analizzare il comportamento di meccanismi cinematici, ovvero meccanismi di aste rigide incernierate tra loro (per esempio bielle, pantografi ecc.). E' quindi estremamente importante capire come sia possibile attuare delle trasformazioni e che tipo di trasformazioni possono essere applicate ad una particolare figura geometrica.

Abbiamo visto che una figura è un insieme di oggetti geometrici eventualmente vincolati tra loro. Le trasformazioni vengono normalmente applicate individualmente ai singoli oggetti geometrici costituenti la figura, ma saranno automaticamente trasmesse (propagate) a tutti gli altri oggetti collegati da una costruzione, cosi' che l'intera figura risulterà trasformata.

Nell'esempio precedente, di costruzione dell'asse del segmento, quando se ne trasla un estremo l'intera figura si modifica in funzione della nuova posizione. Ma cosa succede se invece di traslare un estremo del segmento trasliamo il segmento intero o addirittura il suo asse? La trasformazione che otteniamo sarà quella che ci aspettiamo?

Prima di discutere le diverse trasformazioni possibili in un caso del genere, è neccessario distinguere, all'interno di una figura, tra oggetti primitivi e oggetti derivati. Gli oggetti primitivi, che possono essere solo punti, sono quelli direttamente istanziati dall'utente sul foglio da disegno "cliccando" liberamente su di esso. Essi, dunque, non sono creati come intersezione tra altri oggetti percio' sono privi di vincoli. Ogni altro oggetto disegnato, il quale quindi dipenderà direttamente o indirettamente dai punti primitivi, è detto oggetto derivato. Nella costruzione dell'asse del segmento, gli estremi A e B sono gli unici punti primitivi, mentre il segmento, i 2 cerchi e l'asse stesso sono tutti oggetti derivati.

Quando si applica una trasformazione geometrica ad un qualunque oggetto, normalmente esistono molteplici configurazioni che soddisfano sia la nuova posizione dell'oggetto trasformato sia i vincoli geometrici imposti. Per esempio quando trasliamo un estremo del segmento, perchè l'intera figura non trasla rigidamente? Di fronte a questa ambiguità il sistema deve compiere una scelta che, nel caso di oggetti primitivi, corrisponde a ridisegnare l'intera figura a partire dalla nuova posizione degli oggetti primitivi (il sistema quindi scarta la traslazione rigida dell'intera figura). Nel caso di oggetti derivati l'azione di default scelta dal sistema, è la traslazione rigida della figura. Tuttavia, l'utente puo' guidare il sistema ad applicare trasformazioni diverse, in particolare costruzion inverse.

Fig 6 - Costruzione punto medio del segmento

Le costruzioni inverse

Consideriamo l'esempio del
punto medio di un segmento. Esso si ottiene dalla costruzione precedente dell'asse di un segmento intersecando l'asse con il segmento stesso. Dopo aver "nascosto" (metodo di interazione hide) gli oggetti intermedi della costruzione, analizziamo i diversi tipi di trasformazioni che è possibile applicare alla figura:

traslazione dell'estremo A:
il segmento si allunga o si accorcia ed il punto M si riposiziona sempre correttamente al centro del segmento
trasformazione dell'intero segmento:
otteniamo una traslazione rigida del segmento, degli estremi A e B e del punto medio M
trasformazione del punto medio M:
ancora una volta otteniamo una traslazione rigida dell'intera figura.
Mentre nei casi 1 e 2, il comportamento ottenuto è quello atteso, nel terzo caso esso puo' apparire perlomeno insolito, anche se è giustificato da quanto abbiamo detto nel paragrafo precedente: la trasformazione di un oggetto derivato provoca la traslazione rigida dell'intera figura, e sia il segmento, sia il punto M sono oggetti derivati. Rispetto all'azione di default scelta dal sistema, l'utente potrebbe tuttavia desiderare che, muovendo M, un estremo resti fisso (per esempio A) e l'altro ricalcoli la propria posizione in funzione di A ed M. Ma il sistema non ha la conoscenza per fare questo, in altre parole non conosce la costruzione inversa, neccessaria per ricavare B a partire dall'estremo A e dal punto medio M. Essa è mostrata in figura 7: partendo da A ed M (punti primitivi), si traccia la semiretta con origine in A e passante per M, quindi il cerchio centrato in M e passante per A e l'intersezione tra cerchio e semiretta produce il punto B. La nuova figura si comporta esattamente nel modo desiderato ovvero traslando M l'estremo A rimane fissato e B viene ricalcolato in funzione di A ed M (figura 8). Ora pero', se proviamo a trasformare B, l'intera figura trasla rigidamente. Tutto questo è giustificato dal fatto che questa volta M è un punto primitivo, mentre B è un punto derivato.

Per ottenere entrambi i comportamenti su un'unica figura è neccessario sovrappore la costruzione di figura 7 a quella di figura 6. In altre parole, partendo dai punti A e B prima si genera il punto M come descritto in figura 6, poi a partire da A ed M si costruisce B' attraverso la costruzione di figura 7. Cosi' facendo, ovviamente, si genereranno punti doppi: B e B', i quali, anche se occupano fisicamente la stessa posizione, sono di fatto 2 entità distinte. Sta all'utente segnalare la coincidenza tra essi cosi' che il sistema possa trattarli in modo uniforme.

La costruzione di figura 7 potrà essere poi riprodotta simmetricamente per ottenere un nuovo punto A' (coincidente con A) a partire da B e da M, in modo da avere un comportamente completamente simmetrico.

Fig 7 - Costruzione inversa del punto medio del segmento AB>

Fig 8 - Trasformazione inversa del punto medio

Per meglio capire come sono fatte queste costruzioni, abbiamo definito un formalismo grafico: il GCG (Grafo Associato ad una costruzione Geometrica) [Evi94]. Si tratta di un grafo orientato bipartito, in cui i nodi circolari rappresentano oggetti geometrici, i nodi rettangolari rappresentano azioni (ovvero metodi di creazione o di interazione) e gli archi, che uniscono solo nodi di tipo diverso, definiscono per ogni azione quali sono i parametri e quali sono gli oggetti risultanti. In figura 9 è rappresentato il GCG associato alla costruzione del punto medio di un segmento, in figura 10 la costruzione inversa ed in figura 11 la costruzione completa per ottenere ogni tipo di trasformazione.

Ma vediamo ora tutte le possibili costruzioni che è possibile ottenere con la costruzione di figura 11:

   Trasformazione su:               Vincoli                     Effetto            
        segmento                                        traslazione rigida del     
                                                            segmento stesso        
            A                                           stiramento del segmento    
                                                              con B fisso          
            B                                           stiramento del segmento    
                                                              con A fisso          
            M                     A ancorato           A fisso, B è ricalcolato    
                                                         in funzione di A ed M     
            M                     B ancorato           B fisso, A è ricalcolato    
                                                         in funzione di B ed M     
            A                     M ancorato                  B si sposta          
                                                         simmetricamente ad A      
                                                             rispetto ad M         
            B                     M ancorato                  A si sposta          
                                                          simmetricamente a B      
                                                             rispetto ad M         

Ogni ulteriore vincolo di ancoraggio rende impossibile qualunque movimento.

Fig 9 - GCG per la costruzione del punto medio di un segmento

Fig. 10 - GCG per la costruzione inversa del punto medio

Fig. 11 - GCG completo per la costruzione del punto medio di un segmento

GEObject: uno strumento per studiare la geometria euclidea

In questo paragrafo verranno presentati alcuni esempi di utilizzo di GEObject come strumento didattico per lo studio di proprietà e teoremi della geometria. GEObject non ha nulla a che vedere con i dimostratori automatici di teoremi, ma grazie al potente meccanismo di trasformazione delle figure rende possibile formulare e verificare congetture di carattere geometrico. Supponiamo di voler verificare il seguente teorema: la somma degli angoli interni ad un triangolo qualunque è 180 gradi. Sarà sufficiente costruire un triangolo generico, costruire i 3 angoli interni, quindi calcolarne il valore numerico (metodo di interazione value per l'entità angolo) e quindi la loro somma (è disponibile il metodo di addizione). Il risultato è mostrato in
figura 12. Sarà possibile ora modificare il triangolo, per esempio traslando un vertice, o un segmento o l'intero triangolo, per verificare la validità del teorema.

Un noto teorema sui quadrilateri afferma che: dato un qualunque quadrilatero e collegati i punti medi dei suoi lati con segmenti, la figura risultante è un parallelogramma. La verifica di questo teorema richiederà la costruzione di un poligono di 4 lati e di calcolare su ognuno di essi il punto medio. Quindi si procede costruendo un secondo poligono avente per vertici i punti medi cosi' ottenuti. Appare evidente che, il secondo poligono è un parallelogramma e resterà tale anche in seguito a qualunque trasformazione sui vertici o sui lati dei poligoni. Per rendere più ampia la gamma di trasformazioni possibili, si puo' realizzare per ogni punto medio la costruzione inversa, come descritto nel paragrafo precedente.

Nell'ambito della geometria, molte figure sono definite come luogo geometrico dei punti del piano che soddisfano determinate condizioni. E' il caso per esempio dell'ellisse o dell'iperbole. GEObject consente anche di provare questo tipo di proprietà geometriche. Supponiamo per esempio di voler disegnare un ellisse, ovvero il luogo geometrico dei punti del piano la cui somma delle distanze da due punti fissi detti fuochi è costante. Definiamo, attraverso un segmento, la somma delle distanze dai fuochi. Dividiamo poi il segmento con un punto P, libero di muoversi sopra di esso (per fare questo è sufficiente ottenere P come intersezione tra il segmento ed una generica retta non parallela, in modo che traslando uno dei punti che definiscono la retta, il punto P si muove lungo il segmento). Il primo pezzo del segmento (AP) rappresenterà la distanza dei punti dell'ellisse dal primo fuoco, mentre il secondo pezzo (PB), rappresenterà la distanza dal secondo fuoco. Per trovare ora i punti dell'ellisse sarà sufficiente disegnare 2 circonferenze centrate nei 2 fuochi e con raggio pari rispettivamente al primo pezzo e al secondo pezzo del segmento. L'intersezione tra queste circonferenze saranno 2 punti dell'ellisse. Facendo variare il punto P lungo il segmento, le circonferenze cambieranno raggio e la loro intersezione genererà progressivamente tutti i punti dell'ellisse (figura 13). Modificando la posizione dei fuochi, la loro distanza e la lunghezza del segmento è possibile a livello teorico tracciare tutte le possibili ellissi. Inoltre è facile verificare cosa succede se la distanza tra i fuochi è maggiore della lunghezza del segmento.

Fig 12 - Verifica teorema somma angoli interni di un triangolo

Fig 13 - Ellisse come luogo di punti

GEObject: uno strumento per studiare i cinematismi

Da tempo si adottano costruzioni geometriche per rappresentare cinematismi, quai, ad esempio: congegni per aprire porte o finestre, sospensioni, bielle, etc... La struttura stessa del corpo umano e dei vertebrati in genere è costituita da ossa (le aste) e articolazioni (le cerniere e giunti). Grazie a questi semplici meccanismi è stato possibile costruire macchine in grado di trasmettere e amplificare forze consentendo di compiere operazioni predeterminate con risparmio di fatica e tempo e con caratteristiche di uniformità e precisione.

Grazie al versatile algoritmo di trasformazione implementato in GEObject è possibile simulare, studiandone il comportamento in diverse configurazioni, molti di questi cinematismi. Nel seguito verranno presentati solo alcuni semplici esempi, ma sta alla fantasia dell'utilizzatore di GEObject costruire e animare qualunque cinematismo, purchè si apossibile desriverlo attraverso una costruzione geometrica.

Il primo esempio è quello della biella (si veda figura 14). Una biella è un meccanismo costituito da un disco nel quale è incernierato l'estremo (P1) di un'asta rigida (asta), avente l'altro estremo (P2) vincolato a scorrere all'interno di una guida rettilinea. In una biella reale, facendo ruotare il disco, il perno P1 trascina l'asta che rimane comunque vincolata nell'altro suo estremo, che è obbligato a seguire un movimento rettilineo. Viceversa, facendo scorrere P2 nella sua guida, l'asta rigida fa ruotare il disco della biella. Con tale meccanismo è possibile convertire un movimento circolare in uno rettilineo e viceversa.

Nella biella è dunque presente un movimento diretto (da P1 verso P2) e uno inverso (da P2 verso P1), di conseguenza il modello che dobbiamo realizzare con GEObject per simulare la biella, dovrà contenere una costruzione diretta ed una inversa. Partiamo dunque col descrivere la costruzione diretta (figura 15). Gli elementi invarianti del modello sono: la lunghezza dell'asta rigida, il disco della biella e la guida rettilinea. Si procederà quindi col disegnare un segmento (per definire la lunghezza dell'asta), un cerchio (il disco) ed una retta (la guida). Faremo inoltre in modo che la distanza tra qualunque punto sul cerchio e la retta sia inferiore alla lunghezza del segmento (in caso contrario ci sarebbero alcune configurazioni della biella che la porterebbero ad una "rottura").

Invece di fare ruotare il cerchio intorno al suo centro possiamo pensare di avere un punto vincolato a muoversi lungo la circonferenza. Per fare cio' è sufficiente tracciare una semiretta con origine nel centro del cerchio e passante per un punto qualsiasi (C) che sarà il nostro punto di controllo. Intersecando la semiretta con il cerchio si ottiene cosi' il punto P1 che rappresenta l'estremo dell'asta rigida, vincolato sulla circonferenza. Muovendo liberamente C, il punto P1 scorrerà sulla circonferenza. A questo punto è neccessario collegare a P1 l'asta rigida di lunghezza pari al segmento 1. Per fare cio' basta tracciare una circonferenza centrata in P1 e raggio pari al segmento 1. L'intersezione con la retta "guida" ci permetterà di ottenere il secondo estremo dell'asta rigida P2. E' evidente dalla costruzione che, muovendo liberamente il punto C, l'estremo P1 scorre lungo la circonferenza e P2 lungo la guida. La distanza tra P1 e P2 sarà sempre la stessa e precisamente pari alla lunghezza del segmento di riferimento. Abbiamo ottenuto il movimento diretto della biella. Passiamo ora a quello inverso.

Fig. 14 - Il cinematismo della biella

Fig. 15 - Costruzione diretta della biella

Cio' che ci serve è di poter muovere il punto P2 lungo la guida. Tuttavia P2 è un oggetto derivato quindi, per quanto detto in precedenza, ogni suo movimento provocherebbe la traslazione rigida dell'intera figura. Per rendere P2 mobile lungo la guida dobbiamo applicareuna costruzione inversa: si tracci una retta per P2 e per un qualunque punto non appartenente alla guida. Intersecando tale retta con la guida si ottiene un nuovo punto (diciamo P2') sovrapposto a P2. Imponendo a questi due punti la relazione di coincidenza comunichiamo al sistema di trattare P2 non come punto derivato ma come punto primitivo, per cui sarà possibile muoverlo liberamente lungo la guida. Ora dobbiamo far si che muovendo P2 anche l'asta rigida venga trascinata e di conseguenza anche P1 scorra lungo la circonferenza. Disegnamo dunque un nuovo cerchio centrato in P2' e raggio pari alla lunghezza dell'asta rigida (segment1). Intersechiamo tale cerchio con il disco della biella ottenendo cosi' due punti uno dei quali (P1') perfettamente sovrapposto a P1,e imponiamo anche ad essi la relazione di coincidenza .

Tutto sembra funzionare: sia muovendo il punto di controllo C sia muovendo P2, accade che P1 ruota lungo il disco della biella, P2 scorre lungo la guida e la loro distanza è fissa e pari alla lunghezza di segment1. Tuttavia vanno notate alcune cose: quando si muove P2 è vero che viene spostato P1' e quindi P1, ma non viene spostato C in quanto non esiste una costruzione inversa che permetta di calcolare C a partire dal centro della circonferenza e da P1'. Cio' porta ad una inconsistenza in quanto P1, per definizione, è dato dall'intersezione tra il cerchio e la semiretta passante per A e C. Per ovviare a questo è neccessario realizzare la seguente costruzione inversa: cerchio centrato in A e passante per C, semiretta con origine in A e passante per P1'; l'intersezione produrrà il punto C' che viene posto coincidente con C.

Il movimento di P2 lungo la guida deve restare entro un determinato intervallo altrimenti è impossibile che l'asta connetta rigidamente cerchio e guida: cio' equivale ad una rottura della biella. Affinchè il sistema controlli questa condizione, è sufficiente fissare un "vincolo di esistenza sul punto P1' " (metodo forced to exist per oggetti di tipo punto). In questo modo quando si tenta di spostare P2 oltre l'intervallo di ammissibilità, l'intersezione tra la parte circolare della biella e il cerchio centrato in P2' diviene vuota (P1' cessa di esistere); il sistema se ne accorge ed inibisce il movimento.

Un secondo cinematismo che vogliamo riportare è quello che simula il meccanismo di apertura e chiusura delle porte dell'ascensore (figura 16). Per motivi di brevità non descriveremo l'intera costruzione (che comunque è relativamente semplice non includendo costruzioni inverse). Daremo comunque alcune indicazioni su come è stata realizzata invitando il lettore a provarla direttamente.

Il funzionamento delle due porte è del tutto simmetrico, per cui ci limiteremo a descriverne solo la parte sinistra (guardando il disegno). Ci sono 3 aste rigide collegate in cascata tra loro con dei giunti mobili che ne permettono la rotazione dell'una rispetto altra. Esse sono: CA, CE (incernierata nel punto fisso P2) ed EG. In comune alle due porte esiste poi un'ulteriore asta AB vincolata a ruotare intorno al suo punto medio P1.

Il punto G è fisso sulla porta dell'ascensore. Facendo ruotare l'asta AB intorno al proprio centro, le porte si aprono e si chiudono. Provare per credere ...

Fig.16 - Cinematismo delle porte dell'ascensore

Rappresentazione della geometria euclidea con il paradigma ad oggetti

GEObject è stato scritto con il linguaggio Eiffel [Mey91], versione 2.3, estendendo la libreria delle classi predefinite. Si è scelto questo linguaggio proprio per la sua caratteristica di linguaggio fortemente tipizzato che lo rende adatto alla descrizione della geometria euclidea, una materia apparentementa tanto semplice quanto rigorosa. In questa sezione descriveremo brevemente l'analisi e la progettazione delle classi Eiffel in grado di descrivere la geometria euclidea.

Ogni entità geometrica fondamentale è stata astrattamente descritta da una classe Eiffel. E' stata dunque creata la classe GeoPoint, la classe GeoLine, la classe GeoHalfline e cosi' via. Per coerenza con la tassonomia della geometria euclidea si è fatta discendere la classe GeoHalfline dalla classe GeoLine, la GeoSegment dalla GeoHalfline, la classe GeoArc dalla classe GeoCircle ...

Ogni classe contiene una feature per ogni metodo di creazione ed una feature per ogni metodo di interazione specifico della classe, ereditando eventualmente altri metodi dalle classi antenate. In questo modo abbiamo potuto descrivere con rigore e coerenza tutte le entità geometriche con le loro proprietà.

Per permettere di definire entità geometriche "composte" ovvero costituite da più elementi semplici (come puo' essere per esempio un poligono che è costituito da n segmenti, o una spirale che è costituita da un certo numero di archi) è stata predefinita la classe GeoLink. Si tratta di una classe deferred (o astratta) che implementa certi metodi (come per esempio il metodo di intersezione) utilizzabili da qualunque classe discendente.

Fig. 17 - Classi Eiffel per astrarre le entità geometriche in GEObject

L'insieme di queste classi permette di definire coerentemente la geometria euclidea; esse sono strutturate in modo da garantirne l'estendibilità ad altre entità geometriche. Tuttavia le classi non sono sufficienti a descrivere una generica costruzione. Quest'ultima non è altro che un insieme di nodi (che possono essere oggetti geometrici o anche valori numerici (detti visori) come per esempio quelli usati in figura 12), connessi tra loro da legami che ne specificano la dipendenza costruttiva (corrispondono agli archi del GCG). Per rappresentare tali costruzioni è stata definita la classe deferred GeoNode. Ogni oggetto prodotto in una costruzione geometrica discende da GeoNode. Questa classe implementa variabili per definire vincoli tra i nodi (un array di antenati ed una lista di discendenti), variabili per definirne l'identità (il nome), ed introdce metodi la cui implementazione sarà specificata solo nelle classi discendenti (per esempio il metodo translate).

Ad un successivo livello di astrazione, possiamo riconoscere tra i nodi di una costruzione, delle entità geometriche oppure i cosiddetti visori. Le prime verranno astrattamente descritti dalla classe deferred GeometricObj, i secondi dalla classe GeoValue. In GeometricObj saranno dichiarati alcuni metodi (per esempio intersect, point on, ecc.) la cui implementazione sarà definita nelle classi discendenti che descrivono le entità geometriche vere e proprie. Tali classi rappresentano l'ultimo livello di astrazione delle nostre costruzioni geometriche. Esse discenderanno da GeometricObj o da qualche altra entità geometrica, ed implementeranno tutti i metodi introdotti nelle antenate (translate, intersect, ...) più i propri.

I discendenti della classe GeoValue saranno invece i differenti tipi di visori che è possibile avere, come per esempio il visore che riporta la lunghezza di un segmento, la misura di un angolo, ecc.

La gerarchia completa è riportata in figura 17. Per una descrizione più dettagliata si faccia riferimento a [Evi94].

Definizione di nuovi strumenti da parte dell'utente

In questa sezione presenteremo GEObject come sistema incrementale, ovvero sistema in grado di accrescere progressivamente le proprie funzionalità. Come descritto in precedenza, l'utente ha a disposizione tre strumenti fondamentali per realizzare le costruzioni geometriche: entità geometriche primitive, metodi di creazione e metodi di interazione.

In generale, una qualunque costruzione riga compasso, puo' essere ottenuta da un insieme molto ristretto di strumenti; tuttavia puo' essere comodo avere già predefiniti e pronti all'uso il maggior numero di strumenti (ovvero di costruzioni) possibile, onde evitare di ripetere ogni volta una costruzione complessa.

Si pensi per esempio alla costruzione del pentagono regolare (si veda figura 18). Tale costruzione è molto elaborata e, se l'utente deve ripeterla più di una volta, rischia di commettere errori, senza contare la perdita di tempo. Per questo motivo è data la possibilità di "insegnare" al sistema la costruzione del pentagono, in modo da inserire la classe pentagono tra quelle degli oggetti primitivi.

Fig.18 - Costruzione del pentagono

Fig. 19 - Editor delle classi

Fig.20 - Nuova classe Pentagon tra le classi predefinite

Fig.21 - Metodi di creazione del quadrato

Esistono a tale scopo due editor: quello dei metodi di creazione, per definire nuove classi di oggetti e nuovi metodi per disegnarli, e quello dei metodi di interazione, per definire nuove operazioni sugli oggetti disegnati.

Supponiamo di voler definire la nuova classe dei pentagoni: una volta realizzata la costruzione di figura 18, sarà sufficiente invocare l'editor delle classi (menu EDIT, voce creation method), quindi il sistema richiederà all'utente di selezionare il risultato della costruzione (ovvero il pentagono) poi i parametri a partire dai quali è stata realizzata (per esempio un lato o 2 vertici) ed infine verrà richiesto (figura 19) il nome della nuova classe (Pentagon), la classe di discendenza (Polygon) ed un nome per il metodo di creazione.

A questo punto il sistema memorizzerà la costruzione ed inserirà la nuova entità geometrica tra quelle preesistenti (figura 20).

Si noti che la nuova classe viene messa in discendenza con quella dei poligoni dalla quale eredita tutti i metodi di interazione ovvero il comportamento. Per disegnare un nuovo pentagono è ora sufficiente selezionare la voce Pentagon nel menù delle classi e specificare i parametri richiesti (2 vertici). Sui pentagoni cosi' disegnati sarà possibile effettuare qualunque operazione applicabile ai poligoni, più eventualmente altre che l'utente voglia definire.

Un analogo discorso vale per i metodi di creazione: l'utente puo' definirne di nuovi per ciascuna delle classi esistenti a seconda di come è più comodo per lui disegnare tali oggetti. Per esempio, un quadrato viene normalmente costruito a partire da due vertici. Tuttavia, l'utente puo' avere la neccessità di disegnarlo a partire dalla sua diagonale. Realizzerà dunque un'appropriata costruzione, quindi invocherà l'editor dei metodi di creazione specificando il nome del nuovo metodo (with diagonal), poi il prototipo (cioè il quadrato) ed in ultimo i parametri (la diagonale). Il sistema inserirà automaticamente il metodo tra quelli già esistenti per il quadrato (figura 21).

Infine è possibile definire nuovi metodi di interazione. Si supponga di aver bisogno di un metodo per tracciare la mediana di un generico triangolo. La costruzione per realizzare cio' consiste nel calcolare il punto medio di uno dei lati e di unirlo con il vertice opposto. Invocando poi l'editor dei metodi di interazione (menu EDIT, voce interaction method) il sistema richiederà il prototipo (cioè la mediana), i parametri (cioè il triangolo) ed il nome del nuovo metodo; dopodichè lo inserirà tra i metodi predefiniti della classe triangle. Ogni altra classe discendente da Triangle (per esempio Equilateral) erediterà automaticamente tale metodo.

Questa caratteristica di estendibilità di GEObject, che tra l'altro si integra perfettamente con il carattere fortemente incrementale della geometria euclidea, lo rende uno strumento estremamente versatile per lo studio di questa disciplina. Si pensi per esempio alla possibilità di definire oggetti in discendenza gerarchica (es. poligoni, triangoli, rettangoli e quadrati, pentagoni, ...) e definire per essi nuovi metodi al fine di verificare proprietà geometriche o teoremi, constatando la compatibilità nell'applicazione di questi metodi tra le classi antenate e quelle discendenti. O ancora, si pensi alla possibilità di definire figure geometriche ricorsive, quali possono essere spirali, o addirittura i frattali (per esempio la curva di Von Koch). Per tutte queste potenzialità rimandiamo alla lettura di [Evi94].

Per ogni nuovo strumento definito dall'utente, il sistema genera automaticamente il codice Eiffel, corrispondente ad una nuova classe o ad un nuovo metodo per una delle classi già esistente. Essendo Eiffel un linguaggio compilato, onde evitare l'attesa di una compilazione prima di poter utilizzare il nuovo strumento, è stato implementato un interprete cosi' da rendere immediatamente disponibili i nuovi strumenti definiti dall'utente. Solo alla fine della sessione di lavoro il sistema verrà automaticamente ricompilato al fine di includere il codice relativo ai nuovi metodi definiti. Il tutto avviene in modo assolutamente trasparente per l'utente, e nessuna differenza emerge tra i metodi predefiniti e quelli nuovi.

Conclusioni

Cio' che ha portato alla realizzazione di GEObject è stata da una parte la ricerca di tecniche di modellazione che fossero il più intuitive possibile senza richiedere all'utente un background elevato, dall'altra il tentativo di creare un ambiente didattico la cui trasparenza e chiarezza implementativa permettesse all'utilizzatore di apprendere la geometria euclidea in modo diretto, ovvero sperimentando con esempi le congetture che poteva formulare durante il proprio studio.

Questo sistema presenta grandi potenzialità qualora se ne estendano le funzionalità al trattamento della geometria nello spazio tridimensionale. Futuri sviluppi, infatti, puntano alla costruzione di un modellatore geometrico tridimensionale basato sulle tecniche di modellazione usate in GEObject 2D. Un'altra direzione di potenziamento del sistema consiste nella animazione da applicare di modelli geometrici in 2 e 3 dimensioni. Il sistema di animazione sarà poi in grado di simulare fenomeni fisici, come collisioni tra oggetti, movimento di corpi, rigidi o deformabili, sottoposti a forze ecc., il tutto partendo dall'idea di modellazione riga e compasso introdotta con GEObject. A questi sviluppi collabora l'Institut Gaspard Monge, Université de Marne la Vallée (Paris), con la collaborazione del professor Didier Arquès.

Per provare direttamente GEObject:

the Tutorial

the Handbook

Bibliografia

[ABM95] M.A.Alberti, E.Bastioli, D.Marini, "Towards Object-Oriented Modelling of Euclidean Geometry", The Visual Computer, 11, pp. 378-389 (1995). Abstract.

[AM95] Alberti M.A., Marini D., "Knowledge Representation in a Learning Environment for Euclidean Geometry", in: A.A. di Sessa, C. Hoyles and R. Noss Ed's "Computers and Exploratory Learning", NATO ASI Series F, Vol. 146, Springer Verlag, pp. 109-126 (1995). Abstract.

[AEM95] Alberti M.A., Evi P., Marini D. "Modelling Geometric Objects with OBJSA Nets", 16th Internat. Conf. on Application and Theory of Petri Nets, Torino, June 26-30 (1995)

[BDM88] E.Battiston, F.De Cindio, G.Mauri, "OBJSA nets: a class of high level nets having objects as domains", Advances in Petri Nets 88, G.Rozemberg (ed.), LNCS 340, pp. 20-43, Springer Verlag, 1988.

[Evi94] P.Evi, "Rappresentazione della conoscenza della geometria euclidea mediante paradigma ad oggetti e reti di Petri", Tesi di Laurea in Scienze dell'Informazione, Università degli Studi di Milano, A.A. 1993-94.

[FPR85] N.Fuller, P.Prusinkiewicz, G.Rambally, "L.E.G.O. - An interactive computer graphics system for teaching geometry", Computer in Education, Elsevier Science Publishers B.V., 1985, pp.359-364.

[Mey91] B.Meyer, "Eiffel: The Language", Interactive Software Engineering Inc., TR-EI-17/RM Version 2.2.

[Nom89] T. Noma et al., "Constructive picture description with euclidean geometry", The Visual Computer, vol.5, 1989, pp. 40-52.

[Wis90] P.Wisskirchen, "Object-Oriented Graphics. From GKS and PHIGS to Object-Oriented Systems", Springer-Verlag, 1990.