Saltar al contenido

un algoritmo de relleno de inundación no recursivo en funcionamiento escrito en C?

Si hallas algún fallo en tu código o trabajo, recuerda probar siempre en un entorno de testing antes subir el código al trabajo final.

Solución:

Simplemente implemente una pila de pares int con un array de algún tamaño fijo (tal vez el tamaño de la imagen en píxeles o la raíz cuadrada de eso, por ejemplo) para la pila y rastree la parte superior con un int.

Aquí hay un código C# que implementa floodfill de forma no recursiva:

private static void Floodfill(byte[,] vals, Point q, byte SEED_COLOR, byte COLOR)

Aquí hay un código C++ que hace lo que quieres. Utiliza una cola y es más eficiente con respecto a las inserciones en la cola.

connectedRegion(const Point& source, RegionType& region, const Color target)

Una búsqueda rápida en Google muestra el artículo de Wikipedia sobre Flood Fill que incluye implementaciones de pseudocódigo que no son recursivas. A continuación hay un código que podría ayudarlo a comenzar, una implementación de cola básica en C:

typedef struct queue_  struct queue_ *next;  queue_t;
typedef struct ffnode_  queue_t node; int x, y;  ffnode_t;

/* returns the new head of the queue after adding node to the queue */
queue_t* enqueue(queue_t *queue, queue_t *node) 
    if (node) 
        node->next = queue;
        return node;
    
    return NULL;


/* returns the head of the queue and modifies queue to be the new head */
queue_t* dequeue(queue_t **queue) 
    if (queue) 
        queue_t *node = (*queue);
        (*queue) = node->next;
        node->next = NULL;
        return node;
    
    return NULL;


ffnode_t* new_ffnode(int x, int y) 
    ffnode_t *node = (ffnode_t*)malloc(sizeof(ffnode_t));
    node->x = x; node->y = y;
    node->node.next = NULL;
    return node;


void flood_fill(image_t *image, int startx, int starty, 
                color_t target, color_t replacement) 
    queue_t *head = NULL;
    ffnode_t *node = NULL;

    if (!is_color(image, startx, starty, target)) return;

    node = new_ffnode(startx, starty);
    for ( ; node != NULL; node = (ffnode_t*)dequeue(&head)) 
        if (is_color(image, node->x, node->y, target)) 
            ffnode_t *west = node, *east = node;

            recolor(image, node->x, node->y, replacement);
            /* 1. move w to the west until the color of the node to the west
               no longer matches target */
            ...
        
    

Valoraciones y reseñas

Si para ti ha resultado de utilidad este post, te agradeceríamos que lo compartas con el resto programadores de esta manera contrubuyes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *