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