区域填充种子算法实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(…);

相关文档
最新文档