Tengo un polígono cerrado que no se intersecta a sí mismo. Sus vértices se guardan en dos vectores X e Y. Finalmente, los valores de X e Y están limitados entre 0 y 22.¿Cuál es una forma simple de calcular la superposición entre una imagen y un polígono?
Me gustaría construir una matriz de tamaño 22x22 y establecer el valor de cada contenedor igual a true si parte del polígono se superpone con ese bin, de lo contrario es falso.
Mi idea inicial era generar una grilla de puntos definidos con [a, b] = meshgrid(1:22)
y luego usar inpolygon
para determinar qué puntos de la grilla estaban en el polígono.
[a b] = meshgrid(1:22);
inPoly1 = inpolygon(a,b,X,Y);
Sin embargo, esto sólo devuelve verdadero si si el centro de la bandeja está contenida en el polígono, es decir, que devuelve la forma rojo en la imagen a continuación. Sin embargo, qué necesidad es más a lo largo de las líneas de la forma verde (aunque sigue siendo una solución incompleta).
Para obtener el blob verde realicé cuatro llamadas al inpolygon
. Para cada comparación, cambié la cuadrícula de puntos NE, NW, SE o SW por 1/2. Esto es equivalente a probar si las esquinas de un contenedor están en el polígono.
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);
Si bien esto me proporciona con una solución parcial se produce un error en el caso en que un vértice es contener en un contenedor pero ninguna de las esquinas de basura son.
¿Hay una manera más directa de atacar este problema, preferiblemente con una solución que produce un código más legible?
Esta parcela fue dibujado con:
imagesc(inPoly1 + inPoly2); hold on;
line(a, b, 'w.');
line(X, Y, 'y);
Tengo que alejarme de la computadora, pero pensé que ofrecería una solución general que podría ayudar. Primero escala la malla de malla hasta un múltiplo de 22 para definir el área a una densidad igual o mayor que la que estás usando para los vértices; esto eliminará el problema de la esquina. Luego, para volver a una cuadrícula de 22 por 22, puedes simplemente dividir por el mismo factor al que subiste la escala, colocando los puntos en la parte superior/izquierda y el techo en la parte inferior/derecha. Espero que ayude – Salain