¿Cuál es el mejor algoritmo de "llenado de cubos"?

16

Soy bastante nuevo en el procesamiento de imágenes, y actualmente estoy trabajando en una aplicación similar a la pintura que contará con un cubo de relleno. Sin embargo, no tengo idea de cuál es el mejor algoritmo para llenar un cubo.

Implementé un ejemplo que encontré en este sitio , sin embargo, se topó con problemas de bucle infinito cuando un usuario trató de llenar un área que ya había sido llena con el mismo color.

Actualmente estoy trabajando en ese problema llenando a la izquierda, derecha, arriba y luego abajo; sin embargo, lo hice para que una vez que un píxel se haya rellenado a la izquierda, no pueda llenarse a la derecha, lo que significa formas como:

Ejemplo

no se llenará correctamente si la herramienta de cubo se usa en el punto rojo.

Por lo tanto, espero que alguien conozca un algoritmo o un enlace a uno que resuelva todos estos problemas.

Información adicional: Esto se implementará utilizando Javascript como herramienta de pintura. Se usará en línea utilizando el elemento Canvas.

Ivan
fuente
¿Se basa este vector o mapa de bits? Estoy asumiendo un mapa de bits por la imagen, pero solo asegurándome ..
Demian Brecht
1
Creo que has implementado algo incorrectamente. Leí el documento y, de acuerdo con los ejemplos de imágenes, esto debería llenar imágenes como la de arriba. ¿Copió y pegó su código o lo reescribió?
RLH
Piense en el recorrido del gráfico.
Bwmat
@RLH: Copié y pegué su código con algunos cambios para que funcione con mi configuración.
Ivan
@Ivan: no empieces a buscar un nuevo algoritmo antes de resolver tus problemas de "bucle infinito". Si ni siquiera puede arreglar eso para una implementación existente, definitivamente se encontrará con muchos más problemas cuando va a reescribir todo desde cero.
Doc Brown

Respuestas:

21

Parece que realmente estás buscando lo que se llama un algoritmo de relleno de inundación. Esa puede ser la razón por la que no ha encontrado toneladas de ejemplos para ello. Hay varios métodos de relleno de inundación enumerados en la página de Wikipedia para el algoritmo . Recomiendo uno de los métodos no recursivos, 'en cola'.

Gran maestro B
fuente
I highly recommend one of the non-recursive, 'queued' methods.- ¿Podrías explicar por qué?
Elfayer
1
@Elfayer Cada vez que se llama a una función (por ejemplo, "X ()" tiene una llamada a "Y ()"), los parámetros y la ubicación de la memoria de la función de origen ("X ()") se almacenan en la pila. Entonces, si está llenando un espacio grande y complicado, habrá muchas llamadas a funciones recursivas. Dependiendo de su compilador e idioma, esto puede provocar desbordamientos de pila o consumo excesivo de memoria.
boxcartenant
-1

Actualmente estoy haciendo lo mismo. Sin embargo, cuando me encontré con el problema que usted señala, opté por simplemente finalizar la función si se hizo clic en la herramienta sobre un área del mismo color que está tratando de pintar (esto también parece ser el comportamiento de ms-paint) .

El método en cola debe ser extremadamente intuitivo para cualquier persona con alguna experiencia en programación.

Si le preocupa pintar el área que rodea una mancha del mismo color que su pintura, puede:

  • Verifique el color de fondo.
  • busque el borde del punto del mismo color en el que hizo clic.
  • coloque los puntos circundantes en el lugar.
  • proceder con la ejecución normal usando esta (en este caso) cola llena de puntos blancos.

Si lo desea, puede ver mi código (bastante vergonzoso) aquí .

Está lejos de ser rápido, pero funciona bien ...

Juan Pablo Alvarez Alfaro
fuente
¿Por qué los votos negativos? :( Sé que el método no es particularmente "rápido", pero funciona, y también lo hace la solución propuesta :(
Juan Pablo Alvarez Alfaro
1
esta publicación es bastante difícil de leer (muro de texto). ¿Te importaría editarlo en una mejor forma?
mosquito
2
¿Seriamente? ¿La gente votó en masa porque era difícil de leer? ¿Por qué no optar por editar? No es que el contenido sea problemático.
l46kok