Cómo dibujar un contorno vectorial en una matriz de cuadrícula binaria

Gracias por el A2A, Mark! Aquí está mi método de fuerza bruta feo y torpe:

  1. Para cada elemento ‘on’ en la matriz, asigne 4 líneas de vértices de coordenadas 2D para representar ese elemento de la matriz. El elemento [0,0] podría ser (0,0) -> (1,0), (1,0) -> (1,1), (1,1) -> (0,1) y (0, 1) -> (0,0). Agregue estos a una estructura de datos que tenga un buen tiempo de búsqueda.
  2. Eliminar todas las líneas duplicadas. Si tiene duplicados, eso significa que son bordes compartidos y son internos a la forma. Tendrá que verificar ambos vértices independientemente del orden, por lo tanto, haga una buena función de comparación.
  3. Haz conjuntos de polígonos. Nota: solo tiene que hacer esto si necesita / desea asegurar polígonos cerrados.
    1. Elimine con la primera línea, luego busque una línea que comience con el vértice final de su primera línea. Continúe hasta encontrar una línea que termine al comienzo de su primera línea.
    2. Esto puede requerir retroceder si busca y encuentra varias líneas que comienzan en un vértice final.
    3. Crea un polígono para tu conjunto cerrado. Repita hasta que se agoten todas las líneas.
    4. Si tiene polígonos no cerrados / polígonos incompletos, advierta a sí mismo.
  4. Dibuja tus líneas!

¡Buena suerte!

Gracias por el A2A.

Así es como lo haría.

Mantendría una lista de líneas.

Escanee todos los píxeles en la matriz:

por cada ‘1’ píxel

{

si el píxel a su izquierda es ‘0’ o está fuera de los límites, agregue una línea desde su parte inferior izquierda a su parte superior izquierda

si el píxel de arriba es ‘0’ o está fuera de los límites, agregue una línea desde la parte superior izquierda a la parte superior derecha

si el píxel a su derecha es ‘0’ o está fuera de los límites, agregue una línea desde su parte superior derecha a su parte inferior derecha

si el píxel a continuación es ‘0’ o está fuera de los límites, agregue una línea desde su parte inferior derecha a su parte inferior izquierda

}

Luego compararía todas las líneas entre sí y si el inicio y el final de una línea son iguales al final y al inicio de otra, entonces son la misma línea y se puede eliminar

Entonces, la parte binaria se refiere a una cuadrícula de píxeles cuadrados que están apagados o encendidos. La secuencia de la notación tripels es confusa. La segunda notación de una secuencia de pares es menos confusa. Puedo entender que estás enumerando las coordenadas en el plano 2D para todos los vértices.

Hay muchas maneras de hacer esto, pero dado que cada punto tiene 4 vértices, tiene más sentido para mí si asigna el cuadrado de coordenadas al centro del píxel. ¿También es importante el orden para su aplicación? Tener en cuenta estas cosas lo ayudará a seleccionar el mejor contenedor.

Construye una cuadrícula de bordes de 6 × 6. Para cada bloque, alterna los cuatro bordes dentro o fuera de la cuadrícula de bordes. Esto elimina todas las partes de línea que no desea dibujar. Si no le importa en qué orden se dibujan las líneas, ya está.

Si desea que las líneas estén en orden de bucle, escanee los bordes horizontales de la cuadrícula, de arriba a la izquierda a la derecha. Siempre que encuentre un borde establecido, llame a TraceEdges (su coord oeste, este), que genera el borde justo en la de , lo borra, avanza la coordenada en esa dirección, luego busca en sentido horario El siguiente set edge. Si encuentra uno, continúe rastreando desde allí. Una vez que finalice TraceEdges, continúe el escaneo en caso de que sus bloques requieran más de un bucle para dibujar.

Puede codificar movimientos Norte, Este, Sur y Oeste como 00, 01, 10, 11 en 2 bits, produciendo 4 movimientos guardados en un byte. Todo lo que necesita es un vértice inicial y un número de movimientos / 4 bytes para definir una forma.