Encyclopedia > Flood fill C example

  Article Content

Flood fill example in C

Redirected from Flood fill/C example

This flood fill code is adapted from a Tetris clone called "Tetanus On Drugs" by Damian Yerrick. It's licensed under the GNU General Public License and comes with ABSOLUTELY NO WARRANTY.

  #define BOARD_WIDTH  10
  #define BOARD_HEIGHT 20

  typedef struct MAP
  {
    unsigned char b[BOARD_HEIGHT][BOARD_WIDTH];
  } MAP;

  static void flood_loop(MAP *map, int x, int y,
                         unsigned int dst_c, unsigned  int src_c)
  {
    int fillL, fillR, i;
    int in_line = 1;

    /* find left side, filling along the way */
    fillL = fillR = x;
    while( in_line )
    {
      map->b[y][fillL] = dst_c;
      fillL--;
      in_line = (fillL < 0) ? 0 : (map->b[y][fillL] == src_c);
    }
    fillL++;

    /* find right side, filling along the way */
    in_line = 1;
    while( in_line )
    {
      map->b[y][fillR] = c;
      fillR++;
      in_line = (fillR > 9) ? 0 : (map->b[y][fillR] == fillC);
    }
    fillR--;

    /* search top and bottom */
    for(i = fillL; i <= fillR; i++)
    {
      if( y > 0 && map->b[y - 1][i] == fillC )
flood_loop(map, i, y - 1, c, fillC);
      if( y < BOARD_HEIGHT && map->b[y + 1][i] == fillC )
flood_loop(map, i, y + 1, c, fillC);
    }
  }

  void flood_fill(MAP *map, int x, int y, unsigned int c)
  {
    flood_loop(map, x, y, c, map->b[y][x]);
    map->b[y][x] = c;  /* some buggy optimizers needed this line */
  }

This is the same algorithm modified for Java by Claudio Santana

  int checkPixel(int[] oldPix, int[] newPix)
  {
    return (newPix[0] == oldPix[0] &&
    newPix[1] == oldPix[1]	&&
    newPix[2] == oldPix[2]  &&
    newPix[3] == oldPix[3] ? 1:0);
  }

  void floodLoop(WritableRaster raster, int x, int y, int[] fill, int[] old)
  {
    int fillL, fillR,i;
    int in_line=1;
    int[] aux =	{255,255,255,255};

    // find left side, filling along the way
    fillL = fillR = x;
    while(in_line!=0)
    {
      int[] p = raster.getPixel(fillL,y,aux);
      raster.setPixel(fillL,y,fill);
      fillL--;
      in_line = (fillL < 0) ? 0 : checkPixel(raster.getPixel(fillL,y,aux),old);
    }
    fillL++;

    // find right side, filling along the way
    in_line = 1;
    while (in_line!=0)
    {
      raster.setPixel(fillR,y,fill);
      fillR++;
      in_line = (fillR > d.width-1) ? 0 : checkPixel(raster.getPixel(fillR,y,aux),old);
    }
    fillR--;

    // look up and down
    for( i=fillL; i<=fillR; i++ )
    {
      if ( y>0 && checkPixel(raster.getPixel(i,y-1,aux),old)!=0 )
        floodLoop(raster,i,y-1,fill,old);
      if ( y<d.height-1 && checkPixel(raster.getPixel(i,y+1,aux),old)!=0 )
        floodLoop(raster,i,y+1,fill,old);
    }

  }

  // Initial method you must call
  void floodLoop(WritableRaster raster, int x, int y, int[] fill)
  {
    int[] aux = new int[] {255,255,255,255};

    // validation so we don't fall in an infinite loop trying to
    // paint in the same color
    if ( checkPixel(raster.getPixel(x,y,aux),fill)!=0 )
      return;

    floodLoop(raster,x,y,fill,raster.getPixel(x,y,aux) );
  }



All Wikipedia text is available under the terms of the GNU Free Documentation License

 
  Search Encyclopedia

Search over one million articles, find something about almost anything!
 
 
  
  Featured Article
North Lindenhurst, New York

... Asian, 0.05% Pacific Islander, 3.49% from other races, and 1.95% from two or more races. 11.66% of the population are Hispanic or Latino of any race. There are 3,808 ...

 
 
 
This page was created in 22.3 ms