实验一 种子填充算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一种子填充算法

实验目的:

掌握种子填充算法的思想,掌握队列的使用,掌握基于队列的四连通区域填充算法。

实验内容:

对于任意给定的多边形,在屏幕上显示该多边形,根据给定的多边形区域内种子,对多边形区域进行填充。多边形区域为四连通区域,要求采用链队存储种子点。

实验原理:

种子填充算法采用的边界定义是区域边界上所有像素均具有某个特定的颜色值,区域内部所有像素均不取这一特定颜色,而边界外的像素则可以具有和边界相同的颜色值。程序从(x,y)开始,先检测该点的颜色,如果它与边界色和填充色均不相同,就用填充色填充该点,然后检测相邻位置,以确定它们是否边界色和填充色,若不是,就填充该相邻点。这个过程延续到已经检测完边界范围内的所有像素为止。

实验步骤:

(1)队列结构定义

种子堆栈的结构和队列结构,并定义相应变量。

(2)确定多边形顶点坐标

在Initial函数中对顶点序列进行赋值。

(3)生成多边形

即将由顶点序列所定义的多边形显示出来,也就实现了多边形的边界定义。

(4)填充多边形区域

1)确定初始种子点

可以交互给出,例中直接给出。用指定的非填充颜色填充该像素,以标出初始种子点,同时将该点送入种子队列。

2)如果,种子队列非空,从队尾取出种子。

3)判断种子是否为边界色或填充色,如果不是填充该点,将该种子送入队列。

4)判断该点的四个相邻像素是否为边界色或填充色,如果不是,填充该像素,同时将该点送入种子队列。

5)重复步骤2),3),4)

实验效果:

程序实现:

"SeedFillView.h"

// SeedFillView.h : interface of the CSeedFillView class

//

/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_SEEDFILLVIEW_H__A4808C3F_AA5A_438B_93CD_5295DF06ABBD__IN CLUDED_)

#define

AFX_SEEDFILLVIEW_H__A4808C3F_AA5A_438B_93CD_5295DF06ABBD__INCLUDED_ #if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

typedef struct QNode{POINT Data; struct QNode *next;}; //链表结构

typedef struct LinkQueue{QNode *front; QNode *rear; }; //队列结构

class CSeedFillView : public CView

{

protected: // create from serialization only

CSeedFillView();

DECLARE_DYNCREATE(CSeedFillView)

// Attributes

public:

CSeedFillDoc* GetDocument();

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CSeedFillView)

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

//}}AFX_VIRTUAL

// Implementation

public:

void Initial( POINT *pts, int ptn); //对多边形顶点序列进行赋值

void EdgeMark(POINT v1, POINT v2, COLORREF bcolor); //绘制该多边形

void QSeedFill( int ptn, POINT *pts, POINT seed, COLORREF fcolor, COLORREF bcolor); // 多边形填充主函数

void QueueSeedFill( POINT seed, COLORREF fcolor, COLORREF bcolor); //某一种子的// 填充函数

int Empty(); // 判断种子队列非空

void Enqueue( POINT pt); //种子入队

POINT Dequeue(); //种子出队

LinkQueue q; // 队列变量

virtual ~CSeedFillView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CSeedFillView)

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#ifndef _DEBUG // debug version in SeedFillView.cpp

inline CSeedFillDoc* CSeedFillView::GetDocument()

{ return (CSeedFillDoc*)m_pDocument; }

#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif

// !defined(AFX_SEEDFILLVIEW_H__A4808C3F_AA5A_438B_93CD_5295DF06ABBD__INC LUDED_)

“SeedFillView.cpp”

相关文档
最新文档