计算机图形学区域填充的扫描线算法Word文档下载推荐.docx

上传人:b****7 文档编号:22353166 上传时间:2023-02-03 格式:DOCX 页数:11 大小:44.79KB
下载 相关 举报
计算机图形学区域填充的扫描线算法Word文档下载推荐.docx_第1页
第1页 / 共11页
计算机图形学区域填充的扫描线算法Word文档下载推荐.docx_第2页
第2页 / 共11页
计算机图形学区域填充的扫描线算法Word文档下载推荐.docx_第3页
第3页 / 共11页
计算机图形学区域填充的扫描线算法Word文档下载推荐.docx_第4页
第4页 / 共11页
计算机图形学区域填充的扫描线算法Word文档下载推荐.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

计算机图形学区域填充的扫描线算法Word文档下载推荐.docx

《计算机图形学区域填充的扫描线算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学区域填充的扫描线算法Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。

计算机图形学区域填充的扫描线算法Word文档下载推荐.docx

若这些区段内的像素点颜色值为newolor,则转至Step2;

否则以区段的右端点为种子点入种子点栈,再转至Step2。

四.原程序代码:

/*****************************************/

/*4-ScanLineFill区域填充的扫描线算法实现*/

#include<

stdio.h>

conio.h>

graphics.h>

malloc.h>

#defineStack_Size100//栈的大小常量

//定义结构体,记录种子点

typedefstruct{

intx;

inty;

}Seed;

//定义顺序栈(种子点)

typedefstruct

{

SeedPoint[Stack_Size];

inttop;

}SeqStack;

//初始化栈操作

voidInitStack(SeqStack*&

S)

{

S=(SeqStack*)malloc(sizeof(SeqStack));

S->

top=-1;

}

//种子点栈置空;

voidsetstackempty(SeqStack*S)

top==-1;

//种子点栈状态检测函数

intisstackempty(SeqStack*S)

if(S->

top==-1)

returntrue;

//空栈返回true

else

returnfalse;

//非空栈返回false

//种子点入栈;

intstackpush(SeqStack*&

S,Seedpoint)

top==Stack_Size-1)//栈已满,返回false

top++;

//栈未满,栈顶元素加1

Point[S->

top]=point;

//取栈顶元素;

intstackpop(SeqStack*&

S,Seed&

point)

top==-1)//栈为空,返回false

point=S->

top];

top--;

//栈未空,top减1

//画圆

voidCirclePoints(intxc,intyc,intx,inty,intColor)

putpixel(xc+x,yc+y,Color);

putpixel(xc+x,yc-y,Color);

putpixel(xc-x,yc+y,Color);

putpixel(xc-x,yc-y,Color);

putpixel(xc+y,yc+x,Color);

putpixel(xc+y,yc-x,Color);

putpixel(xc-y,yc+x,Color);

putpixel(xc-y,yc-x,Color);

}

//中点画圆算法

voidMidpointCircle(intradius,intColor)

intx,y;

floatd;

x=0;

y=radius;

d=5.0/4-radius;

CirclePoints(250,250,x,y,Color);

while(x<

y)

{

if(d<

0)

{

d+=x*2.0+3;

}

d+=(x-y)*2.0+5;

y--;

x++;

CirclePoints(250,250,x,y,Color);

}

//四连通扫描线算法

voidScanLineFill4(intx,inty,intoldcolor,intnewcolor)

intxl,xr,i;

boolSpanNeedFill;

Seedpt;

//种子点

SeqStack*S;

//定义顺序栈

InitStack(S);

//定义了栈之后必须把栈先初始化

setstackempty(S);

pt.x=x;

pt.y=y;

stackpush(S,pt);

//种子点(x,y)入栈

while(!

isstackempty(S))

stackpop(S,pt);

//取种子点

y=pt.y;

x=pt.x;

while(getpixel(x,y)==oldcolor)

{//从种子点开始向右填充

putpixel(x,y,newcolor);

x++;

xr=x-1;

x=pt.x-1;

while(getpixel(x,y)==oldcolor)

{//从种子点开始向左填充

x--;

xl=x+1;

x=xl;

y=y+1;

//处理上面一条扫描线

while(x<

xr)

SpanNeedFill=false;

while(getpixel(x,y)==oldcolor)

{

SpanNeedFill=true;

x++;

}//待填充区段搜索完毕

if(SpanNeedFill)

{//将右端点作为种子点入栈

pt.x=x-1;

pt.y=y;

stackpush(S,pt);

SpanNeedFill=false;

}//继续向右检查以防遗漏

while((getpixel(x,y)!

=oldcolor)&

&

(x<

xr))

x++;

}//上一条扫描线上检查完毕

y=y-2;

//处理下面一条扫描线

SpanNeedFill=false;

while(getpixel(x,y)==oldcolor)

{

SpanNeedFill=true;

x++;

}

if(SpanNeedFill)

{

pt.x=x-1;

pt.y=y;

stackpush(S,pt);

SpanNeedFill=false;

(x<

//主函数检测

voidmain()

intradius,color;

intx,y;

intoldcolor,newcolor;

//原色与填充色

//输入参数值

printf("

inputradiusandcolor:

\n"

);

//画圆参数

scanf("

%d,%d"

&

radius,&

color);

inputxandy:

//读入内点

&

x,&

y);

inputoldcolorandnewcolor:

//读入原色与填充色

oldcolor,&

newcolor);

intgdriver=DETECT,gmode;

initgraph(&

gdriver,&

gmode,"

c:

\\tc"

//用背景色清空屏幕

cleardevice();

//设置绘图色为红色

setcolor(RED);

MidpointCircle(radius,color);

//用中点画圆算法画圆

rectangle(150,150,350,350);

//再画一个矩形区域

ScanLineFill4(x,y,oldcolor,newcolor);

//扫描线区域填充

getch();

closegraph();

五.运行结果与讨论:

测试结果1:

测试结果2:

六.实验分析与讨论:

1.通过借助栈这一数据结构,完成了区域填充的扫描线算法的实现,并利用以前所学的画圆等算法,进行综合运用,在此基础上进行扩充,设计多种图案,进行扫描线填充算法的检测,都得到了理想的结果,体现了算法的有效性;

2.栈的数据结构给种子点的操作带来了极大的方便,为算法的实现提供了便利,同时还提高了算法的复用性和可靠性;

3.此扫描线填充算法能够对多种图案进行填充,展现了算法的实用性。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1