计算机图形学图形区域填充效果Word下载.docx
- 文档编号:6649985
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:14
- 大小:208.97KB
计算机图形学图形区域填充效果Word下载.docx
《计算机图形学图形区域填充效果Word下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学图形区域填充效果Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
①八向连通区域概念:
从区域上任一点出发,在不超出区域边界的前提下,可通过8个方向:
上、下、左、右、左上、左下、右上、右下的移动组合,到达区域中的任意象素,称此区域为四向连通区域。
②八向填充算法允许从8个方向搜索下一个象素的填充算法称为是八向填充算法。
(2)种子填充算法分类
(i)递归填充算法
初始化:
种子象素入栈;
步骤1:
栈顶象素出栈,作为种子点;
步骤2:
种子点被置为填充色;
步骤3:
按照左、上、右、下顺序检查与种子点相邻的象素:
若非边界且
未被填充,则入栈(8向连通区域需考虑更多相邻象素);
步骤4:
若栈不空,则重复第一步。
(ii)扫描线算法
由指定的种子象素点(x,y)生成种子(y,xl,xr)填充区间并入
栈(xl,xr分别为种子点所在扫描线上多边形内部区间的左、右端点);
若种子栈空则算法终止,否则栈顶种子出栈;
确定新种子:
分别确定y+1,y-1扫描线上与(y,xl,xr)连通的
区间;
填充新区间并将新种子压入堆栈;
上述过程循环执行。
(3)扫描区域填充算法设计
Step1:
创建MFC单文档应用程序,并命名为FloodFill,如图所示;
Step2:
向工程中添加GenericClass,命名为CStack,创建界面如下图(左)所示;
Step3:
向该工程中添加MFCClass,命名为CFill,且该类继承于CView类,对应的创建界面如上图(右)所示;
CStack.h参考代码:
//Stack.h:
interfacefortheCStackclass.
#if!
defined(AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_)#defineAFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_
#if_MSC_VER>
1000
#pragmaonce
#endif//_MSC_VER>
classCStack
{
public:
voidSetEmpty();
intIsEmpty();
voidPush(intdata);
intPop();
inttop;
intData[10000];
CStack();
virtual~CStack();
};
#endif//!
defined(AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_)
CStack.cpp参考代码:
//Stack.cpp:
implementationoftheCStackclass.
#include"
stdafx.h"
FloodFill.h"
Stack.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//Construction/Destruction
CStack:
:
CStack()
}
~CStack()
intCStack:
Pop()
inttemp=Data[top-1];
top-=1;
returntemp;
}
voidCStack:
Push(intdata)
Data[top]=data;
top+=1;
IsEmpty()
if(top>
0)
return1;
else
return0;
SetEmpty()
for(inti=0;
i<
top;
i++)
Data[i]=0;
top=0;
CFill.h参考代码:
defined(AFX_FILL_H__237EA388_BCAB_4977_B748_FA421BF12C85__INCLUDED_)
#defineAFX_FILL_H__237EA388_BCAB_4977_B748_FA421BF12C85__INCLUDED_
//Fill.h:
headerfile
//CFillview
classCFill:
publicCView
protected:
DECLARE_DYNCREATE(CFill)
CFill();
virtual~CFill();
voidfloodfill4(CDC*pDC,intx0,inty0,COLORREFnewcolor,COLORREFoldcolor);
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CFill)
virtualvoidOnDraw(CDC*pDC);
//overriddentodrawthisview
//}}AFX_VIRTUAL
//Implementation
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&
dc)const;
#endif
//Generatedmessagemapfunctions
//{{AFX_MSG(CFill)
//NOTE-theClassWizardwilladdandremovememberfunctionshere.//}}AFX_MSG
DECLARE_MESSAGE_MAP()
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
defined(AFX_FILL_H__237EA388_BCAB_4977_B748_FA421BF12C85__INCLUDED_)
CFill.cpp参考代码:
//Fill.cpp:
implementationfile
Fill.h"
staticcharTHIS_FILE[]=__FILE__;
//CFill
IMPLEMENT_DYNCREATE(CFill,CView)
CFill:
CFill()
~CFill()
BEGIN_MESSAGE_MAP(CFill,CView)
//{{AFX_MSG_MAP(CFill)
//NOTE-theClassWizardwilladdandremovemappingmacroshere.//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CFilldrawing
voidCFill:
OnDraw(CDC*pDC)
CDocument*pDoc=GetDocument();
//TODO:
adddrawcodehere
}
//CFilldiagnostics
AssertValid()const
CView:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
#endif//_DEBUG
//CFillmessagehandlers
floodfill4(CDC*pDC,intx0,inty0,COLORREFnewcolor,COLORREFoldcolor)
intxleft,xright,x,y,xx,yy;
boolspanNeedFill=FALSE;
CStack2stack;
stack.SetEmpty();
//种子入栈
stack.Push(x0);
stack.Push(y0);
while(stack.IsEmpty()!
=0)
yy=stack.Pop();
xx=stack.Pop();
pDC->
SetPixel(xx,yy,newcolor);
//向右填充
x=xx+1;
y=yy;
while(pDC->
GetPixel(x,y)!
=newcolor&
&
pDC->
=oldcolor)
SetPixel(x,y,newcolor);
x++;
xright=x-1;
//记录下最右端点的横坐标值
//向左填充
x=xx-1;
x--;
xleft=x+1;
//处理上面一条扫描线
x=xleft;
y=yy+1;
while(x<
=xright)
//*****
//1、此段代码功能是:
寻找位于[xleft..xright]之间需要填充的所有区间段
//并将各区间段最右侧的端点压人栈中去;
spanNeedFill=FALSE;
//有需要填充的区域
if(spanNeedFill==FALSE)
spanNeedFill=TRUE;
if(spanNeedFill)
CPointrightp(x-1,y);
stack.Push(x-1);
stack.Push(y);
break;
//处理下面一条扫描线
y=yy-1;
CPointsub_right_p(x-1,y);
Step4:
设置应用程序菜单项“四邻域填充算法”属性,设置界面如左图所示,添加该菜单项的消息响应事件,对应的函数名称为OnFillfloodfill,并约定将该函数作为CFloodFillView类的成员函数。
其中,函数添加界面如右图所示;
OnFillfloodfill函数参考代码:
voidCFloodFillView:
OnFillfloodfill()
{
CDC*pDC=GetDC();
//定义种子位置,边界颜色boundary和填充色fill
intx=300,y=200;
COLORREFfill=RGB(255,0,0);
//红色
COLORREFboundary=RGB(0,0,255);
//蓝色
//RGB(255,255,255);
//白色
//调用扫描线填充算法程序
CFilla;
a.floodfill4(pDC,x,y,fill,boundary);
Step5:
在应用程序初始化时,通过对CFloodFillView:
OnDraw(CDC*pDC)函数编制程序,实现绘制待填充图形;
待填充图形绘制参考代码:
CFloodFillDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
//定义画笔颜色
CPenPenRed(PS_SOLID,1,RGB(255,0,0));
//定义红色笔
CPenPenBlue(PS_SOLID,1,RGB(0,0,255));
//定义蓝色笔
//用蓝色笔画出多变形的边界
SelectObject(&
PenBlue);
POINTpolygon[5]={{300,120},{390,160},{430,320},{180,300},{150,240}};
Polygon(polygon,5);
三、运行结果
本实验通过创建MFC单文档应用程序FloodFill,采用面向对象程序设计思想分别设计了CFill类和CStack类,并在FloodFillView类中添加菜单项响应事件OnFillfloodfill,经由OnFillfloodfill函数创建CFill类实例实现填充图形功能,对应的图形填充过程状态图如下图。
填充前:
五、教师评语
签名:
日期:
年月日
成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 图形 区域 填充 效果