Ho un poligono chiuso non autointersecante. I suoi vertici vengono salvati in due vettori X e Y. Infine i valori di X e Y sono rilegati tra 0 e 22.Qual è un modo semplice per calcolare la sovrapposizione tra un'immagine e un poligono?
Mi piacerebbe costruire una matrice di dimensione 22x22 e impostare il valore di ciascun bin uguale a vero se parte del poligono si sovrappone a quel bin, altrimenti falso.
Il mio primo pensiero era di generare una griglia di punti definita con [a, b] = meshgrid(1:22)
e quindi di utilizzare inpolygon
per determinare quali punti della griglia erano nel poligono.
[a b] = meshgrid(1:22);
inPoly1 = inpolygon(a,b,X,Y);
Tuttavia questo solo restituisce vero se se il centro del cassone è contenuta nel poligono, cioè restituisce la forma rosso nell'immagine sottostante. Tuttavia quale bisogno è più lungo la linea della forma verde (anche se è ancora una soluzione incompleta).
Per ottenere il blob verde ho eseguito quattro chiamate allo inpolygon
. Per ogni confronto ho spostato la griglia dei punti NE, NW, SE o SW di 1/2. Questo è equivalente al test se gli angoli di un raccoglitore si trovano nel poligono.
inPoly2 = inpolygon(a-.5,b-.5,X,Y) | inpolygon(a+.5,b-.5,X,Y) | inpolygon(a-.5,b+5,X,Y) | inpolygon(a+.5,b+.5,X,Y);
Mentre questo mi forniscono una soluzione parziale non riesce nel caso in cui un vertice è contiene in un bidone, ma nessuno degli angoli bin sono.
C'è un modo più diretto di attaccare questo problema, preferibilmente una soluzione che produce codice più leggibile?
Questo terreno è stato disegnato con:
imagesc(inPoly1 + inPoly2); hold on;
line(a, b, 'w.');
line(X, Y, 'y);
Devo allontanarmi dal computer ma ho pensato di offrire una soluzione generale che potrebbe essere di aiuto. Per prima cosa ridimensiona la meshgrid fino a un multiplo di 22 per definire l'area a una densità uguale o maggiore di quella che stai usando per i vertici - questo rimuoverà il problema dell'angolo. Quindi, per tornare a una griglia 22 per 22, puoi semplicemente dividere per lo stesso fattore che hai scalato, pavimentando i punti in alto/a sinistra e il soffitto in quelli in basso/a destra. Spero che questo aiuti – Salain