📜  计算机图形学洪水填充算法

📅  最后修改于: 2020-12-20 09:40:37             🧑  作者: Mango

洪水填充算法:

在此方法中,选择区域内的点或种子。该点称为种子点。然后,使用四个连接的方法或八个连接的方法填充指定的颜色。

洪水填充算法具有许多类似于边界填充的字符。但是这种方法更适合于填充多种颜色的边界。当边界具有多种颜色并且内部要用一种颜色填充时,我们使用此算法。

在填充算法中,我们从指定的内部点(x,y)开始,然后将所有像素值当前均设置为具有所需颜色的给定内部颜色。然后使用4连接或8连接的方法,逐步遍历像素位置,直到所有内部点都被重新绘制。

坏处:

  • 很慢的算法
  • 对于大型多边形可能会失败
  • 初始像素需要更多有关周围像素的知识。

算法:

Procedure floodfill (x, y,fill_ color, old_color: integer)
    If (getpixel (x, y)=old_color)
   {
    setpixel (x, y, fill_color);
    fill (x+1, y, fill_color, old_color);
     fill (x-1, y, fill_color, old_color);
    fill (x, y+1, fill_color, old_color);
    fill (x, y-1, fill_color, old_color);
     }
}

程序1:要实现4连接的洪水填充算法:

#include
#include
#include
#include
void flood(int,int,int,int);
void main()
{
    intgd=DETECT,gm;
    initgraph(&gd,&gm,"C:/TURBOC3/bgi");
    rectangle(50,50,250,250);
    flood(55,55,10,0);
    getch();
}
void flood(intx,inty,intfillColor, intdefaultColor)
{
    if(getpixel(x,y)==defaultColor)
    {
        delay(1);
        putpixel(x,y,fillColor);
        flood(x+1,y,fillColor,defaultColor);
        flood(x-1,y,fillColor,defaultColor);
        flood(x,y+1,fillColor,defaultColor);
        flood(x,y-1,fillColor,defaultColor);
    }
}

输出:

程序2:要实现8连接的洪水填充算法:

#include
#include
#include
#include
void floodfill(intx,inty,intold,intnewcol)
{
                int current;
                current=getpixel(x,y);
                if(current==old)
                {
                                delay(5);
                                putpixel(x,y,newcol);
                                floodfill(x+1,y,old,newcol);
                                floodfill(x-1,y,old,newcol);
                                floodfill(x,y+1,old,newcol);
                                floodfill(x,y-1,old,newcol);
                                floodfill(x+1,y+1,old,newcol);
                                floodfill(x-1,y+1,old,newcol);
                                floodfill(x+1,y-1,old,newcol);
                                floodfill(x-1,y-1,old,newcol);
                }
}
void main()
{
                intgd=DETECT,gm;
                initgraph(&gd,&gm,"C:\\TURBOC3\\BGI");
                rectangle(50,50,150,150);
                floodfill(70,70,0,15);
                getch();
                closegraph();
}

输出: