求一速度较快的图形填充算法。    请高手帮忙,谢谢。

解决方案 »

  1.   

    <计算机图形学> 里有多边形的填充算法,好像有 有序边算法和种子填充法,你去看看书吧。
      

  2.   

    扫描线种子填充算法fill(CPoint seed, COLORREF color)  //填充函数
    {      //使用扫描线种子填充算法.
       //先建立一个象素(坐标)栈. 
      int x,y,x0,xl,xr,yy,xx;
      int tag;
      CPoint ptemp,pt;
      CDC *cdc;
      cdc=GetDC();
      COLORREF pcolor;
      
      //cdc->SetPixel(point.x,point.y,color);  //点亮圆心.
        push(seed);    //种子象素入栈.
        while(top!=NULL)  //象素栈非空
    {
      ptemp=pop();  //栈顶象素出栈
      x=ptemp.x; y=ptemp.y;
          cdc->SetPixel(x,y,color);
      x0=x+1;       
      while((pcolor=cdc->GetPixel(x0,y))==bgcolor)  
      //pixel(x0,y)的值不等于边界值,填充右方象素.
    {
        cdc->SetPixel(x0,y,color);
    x0++;
    }
    xr=x0-1;//最右象素.
            x0=x-1;   
            //pt.x=x0;   pt.y=y;
    while((pcolor=cdc->GetPixel(x0,y))==bgcolor) 
    //pixel(x0,y)的值不等于边界值,填充左方象素.
    {  
       cdc->SetPixel(x0,y,color);
       x0=x0-1;
    }
    xl=x0+1;   //最左象素.
    //检查上一条扫描线,若存在非边界且未填充的象素,则选取代
    //表各连续区间的种子象素入栈
    x0=xl; yy=y; 
    y++;  xx=x0;
    while(x0<=xr)
    {   //注意此处tag
    tag=0;
    while((pcolor=cdc->GetPixel(x0,y))==bgcolor && x0<xr)
    {   //(pixel(x0,y)的值不等于边界值)&&(pixle(x0,y)的值不等于多边形色)&&(x0<xr)
    if(tag==0) tag=1;
    x0++;
    }
    if(tag==1) 
    {
    if(x0==xr && (pcolor=cdc->GetPixel(x0,y))==bgcolor)
    //(x0==xr)&& (pixel(x0,y)的值不等于边界值)&& (pixle(x0,y)的值不等于多边形色)
    { //push(pixel(x0,y);
    ptemp.x=x0; ptemp.y=y;
        push(ptemp);
    }
        else
    {   ptemp.x=x0-1; ptemp.y=y;
         push(ptemp);
    }
    tag=0;
    }
    int xnextspan=x0; while(((pcolor=cdc->GetPixel(x0,y))==pickcolor ||pcolor==drawcolor) && x0<xr)
    // (pixel(x0,y)等于边界值) || (pixel(x0,y)等于多边形色) &&(x0<xr)
    x0++;
    if(xnextspan==x0) x0++;
    }//while(x0=xr)
    //检查下一条扫描线,若存在非边界,未填充的象素,则选取代表各连续区间的种子象素入栈;
    //算法与前面处理上一条扫描线的算法完全一样,只要把y+1,换为y-1即可.
    y=yy;  y--; x0=xx;
    while(x0<=xr)
    {   //注意此处tag
    tag=0;
    while((pcolor=cdc->GetPixel(x0,y))==bgcolor && x0<xr)
    {   //(pixel(x0,y)的值不等于边界值)&&(pixle(x0,y)的值不等于多边形色)&&(x0<xr)
    if(tag==0) tag=1;
    x0++;
    }
    if(tag==1) 
    {
    if(x0==xr && (pcolor=cdc->GetPixel(x0,y))==bgcolor)
    //(x0==xr)&& (pixel(x0,y)的值不等于边界值)&& (pixle(x0,y)的值不等于多边形色)
    { //push(pixel(x0,y);
    ptemp.x=x0; ptemp.y=y;
        push(ptemp);
    }
        else
    {   ptemp.x=x0-1; ptemp.y=y;
    //push(pixel(x0-1,y));
         push(ptemp);
    }
    tag=0;
    }
    int xnextspan=x0; while((pcolor=cdc->GetPixel(x0,y))==pickcolor ||pcolor==drawcolor && x0<xr)
    // (pixel(x0,y)等于边界值) || (pixel(x0,y)等于多边形色) &&(x0<xr)
    x0++;
    if(xnextspan==x0) x0++;
    }//while(x0=xr)
    }//while象素栈非空}