• Non ci sono risultati.

Si implementa la classe HwndPoly che permette di compiere operazioni di inserimento, divisione ed eliminazione delle polilinee della rete stradale. Nella fase iniziale di avvio, la componente Display dell’editor crea un’istanza della classe che si pone in uno stato di attesa HPWAIT. La chiamata di callback setAzione avvia i servizi interattivi. Questi, modificando lo stato della classe, abilitano i metodi disegnaStato, azionaEvento e testNodo che si innescano rispettivamente con il click del mouse, lo spostamento del puntatore e il ridisegno della scena grafica. Tali metodi eseguono operazioni diverse in base allo stato corrente del servizio e utilizzano le funzioni clickonnodopoly e clickonnodoarco del framework Disegno, per ricavare le informazioni inerenti alle polilinee e gli archi di un nodo u.

La funzione clickonnodopoly ha come argomenti di input le coordinate di tipo finestra Pf = (xf, yf) puntate dal mouse e restituisce il cursore u

del nodo estremo, che cade nell’area quadrata descritta da Pf + . Attiva

la funzione getcoordinatebymouse(Pf) e ricava le coordinate di tipo mondo

Pm = (x, y) corrispondenti a quelle Pf puntate dal mouse. Con la funzione

getptrcellabyxy(Pm) ottiene la lista dei cursori C = {a0, a1, . . . , ah−1} degli

archi contenuti nella cella su cui cade Pm. Per ogni a ∈ C estrae le infor-

mazioni dei nodi estremi (u, v) della polilinea corrispondente e controlla la coincidenza delle coordinate dei nodi con Pm. Dato u∗ un generico nodo di

un arco (u o v), calcola la distanza euclidea d, tra Pm e u∗, e confronta d con

un certo δ piccolo fissato per stabilire la coincidenza del mouse con il nodo. Se d ≤ δ, allora l’algoritmo termina restituendo il cursore di u∗, oppure con-

tinua la ricerca sino all’individuazione di un nodo coincidente con Pm; in caso

contrario la ricerca termina con esito negativo. La funzione clickonnodoarco ha gli stessi argomenti di input di clickonnodopoly, ma restituisce il cursore della polilinea p e l’id punto del nodo interno di p. Esegue una scansione analoga degli archi contenuti nella cella della griglia puntata dal mouse.

Si descrivono nelle sezioni successive i servizi gestiti da HwndPoly.

Inserimento di nuove polilinee

Il metodo nuovaPoly pone lo stato della classe su HPNEWINS, che at- tiva il servizio per permettere l’inserimento di una nuova polilinea P = {p0, p1, . . . , ph−1} nel grafo di G. Il metodo testNodo attiva la funzione clic-

konnodopoly del framework Disegno, che restituisce un nodo estremo u vicino al punto selezionato dal mouse. Eseguendo un click del mouse in corrispon- denza di u, si attiva la funzione azionaEvento, che trasforma le coordinate del mouse di tipo finestra in quelle di tipo mondo e pone p0 = u come no-

do estremo iniziale di una ipotetica strada da definire. Stesso procedimento di trasformazione delle coordinate avviene a ogni click operato su qualsiasi punto della scena che interessa il tratto stradale, le cui coordinate vengono memorizzate nel vettore di appoggio v. Un ulteriore click operato sul nodo q pone ph−1= q come nodo estremo finale della strada e setta lo stato della

classe pari ad HPNEWBLOCK, in modo da bloccare la ricezione di nuovi input esterni e permettere la sola visualizzazione della polilinea generata da v.

Figura 2.9: Inserimento di una polilinea

Con la chiamata di callback setAzione si attiva il metodo salvaNuova- Poly per inserire P in G. Questo inizializza una nuova variabile new poly che contiene le informazioni di P . Inserisce le coordinate di v in new poly, convertendole in quelle del sistema di riferimento geografico utilizzato. Ag- giorna, poi, gli attributi che definiscono i nodi estremi di P . Se p0 = u, il

nodo estremo iniziale di P `e pari ad u, altrimenti definisce un cursore u0 ∈ V/ n

per creare un nuovo nodo estremo. Seph−1 = q, il nodo estremo finale di P

`e pari a q, altrimenti definisce un cursore q0 ∈ V/ n, per creare un nuovo nodo

estremo. Attiva la funzione insPoly del framework OpGrafo, che inserisce la polilinea definita da new poly in G. L’inserimento di P o l’annullamento del- la procedura sopradescritta avviano la funzione fineNuovaPoly, che resetta lo stato della classe ad HPWAIT.

Divisione e cancellazione delle polilinee

Il metodo splitPoly pone lo stato della classe su HPSPLITSTART, che at- tiva il servizio per permettere la divisione di una polilinea P = {p0, p1, . . . , ph−1}

in corrispondenza di un nodo interno u ∈ {p1, . . . , ph−2}. Il metodo testNodo

attiva la funzione clickonnodoarco, che restituisce il nodo u vicino al punto selezionato dal mouse. Con un click del mouse in corrispondenza di u si attiva la funzione azionaEvento, che memorizza il cursore id punto di u. Per com-

pletare la procedura di divisione la chiamata di callback setAzione attiva il metodo salvaSplitPoly. Questo utilizza la funzione dividipoly del framework OpGrafo che, passandole come parametri il cursore di P e u, concretizza la divisione di P in due sottopolilinee P0 e P00. La divisione di P o l’annul- lamento della procedura determina l’avvio della funzione fineSplitPoly, che resetta lo stato della classe in HPWAIT.

Allo stesso modo il metodo eliminaPoly pone lo stato della classe su HPELIMINASTART, che attiva il servizio per permettere la cancellazione di una polilinea P = {p0, p1, . . . , ph−1} in corrispondenza di un nodo interno

u ∈ {p1, . . . , ph−2}. Il metodo testNodo attiva la funzione clickonnodoarco,

che restituisce il nodo u vicino al punto selezionato dal mouse. Eseguendo un click in corrispondenza di u si attiva la funzione azionaEvento che memorizza il cursore id punto di u. Per completare la procedura di cancellazione la chia- mata di callback setAzione permette di attivare il metodo salvaEliminaPoly. Questo utilizza la funzione eliminapoly del framework OpGrafo che, passan- dole come parametri il cursore di P , concretizza la cancellazione da G. La cancellazione di P o l’annullamento della procedura determina l’attivazione della funzione fineEliminaPoly, che resetta lo stato della classe in HPWAIT.