mfc 多边形扫描线填充算法

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 11:12   11   0

多边形扫描线填充

预览图:

这里给大家贴一下颜色框怎么用

//定义:
COLORREF clr;
//初始化
clr=RGB(255,0,0);
//调用调色板
CColorDialog dlg;
if(dlg.DoModal()==IDOK)
clr=dlg.GetColor();

这里:在多边形内部点击一点(x,y)oldColor:区域原色(这里我的是白色)newColor:填充原色(上文提到的clr)

先定义:

struct Seed
{
int x;int y;
};

具体函数实现

void CquhongjuanView::fill(CDC*& pDC,int x,int y,COLORREF& oldColor,COLORREF& newColor)
 {
  stack<Seed> sp;
  int xl,xr;
  bool spanNeedfill;
  Seed pt;
  pt.x=x;pt.y=y;
  sp.push(pt);
  while(!sp.empty())
  {
   pt=sp.top();sp.pop();
   y=pt.y;x=pt.x;
   while(pDC->GetPixel(x,y)==oldColor)//向右填充
   {
    pDC->SetPixel(x,y,newColor);
    x++;
   }
   xr=x-1;x=pt.x-1;
   while(pDC->GetPixel(x,y)==oldColor)//向左填充
   {
    pDC->SetPixel(x,y,newColor);
    x--;
   }
   xl=x+1;
   //处理上面一条扫描线
   x=xl;y=y+1;
   while(x<=xr)
   {
    spanNeedfill=false;
    while(pDC->GetPixel(x,y)==oldColor)
    {
     spanNeedfill=true;
     x++;
    }
    if(spanNeedfill)
    {
     pt.x=x-1;pt.y=y;
     sp.push(pt);
     spanNeedfill=false;
    }
    while((pDC->GetPixel(x,y)!=oldColor)&&x<=xr) x++;
   }

   //处理下面一条扫描线
   x=xl;y=y-2;
   while(x<=xr)
   {
    spanNeedfill=false;
    while(pDC->GetPixel(x,y)==oldColor)
    {
     spanNeedfill=true;
     x++;
    }
    if(spanNeedfill)
    {
     pt.x=x-1;pt.y=y;
     sp.push(pt);
     spanNeedfill=false;
    }
    while((pDC->GetPixel(x,y)!=oldColor)&&x<=xr) x++;
   }
  }
 }

ps:关于mfc画直线,圆,椭圆,多边形,直线的裁剪,多边形的裁剪可以关注我的博客

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP