区域填充种子算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三区域填充种子算法实现
实验目的:
1、熟练在Visual C++中程序实现及调试的能力。
2、通过程序的设计熟练区域填充种子算法过程;
3、掌握堆栈在数据结构中的应用
实验内容:
1、visual c++中菜单的修改,点的输入及鼠标函数的控制;
2、复习数据结构中堆栈的建立,入栈,出栈等函数;
3、实现整个多边形的区域填充种子算法,与扫描转换算法进行区分;
实验步骤:
预处理:多边形点列的输入,存储于数组中P[100],种子点的输入,确定为point(x,y)
确定多边形的边界色(旧画笔色),初始色(背景色),填充色(新画笔色);
数据结构的建立:建立堆栈,包括数组stack[100],及一个指标top,用来指向当前堆栈的最外面的栈口的元素。
步骤:1、堆栈置为空,top=0;
2、将初始的种子点point进栈,push(x,y);
3、填色堆栈非空即top>0时,一直循环下列步骤
取栈顶的元素,出栈pop(x,y),savex=x;
从当前点开始沿当前扫描线往右检验,若有未填新色的,则填色。
然后同样往左检验。
当前扫描线俩个方向都检查完后,检验上一条扫描线y=y+1; 若有未填新色的,则把所有未填新色区间的右端点压入堆栈。 同理检验下一条扫描线y=y-2;
实验指导:
一、 在实验二的基础上进行编程 ;
(1) 引入实验二代码
scanline.dsw
二、 编辑菜单资源
选中窗口左边栏的“ResourceView ”,其中的“Menu ”,双击“IDR_MAINFRAME ”,右边即为菜单,在菜单上空处双击,出项如图所示窗口,其中弹出不选中;
如上,同样创建其余菜单项。(如下表);
三、 添加消息处理函数
由菜单的“查看”,“建立类向导”,打开ClassWizard (也可CTRL+W )为应用程序添加与菜单项相关的消息处理函数,ClassName 栏选中CScanLineView 类,根据表建立。
输入菜单项名称,(如显示多边形)
双击,出现如下窗口
四、 程序结构代码 1、
添加全局变量
在CScanLineView.h 文件中相应位置添加如下代码:(红体为需加入代码)
// Implementation public:
CPoint P[100], pt, stack[100]; int top, flag , num ;
说明: pt 定义为全局变量,为种子点坐标; stack[100]为堆栈;
top 为堆栈的最外的元素的位子; flag 为指标,判别flag=1时鼠标左键按下可
取种子点。
2、 调用函数的建立。
如下图所示,右键点击左边栏的CScanLineView 类,选中“Add Member Function ”
;
出现如下所示窗口,
按下列表格重复输入函数,后确定;
3、主程序生成,在CScanLineView.cpp文件相应位置添加如下代
码。
(注意大小写,及符号)
文件最上面一长串蓝体字下面加入:
#define oldcolor RGB(0,0,0)
#define newcolor RGB(255,0,0)
CScanLineView::CScanLineView()
{
num=0;
flag=0;
}
void CScanLineView::OnLButtonDown(UINT nFlags, CPoint point) //鼠标映射函数{
CDC *pdc=GetDC();
if(flag==1) { pt=point;
pdc->FillSolidRect(point.x-3,point.y-3,3,3,newcolor);
flag=0; num=0;
}
else { num++; P[num]=point;
pdc->FillSolidRect(point.x-3,point.y-3,3,3,oldcolor);
if(num!=1) { pdc->MoveTo(P[num-1]); pdc->LineTo(point); }
}
CView::OnLButtonDown(nFlags, point);
}
/////////////////////
void CScanLineView::OnScanLine()
{
CDC *pdc=GetDC();
书中P29页代码;
}
void CScanLineView::setstackempty()
{
top=0;
}
void CScanLineView::stackpush(seed pt)
{
stack[top+1]=pt;
top++;
}
bool CScanLineView::isstackempty()
{
if(top==0) return TRUE;
else return FALSE;
}
void CScanLineView::stackpop()
{
pt=stack[top];
top--;
}
void CScanLineView::Ongetseed()
{
flag=1;
}
说明:书29页代码中,所有的drawpixel改为pdc->SetPixel 画笔使用:
CPen RenPen,*OldPen;
RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
OldPen=pdc->SetlectObject(&RedPen);
…….
Pdc->SellectObject(OldPen);
RedPen.DelectObject();
VC中自带的多边形填充函数pdc->Polygon(…);