ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

mfc扫描线种子填充算法----计算机图形学实验

2020-04-25 12:04:06  阅读:595  来源: 互联网

标签:LineTo mpDC Polygon POINT 图形学 40 mfc 扫描线 280


mfc扫描线种子填充算法----计算机图形学实验

最近刚刚学了计算机图形学,自己动手做了几个实验,下面介绍扫描线种子填充算法实现画一个老虎,代码有很多不够精简的地方。
具体算法推荐一篇文章(侵删,我在其基础上稍加改动)
详细的解释扫描线算法

1.调用系统画线函数先画一个老虎轮廓:

在这里插入图片描述
部分代码:

void CTiger1View::DrawTiger()
{
	CDC *pDC=GetDC();
	mpDC=pDC;
	POINT ptpolygon1[3]={{40,20},{60,60},{80,40}};
	mpDC->Polygon(ptpolygon1,3);
	POINT p1[3]={{280,20},{260,60},{240,40}};
	mpDC->Polygon(p1,3);
	mpDC->MoveTo(40,20);
	mpDC->LineTo(20,40);
	mpDC->LineTo(8,60);
	mpDC->LineTo(10,80);
	mpDC->LineTo(20,90);
	mpDC->LineTo(40,100);
	mpDC->LineTo(60,60);//耳朵
	mpDC->MoveTo(280,20);
	mpDC->LineTo(300,40);
	mpDC->LineTo(312,60);
	mpDC->LineTo(310,80);
	mpDC->LineTo(300,90);
	mpDC->LineTo(280,100);
	mpDC->LineTo(260,60);

	mpDC->MoveTo(80,40);
	mpDC->LineTo(160,14);
	mpDC->LineTo(240,40);
	POINT ptpolygon2[6]={{45,100},{65,80},{55,100},{77,206},{95,210},{71,220}};
	mpDC->Polygon(ptpolygon2,6);//条纹2
	POINT p2[6]={{275,100},{255,80},{265,100},{243,206},{225,210},{249,220}};
	mpDC->Polygon(p2,6);

	POINT ptpolygon3[4]={{40,100},{54,200},{40,240},{44,200}};
	POINT p3[4]={{280,100},{266,200},{280,240},{276,200}};
	mpDC->Polygon(ptpolygon3,4);
	mpDC->Polygon(p3,4);//条纹1

	mpDC->MoveTo(41,140);
	mpDC->LineTo(0,220);
	mpDC->LineTo(40,240);//左脸
	mpDC->MoveTo(279,140);
	mpDC->LineTo(320,220);
	mpDC->LineTo(280,240);

	POINT ptpolygon4[3]={{40,240},{96,280},{44,262}};
	mpDC->Polygon(ptpolygon4,3);//下条纹
	POINT p4[3]={{280,240},{224,280},{276,262}};
	mpDC->Polygon(p4,3);

	mpDC->MoveTo(96,280);
	mpDC->LineTo(96,240);
	mpDC->LineTo(125,200);
	mpDC->MoveTo(224,280);
	mpDC->LineTo(224,240);
	mpDC->LineTo(195,200);

	POINT ptpolygon5[3]={{60,230},{80,260},{56,244}};
	mpDC->Polygon(ptpolygon5,3);//小条纹
	POINT ptpolygon6[5]={{84,120},{126,160},{110,175},{110,216},{72,160}};
	mpDC->Polygon(ptpolygon6,5);//眼
	POINT p5[3]={{260,230},{240,260},{264,244}};
	mpDC->Polygon(p5,3);//小条纹
	POINT p6[5]={{236,120},{194,160},{210,175},{210,216},{248,160}};
	mpDC->Polygon(p6,5);//眼
}

2.扫描线种子填充算法

部分代码:

void CTiger1View::scan_seed_fill(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(mpDC->GetPixel(x,y)==oldColor)//向右填充
		{
			mpDC->SetPixel(x,y,newColor);
			x++;
		}
		xr=x-1;x=pt.x-1;
		while(mpDC->GetPixel(x,y)==oldColor)//向左填充
		{
			mpDC->SetPixel(x,y,newColor);
			x--;
		}
		xl=x+1;
		//处理上面一条扫描线
		x=xl;y=y+1;
		while(x<=xr)
		{
			spanNeedfill=false;
			while(mpDC->GetPixel(x,y)==oldColor)
			{
				spanNeedfill=true;
				x++;
			}
			if(spanNeedfill)
			{
				pt.x=x-1;pt.y=y;
				sp.push(pt);
				spanNeedfill=false;
			}
			while((mpDC->GetPixel(x,y)!=oldColor)&&x<=xr) x++;
		}
	}
}

在这里插入图片描述

下载链接

源代码

标签:LineTo,mpDC,Polygon,POINT,图形学,40,mfc,扫描线,280
来源: https://blog.csdn.net/weixin_43413326/article/details/105722908

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有