当前位置:文档之家› 实验3区域填充算法答案

实验3区域填充算法答案

free(p);
}
voidSetStackEmpty(linkstack *s)//初始化栈
{
stacknode *p=s->top;
while( s->top != NULL)
{
free(p);
s->top=p->next;
}
}
intIsStackEmpty(linkstack *s)//判空栈
{
if(s->top == NULL)
return1;
else
return0;
}
voidScanLineFill4(intx,inty,intoldColor,intnewColor)
{
intxLeft,xRight,i;
boolisLeftEndSet,spanNeedFill;
Span span;
i++;
}/*end of while( i < xRight) */
}/*end of while( ! isStackEmpty() ) */
}/*end of ScanLineFill4() */
voidmain()
{
intgraphdrive=DETECT;
intgraphmode;
staticintpolypoints[14]={50,50,400,50,400,300,150,300,150,400,50,400,50,50};
intxLeft;
intxRight;
}Span;/*区段*/
typedefstructstacknode
{
Span span;
structstacknode *next;
}acknode;
typedefstruct
{
stacknode *top;
}linkstack;
voidPushStack(linkstack *s, Span *span)//入栈
{
putpixel(i, y, newColor);
i--;
}
if( i != span.xLeft - 1)/*确定区段左边界*/
{
isLeftEndSet = TRUE;
xLeft = i + 1;
}
i = span.xLeft;
while( i < xRight)
{
spanNeedFill = FALSE;
i++;
}/*end of while( i < xRight) */
/*处理下面一条扫描,与处理上面一条扫描线完全类似*/
y = y - 2;
xRight = span.xRight;
i = span.xLeft - 1;
isLeftEndSet = FALSE;
while(getpixel(i,y) == oldColor)/*向左填充*/
i = x - 1;
while(getpixel(i,y) == oldColor)/*向左填充*/
{
putpixel(i,y,newColor);
i--;
}
span.xLeft = i + 1;/*确定区段左边界*/
SetStackEmpty(s);
span.y = y;
PushStack(s,&span);
while(getpixel(i,y) == oldColor)/*向右填充*/
{
if( ! spanNeedFill)
{
spanNeedFill = TRUE;
if( ! isLeftEndSet)
{
isLeftEndSet = TRUE;
xLeft = i;
}
}
putpixel(i,y,newColor);
i++;
}
if( spanNeedFill )
{
span.y = y;
span.xLeft = xLeft;
span.xRight = i - 1;
PushStack(s, &span);
isLeftEndSet = FALSE;
spanNeedFill = FALSE;
}
/* while(getpixel(i,y) != oldColor) */
画多边形的方法通过查阅资料知道有很多方法,比如可用MoveTo、LineTo两个函数配合使用画多边形。然而虽然能编译通过,但是却不能执行。于是就选用了graphics中的drawpoly函数画多边形。在编译时却出现了drawpoly为未定义标识符的情况。上网查询后得知是因为使用的easyX将drawpoly的函数名字修改为了polygon,所以才会出现那样的错误。
2.添加库函数graphics.h。
3.初始化。堆栈置空,将种子点(x, y)入栈。
4.出栈。若栈空则结束;否则取栈顶元素(x, y),以y作为当前扫描线。
5.填充并确定种子点所在区段。从种子点(x, y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。
6.确定新种子点。在区间[xl, xr]中检查与当前扫描线y上、下相邻的两条扫描线上的像素。若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入堆栈,返回第4步。
经过不懈的努力,终于初步完成了本次实验。通过本次实验,掌握了区域填充的扫描线算法,进一步了解图形程序设计的方法,掌握了一定的基本绘图程序设计的能力。
附源代码:
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
typedefstruct{
inty;
while(!IsStackEmpty(s))
{
PopStack(s, &span);
/*处理上面扫描线*/
y = span.y + 1;
xRight = span.xRight;
i = span.xLeft - 1;
isLeftEndSet = FALSE;
while(getpixel(i,y) == oldColor)/*向左填充*/
1.掌握区域填充的扫描线算法;
实验内容:
编写图形程序:区域填充扫描线算法程序,并调试运行。
实验步骤:
1.实验原理:区域填充的递归算法和程序都很简单,但由于多次递归,费时、费内存,效率还不高。为了减少递归次数,提高效率,采用了扫描线算法。算法的基本过程如下:当给定种子点(x, y)时,首先填充种子点所在扫描线上位于给定区域的区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。
{
putpixel(i, y, newColor);
i--;
}
if( i != span.xLeft - 1)/*确定区段左边界*/
{
isLeftEndSet = TRUE;
xLeft = i + 1;
}
i = span.xLeft;
while( i < xRight)
{
spanNeedFill = FALSE;
《计算机图形学》实验报告(三)
班级:计科系(2)班
姓名:陈露
学号:10410902015
时间:2013.4.28
地点:综合实验楼一楼
实验成绩:优秀□良好□中□及格□不及格□
实验题目:区域填充算法
实验目的:
1.掌握区域填充的扫描线算法。
2.培养学生利用基本图形生成算法,进行基本绘图程序设计的能力;
实验要求:
while(getpixel(i,y) == oldColor)/*向右填充*/
{
if( ! spanNeedFill)
{
spanNeedFill = TRUE;
if( ! isLeftEndSet)
{
isLeftEndSet = TRUE;
xLeft = i;
}
}
putpixel(i,y,newColor);
7.根据思想编写程序代码。
实验结果:
调试并运行程序,多边形的区域应该被填充。运行结果如下:
可以看出,是从(150,150)这个像素点所在的扫描线开始,向上再向下进行填充的。
实验总结:
在本次实验中,主要有两个问题。一是栈的问题,二是画多边形。
栈的每个元素都有两个值x和y,怎么设计比较才合理。这就需要使用结构体来解决。而且对栈的使用总是出错,如何引用里边的值不太熟练。比如有时表达式必须包含指针类型,这是因为对结构体的成员究竟什么时候使用“->”,什么时候使用“.”不太清楚。
linkstack *s=(linkstack*)malloc(sizeof(linkstack));
s->top = NULL;
i = x;
while(getpixel(i,y) == oldColor)/*向右填充*/
{
putpixel(i,y,newColor);
i++;
}
span.xRight = i - 1;/*确定区段右边界*/
{
stacknode *p=(stacknode*)malloc(sizeof(stacknode));
p->span.y = span->y;
p->span.xLeft = span->xLeft;
p->span.xRight = span->xRight;
p->next=s->top;
相关主题