Il risultato interno del metodo dell'area che ho postato ovviamente dovrebbe essere diviso per 2 per avere l'area, ma a noi interessa il segno, quindi evitiamo una divisione inutile. Qui c'è una delle tante descrizioni [1]
Il discorso sul versore del braccio potrebbe essere implementato calcolando il prodotto vettoriale tra due edge consecutivi, e valutarne poi il segno. giovanni [1] http://paulbourke.net/geometry/polyarea/ Il giorno 16 giugno 2011 12:54, Luca Sigfrido Percich <sigfr...@tiscali.it>ha scritto: > > Ciao a tutti, > > ciao Giuliano e grazie per esserti preso la briga di verificare gli > algoritmi! > > Il giorno gio, 16/06/2011 alle 09.48 +0200, giuliano ha scritto: > > On Wed, 15 Jun 2011 15:46:29 +0200 > > > 0) mi sembra che il tuo algoritmo si basi sul fatto che per passare con > > un orientamento ORARIO dall'ordinata max a quella min occorre passare > > prima per l'ascissa max (o per passare dall'ascissa max a quella min > > occorre prima passare dall'ordinata min): questo e' il senso > > dell'ordine crescente richiesto per i dati secondo i tre indici 0,1,2 o > > 1,2,3; > > Esattamente > > > 1) mi sembra che l'algoritmo quindi funzioni solo per poligoni non > > intrecciati (non ho un background geografico - cartografico, per cui ne > > parlo in termini puramente geometrici); > > Esatto; un poligono come quello da te descritto è topologicamente > sbagliato (presenta una autointersezione). Quindi prima di applicare > l'algoritmo, la geometria va controllata. Del resto, un poligono a forma > di 8 in che senso gira? Un anello in orario, e l'altro in antiorario, ma > per il poligono in se il senso di rotazione non ha valore. > > A meno che non si desideri conoscere il senso di rotazione in > corrispondenza di un punto esterno al perimetro, ossia il verso del > vettore tangente al poligono nella proiezione del punto sul perimetro. > Questo potrebbe avere senso, ed è anche semplice da implementare (a > occhio). > > > 2) non e' robusto: mi sembra che nel caso di un poligono antiorario > > (1,1), (3,2), (4,4), (2,3), (1,1) o orario (1,1), (2,3), (4,4), (3,2), > > (1,1) non sia in grado di determinarne il senso; > > Hai ragione, hai trovato il caso limite, ovvero quello in due soli punti > soddisfano le 4 condizioni, ovvero quando due punti coincidono con 2 > vertici opposti dell'MBR. Ho verificato il mio codice originale e manca > il controllo, che potrebbe essere implementato così (ora non ho molto > tempo per ragionarci bene): > > Se al termine del ciclo sui vertici, la matrice bound[] contiene solo 2 > indici che si ripetono, quindi nel tuo esempio > > p[bound[0]] = 3 (4,4) ordinata max > p[bound[1]] = 3 (4, 4) ascissa max > p[bound[2]] = 1 (1, 1) ordinata minima > p[bound[3]] = 1 (1, 1) ascissa minima > > dovrebbe essere sufficiente cercare un altro vertice per una qualunque > delle condizioni, escludendo dal suo proprio criterio i punti i cui > indici siano già contenuti nella matrice, ovvero: > > p[bound[0]] = punto a ordinata massima che non sia 3 o 1 = 4 (2, 3) > > Il che risulta in un ordine antiorario (4 3 3 1) > > Se scelgo una delle altre condizioni: > > p[bound[1]] = 2 (3 2 1 1) ascissa max <> 3 OK > p[bound[2]] = 2 (3 3 2 1) ordinata minima <> 1 OK > p[bound[3]] = 4 (3 3 1 4) ascissa minima <> 1 ?!?!?! > > La quarta condizione è problematica: non so se basti "ruotare la > sequenza", ovvero se 3314 = 4331, oppure se la scelta di quale punto > cercare non possa essere casuale ma dipenda da determinate condizioni. > Ci penserò! Dammi una mano se vuoi/puoi. > > > > 3) curiosita': quale la fonte di questo algoritmo? > > L'ho scritto io, in MapBasic, nel 2006. > > > > > 4) il metodo dell'area proposto da Giovanni e' basato > > sulla somma algebrica delle aree sottese ad ogni lato (cosi' mi sembra > > di ricordare nelle versioni che ho visto pubblicate: Newmann/Sproull? > > Foley/VanDam? Knuth? se e' importante cerco di trovarlo) quindi dovrebbe > > dare comunque il valore dell'area; il segno sara' positivo o negativo a > > seconda del senso di percorrenza (dovrebbe funzionare anche > > per poligoni intrecciati); > > > > 5) un concetto analogo e' quello del momento statico di una forza > > (un lato) rispetto ad un punto che puo' destrogiro o sinistrogiro, ma > > occorre verificare e inoltre il calcolo probabilmente e' molto vicino a > > quello fatto con il metodo dell'area; > > Grazie per la spiegazione! Qui fatico un po', purtroppo il mio > background accademico da agronomo non mi aiuta molto. > > Vorrei implementarlo in python sulla falsariga dell'implementazione > proposta da Giovanni, ovviamente appena riesco a prendermi il tempo per > imparare python. Nel frattempo, se a qualcuno interessa posso postare il > codice MapBasic. > > Ciao e grazie ancora > > Sig > > > > > ciao, > > giuliano > > > > > > _______________________________________________ > > Iscriviti all'associazione GFOSS.it: > http://www.gfoss.it/drupal/iscrizione > > Gfoss@lists.gfoss.it > > http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss > > Questa e' una lista di discussione pubblica aperta a tutti. > > Non inviate messaggi commerciali. > > I messaggi di questa lista non rispecchiano necessariamente > > le posizioni dell'Associazione GFOSS.it. > > 518 iscritti al 3.6.2011 > > _______________________________________________ > Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione > Gfoss@lists.gfoss.it > http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss > Questa e' una lista di discussione pubblica aperta a tutti. > Non inviate messaggi commerciali. > I messaggi di questa lista non rispecchiano necessariamente > le posizioni dell'Associazione GFOSS.it. > 518 iscritti al 3.6.2011 >
_______________________________________________ Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione Gfoss@lists.gfoss.it http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss Questa e' una lista di discussione pubblica aperta a tutti. Non inviate messaggi commerciali. I messaggi di questa lista non rispecchiano necessariamente le posizioni dell'Associazione GFOSS.it. 518 iscritti al 3.6.2011