Capisco si sia capito pochissimo. Ieri sera volevo far vedere ad afazio il listato, e non ho nè introdotto l'argomento, nè commentato bene il listato.
Posto intanto, quindi, la figura:
Il problema, a prima vista banale, è il seguente: data una poligonale chiusa, con i vertici ordinati in modo da percorrere il poligono stesso in senso orario, trovare le coordinate dei vertici del poligono interno al primo, e con i lati distanziati della quantità
dist.
Nient'altro che quanto facciamo giornalmente e più o più volte con il nostro CAD preferito.
Procedendo 'manualmente' il problema risulta banale, come dicevo, ma creare una procedura 'automatica' e numerica non lo è affatto (o almeno, io ho trovato parecchie difficoltà).
Parlandone in chat con afazio egli aveva istantaneamente prospettato un procedimento che tramite la bisettrice dell'angolo formato dalla poligonale al vertice i, consentisse di trovare il vertice cercato. Egli riteneva, a mio avviso errando, che bisognasse scegliere solamente tra due possibili vertici, uno interno, l'altro esterno al poligono.
Già così come si è parlato altre volte il concetto 'interno'/'esterno' non è affatto banale (anche questo) come apparirebbe a prima vista.
Ma in effetti risulta anche difficile decidere di quale angolo si parla. Perchè in effetti le bisettrici sarebbero 2, e quindi i punti possibili candidati 4.
In passato ci avevo sbattuto la testa proprio con questo approccio senza riuscire a trovare un criterio numerico che mi consentisse certamente di scartare i 3 vertici e considerare solamente quello realmente interno.
(Si tratta dell'approccio rappresentato nella parte superiore della figura di cui sopra)
In realtà alla fine ho seguito un altro approccio, ovvero quello di determinare quattro rette a due a due parallele ai due segmenti che uniscono il vertice i al vertice i-1 ed i+1, e riuscire infine a decidere quale sia il punto certamente interno al poligono (con l'ipotesi che il poligono sia certamente costruito con il senso orario di ordinamento dei vertici stessi).
(Parte bassa della figura).
L'algoritmo che ho postato nel post precedente quindi persegue questa via. Esso funziona. Ma esso è frutto di una serie di sessioni di debug, in cui ho pazientemente inserito vertici comunque disposti, ed in cui di volta in volta ho 'messo le pezze' in modo che restituisse esattamente ciò che volevo.
In realtà sono sicuro di aver sbagliato approccio, troppe 'pezze', troppi if. E così troppe condizioni fanno si che nemmeno io ricordi più come e perchè l'algoritmo funzioni.
In pratica per ogni segmento calcolo le equazioni delle rette ad esso parallelo, quindi definito m, il coefficiente angolare del segmento, trovo le rette parallele con una equazione y=m*x+q, in cui m è proprio il coefficiente angolare del segmento considerato e q varrebbe il q del segmento sottraendo e/o sommando
dist proiettato sull'asse delle y.
Il trucco è tutto qui. m0 e q0 sono coefficiente angolare e segmento sulle ascisse staccato dal segmento che va dal vertice i-1 ad i.
Invece m1 e q1 sono coefficiente angolare e segmento sulle ascisse del segmento che va da i ad i+1.
sommando/sottraendo ai q
dist opportunamente proiettato trovo le quattro rette da cui 4 intersezioni.
In realtà ho il parametro flag che, con valore 1 o -1, subito mi fa scartare una delle due rette, per cui riesco a trovare un solo punto, scartando preventivamente gli altri.
Non lo so se così ho reso più 'leggibile' il tabulato di cui sopra. Ma il mio intento è quello di stimolare il pensiero circa un 'metodo' migliore di quello da me implementato.
Fate delle prove con Autocad. Lì l'algoritmo utilizzato è evidentemente molto sofisticato. Se
dist raggiunge una certa entità il nuovo poligono, se interno al primo, non necessariamente avrà lo stesso numero di vertici dell'originale. L'algoritmo presentato invece questa particolarità non la possiede.