2024年4月28日发(作者:)

《计算机图形学》实验报告

(实验二:图形填充算法)

一、实验目的及要求

用两种方法做图形的填充算法!

二、理论基础

1. 边填充算法

对于每一条扫描线和每条多边形的交点(x1,y1),将该扫描线上的交点右方的

所有像素取补。

2. 种子填充算法

利用栈来实现种子填充算法。种子像素入栈,当栈非空时重复执行如下步骤:

将栈顶像素出栈,将出栈像素置成多边形色,按左,上,右,下顺序检查与出

栈像素相邻的四个像素,若其中某个像素不再边界且未置成多边形,则把该像

素入栈!

三、算法设计与分析

1、边填充算法

void CEdge_mark_fillView::OnDraw(CDC* pDC)

{

CEdge_mark_fillDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

int d[500][500]={0};int inside;int x,y;

Bresenham(80,101,100,400,d);

Bresenham(100,300,290,400,d);

Bresenham(292,400,382,50,d);

Bresenham(380,50,202,150,d);

Bresenham(200,150,82,101,d);

for(y=0;y<500;y++)

{

inside=0;

for(x=0;x<500;x++)

{

if(d[x][y]==1)

if(d[x+1][y]!=1)

{

inside=!(inside);

}

if(inside!=0)

pDC->SetPixel(x,y,12);

}

}

}2、种子填充

int x=299,y=51;

COLORREF oldcolor;

COLORREF newcolor;

oldcolor=RGB(256,256,256);

newcolor=RGB(123,123,123);

pDC->MoveTo (40,40);

pDC->LineTo (80,40);

pDC->LineTo (70,80);

pDC->LineTo (40,40);

FloodFill(51,51,RGB(255,255,255),RGB(0,0,255));

pDC->LineTo (40,40);

void CMyView::FloodFill(int x,int y,COLORREF oldcolor,COLORREF newcolor)

{

CDC* pDC;

pDC=GetDC();

if(pDC->GetPixel(x,y)==oldcolor)

{

pDC->SetPixel(x,y,newcolor);

FloodFill(x,y-1,oldcolor,newcolor);

FloodFill(x,y+1,oldcolor,newcolor);

FloodFill(x-1,y,oldcolor,newcolor);

FloodFill(x+1,y,oldcolor,newcolor);

}

四、程序调试及结果的分析

1、

2、

四、实验心得及建议

由于很多不会,所以这次没能按时当堂完成,下来花了不少时间才弄出来,第二种尤其比较麻

烦,在同学的帮助下才做出来了。种子填充算法适用性大,但是运行较慢。没有边填充算法简

便!

姓名 班级 学号 实验日期 指导教师 实验成绩

评语: