区域填充算法的实现
实验三 区域填充算法的实现
![实验三 区域填充算法的实现](https://img.taocdn.com/s3/m/746a1c2b0722192e4536f68f.png)
实验三区域填充算法的实现一、实验目的和要求:1、掌握区域填充算法基本知识2、理解区域的表示和类型,能正确区分四连通和八连通的区域3、了解区域填充的实现原理,利用Microsoft Visual C++ 6.0或win-TC实现区域种子填充的递归算法。
二、实验内容:1、编程完成区域填色2、利用画线函数,在屏幕上定义一个封闭区域。
3、利用以下两种种子填充算法,填充上述步骤中定义的区域(1)边界表示的四连通区域种子填充的实现(2)内点表示的四连通区域种子填充的实现4、将上述算法作部分改动应用于八连通区域,构成八连通区域种子填充算法,并编程实现。
三、实验结果分析四连通图的实现:程序代码:#include<graphics.h>#include <conio.h>#include<math.h>#include<time.h>void BoundaryFill4(int x,int y,int Boundarycolor,int newcolor){if(getpixel(x,y) != newcolor && getpixel(x,y) !=Boundarycolor){putpixel(x,y,newcolor);Sleep(1);BoundaryFill4(x-1,y,Boundarycolor,newcolor);BoundaryFill4(x,y+1,Boundarycolor,newcolor);BoundaryFill4(x+1,y,Boundarycolor,newcolor);BoundaryFill4(x,y-1,Boundarycolor,newcolor);}}void polygon(int x0,int y0,int a,int n,float af){int x,y,i;double dtheta,theta;if(n<3)return;dtheta=6.28318/n;theta=af*0.0174533;moveto(x0,y0);x=x0;y=y0;for(i=1;i<n;i++){x=x+a*cos(theta);y=y+a*sin(theta);lineto(x,y);theta=theta+dtheta;}lineto(x0,y0);}void main(){int x=50,y=75;int a,b,c,d,i,j;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(RGB(0,255,0));setfillstyle(WHITE);polygon(x,y,60,5,0.);a=100;b=100;c=RGB(0,255,0);d=RGB(255,0,255);BoundaryFill4(a,b,c,d);getch();closegraph();}实验结果八连通的实现程序代码:#include<graphics.h>#include<conio.h>#include<time.h>#include <malloc.h>#include <windows.h>#define MaxSize 100typedef struct{int x;int y;}Seed,ElemType;typedef struct{ElemType data[MaxSize];int top; //栈顶指针} SqStack;void InitStack(SqStack *&s){s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}int StackEmpty(SqStack *s){return(s->top==-1);}int Push(SqStack *&s,ElemType e){if (s->top==MaxSize-1)return 0;s->top++;s->data[s->top]=e;return 1;}int Pop(SqStack *&s,ElemType &e){if (s->top==-1)return 0;e=s->data[s->top];s->top--;return 1;}void floodfill8(int x,int y,int oldcolor,int newcolor) {if(getpixel(x,y)==oldcolor){putpixel(x,y,newcolor);Sleep(2);floodfill8(x,y+1,oldcolor,newcolor);floodfill8(x,y-1,oldcolor,newcolor);floodfill8(x-1,y,oldcolor,newcolor);floodfill8(x+1,y,oldcolor,newcolor);floodfill8(x+1,y+1,oldcolor,newcolor);floodfill8(x+1,y-1,oldcolor,newcolor);floodfill8(x-1,y+1,oldcolor,newcolor);floodfill8(x-1,y-1,oldcolor,newcolor);}}void main(){int a,b,c,d,i,j;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," "); cleardevice();setfillstyle(RGB(255,255,255));setcolor(GREEN);int points[]={320,200,270,290,370,290}; fillpoly(3,points);rectangle(500,420,100,100);a=RGB(255,255,255);b=RGB(255,0,0);floodfill8(320,240,a,b);c=RGB(0,0,0);d=RGB(0,0,255);floodfill8(320,180,c,d);getch();closegraph();}实验结果:2、结果分析:通过以上各算法运行结果分析与对比可知:1.四连通算法的缺点是有时不能通过狭窄区域,因而不能填满多边形。
实验2:多边形区域扫描线填充或种子填充
![实验2:多边形区域扫描线填充或种子填充](https://img.taocdn.com/s3/m/6bd6fe0552ea551810a687d1.png)
实验2:多边形区域扫描线填充或种子填充一、实验目的1.通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理2.掌握多边形区域填充算法的基本过程3.掌握在C/C++环境下用多边形填充算法编程实现指定多边形的填充。
二、实验内容用种子填充算法和扫描线填充算法等任意两种算法实现指定多边形的区域填充。
三、实验原理种子填充算法又称为边界填充算法。
其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。
如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
种子填充算法常用四连通域和八连通域技术进行填充操作。
四向连通填充算法:a)种子像素压入栈中;b)如果栈为空,则转e);否则转c);c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;d)转b);e)结束。
扫描线填充算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。
反复这个过程,直到填充结束。
区域填充的扫描线算法可由下列四个步骤实现:(1)初始化:堆栈置空。
将种子点(x,y)入栈。
(2)出栈:若栈空则结束。
否则取栈顶元素(x,y),以y作为当前扫描线。
(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。
分别标记区段的左、右端点坐标为xl和xr。
(4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素。
若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(2)步。
四、实验步骤1.复习有关算法,明确实验目的和要求;2.依据算法思想,绘制程序流程图(指定填充多边形);3.设计程序界面,要求操作方便;4.用C/C++语言编写源程序并调试、执行(最好能用动画显示填充过程);5.分析实验结果6.对程序设计过程中出现的问题进行分析与总结;7.打印源程序或把源程序以文件的形式提交;8.按格式要求完成实验报告。
实验三 区域填充原理
![实验三 区域填充原理](https://img.taocdn.com/s3/m/b41bf200eff9aef8941e0637.png)
实验三区域填充原理实验目的掌握二维区域填充的填充算法;实验环境计算机、Turbo C、C++等其他语言程序设计环境实验学时2学时,必做实验。
实验内容1.二维封闭区域的种子填充算法和扫描线种子填充算法;2.熟悉多边形扫描线填充算法;内点表示四连通种子填充算法(漫水法)参考代码:#include<graphics.h>void floodfill4(int x,int y,int oldcolor,int newcolor){if(getpixel(x,y)==oldcolor){putpixel(x,y,newcolor);delay(20000);floodfill4(x,y+1,oldcolor,newcolor);floodfill4(x,y-1,oldcolor,newcolor);floodfill4(x-1,y,oldcolor,newcolor);floodfill4(x+1,y,oldcolor,newcolor);}}main(){int a,b,c,d,i,j;int graphdriver=DETECT, graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(14);rectangle(100,100,150,150);for(i=101;i<150;i++)for(j=101;j<150;j++){ putpixel(i,j,4);delay(1000);}a=120; b=110; c=4; d=2;floodfill4(a,b,c,d);getch();closegraph();}边界表示的4连通区域的种子填充算法:#include<stdio.h>;#include<graphics.h>;void BoundaryFill4(int x,int y,int boundarycolor,int newcolor) {if(getpixel(x,y)!=boundarycolor&getpixel(x,y)!=newcolor) {putpixel(x,y,newcolor);delay(20000);BoundaryFill4(x,y+1,boundarycolor,newcolor);BoundaryFill4(x,y-1,boundarycolor,newcolor);BoundaryFill4(x-1,y,boundarycolor,newcolor);BoundaryFill4(x+1,y,boundarycolor,newcolor);}}main() {int a,b,c=14,d,i,j;int graphdriver=DETECT,graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(c);rectangle(100,100,150,150);for(i=101;i<150;i++)for(j=101;j<150;j++) { putpixel(i,j,4); delay(1000); } a=120; b=130; d=2;BoundaryFill4(a,b,c,d);getch();closegraph();}扫描线种子填充算法参考代码:#include<graphics.h>#include<stdio.h>#include<stdlib.h>#define bordercolor 15#define backcolor 0#define seedcolor 4#define fillcolor 10typedef struct Point{int x;int y;}point;typedef struct Stack{point *base;point *top;}*stack;void initstack(stack s){(*s).base=(point*)malloc(sizeof(point));if(!(*s).base)exit(1);(*s).top=(*s).base;}void push(stack s,point p){*((*s).top)=p;(*s).top++;}int stackempty(stack s){if((*s).top==(*s).base)return(1);else return(0);}point pop(stack s){(*s).top--;return(*((*s).top));}void drawgraphics(){int a[10]={100,140,260,80,300,200,160,240,100,140}; drawpoly(5, a);/*circle(200,200,150);*/}point produceseed(){point p;p.x=200;p.y=200;return(p);}void intostack(stack s,int y0,int xl,int xr){int x,y;point tm;for(x=xl,y=y0;x<=xr&&x<getmaxx();x++){if((x!=xr&&getpixel(x,y)==backcolor&&getpixel(x+1,y)!=backcolor)||(x==xr&&getpixel(x,y)==backcolor)){tm.x=x;tm.y=y;push(s,tm);putpixel(x,y,seedcolor);}if(x==xr&&getpixel(x,y)==backcolor)break;}}void fillgraphics(){int xl=0,xr=getmaxx(),x,y;point seed;stack s=NULL;seed=produceseed();putpixel(seed.x,seed.y,seedcolor);getch();initstack(s);push(s,seed);while(!stackempty(s)){seed=pop(s);for(x=seed.x,y=seed.y;getpixel(x,y)==backcolor||getpixel(x,y)==seedcolor;x++) {putpixel(x,y,fillcolor);}xr=x-1;for(x=seed.x-1,y=seed.y;getpixel(x,y)==backcolor||getpixel(x,y)==seedcolor;x--) {putpixel(x,y,fillcolor);}xl=x+1;intostack(s,seed.y+1,xl,xr);intostack(s,seed.y-1,xl,xr);getch();}}void main(){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"" );drawgraphics();fillgraphics();outtextxy(180,20,"Scan line filling graphics finished!"); getch();closegraph();}多边形扫描线填充算法参考代码:/* Note:扫描线填充算法*/#include <graphics.h>#include <conio.h>#include <math.h>#define MAXPOINT 20typedef struct {int y_top;float x_int;int delta_y;float x_cps;}E_ENTRY;void putin_sl(int entry,int x1,int y1,int x2,int y2,int next_y); void sortonby(int n);void updatefl(int count,int scan);void swap(E_ENTRY *x,E_ENTRY *y);void sortonx(int entry,int first_s);void processx(int first_s,int last_s);void drawline(int scan,int x_int_c,int index);void updatesl();E_ENTRY sides[MAXPOINT];int x[MAXPOINT]={0,210,240,230,350,380,340,200,180,150}; int y[MAXPOINT]={0,410,370,200,410,340,140,180,120,300}; int s_count,first_s,last_s,scan,bottom_s,x_int_c;main(){int driver,mode;int v_count=9;driver=DETECT;initgraph(&driver,&mode,"");setcolor(3);fillarea(v_count,x,y);getch();closegraph();}fillarea(int count){sortonby(count);first_s=1;last_s=1;for(scan=sides[1].y_top;scan>bottom_s;scan--){updatefl(count,scan);processx(first_s,last_s);drawline(scan,x_int_c,first_s);updatesl();}}void putin_sl(int entry,int x1,int y1,int x2,int y2,int next_y) {int maxy;float x2_temp,xch_temp;xch_temp=(float)(x2-x1)/(float)(y2-y1);x2_temp=x2;if((y2>y1)&&(y2<next_y)){y2--;x2_temp-=xch_temp;}else{if((y2<y1)&&(y2>next_y)){y2++;x2_temp+=xch_temp;}}maxy=(y1>y2)?y1:y2;while((entry>1)&&(maxy>sides[entry-1].y_top)){sides[entry]=sides[entry-1];entry--;}sides[entry].y_top=maxy;sides[entry].delta_y=abs(y2-y1)+1;if(y1>y2)sides[entry].x_int=x1;elsesides[entry].x_int=x2_temp;sides[entry].x_cps=xch_temp;}void sortonby(int n){int k,x1,y1;s_count=0;y1=y[n];x1=x[n];bottom_s=y[n];for(k=1;k<n+1;k++){if(y1!=y[k]){s_count++;putin_sl(s_count,x1,y1,x[k],y[k],y[k+1]);}else{/* line((short)x1,480-(short)y1,(short)x[k],480-(short)y1);*/moveto((short)x1,480-(short)y1);lineto((short)x[k],480-(short)y1);}if(y[k]<bottom_s) bottom_s=y[k];y1=y[k];x1=x[k];}}void updatefl(int count,int scan){while((sides[last_s+1].y_top>scan)&&(last_s<count))last_s++;while(sides[first_s].delta_y==0) first_s++;}void swap(E_ENTRY *x,E_ENTRY *y){int i_temp;float f_temp;i_temp=x->y_top;x->y_top=y->y_top;y->y_top=i_temp;f_temp=x->x_int;x->x_int=y->x_int;y->x_int=f_temp;i_temp=x->delta_y;x->delta_y=y->delta_y;y->delta_y=i_temp;f_temp=x->x_cps;x->x_cps=y->x_cps;y->x_cps=f_temp;}void sortonx(int entry,int first_s){while((entry>first_s)&&(sides[entry].x_int<sides[entry-1].x_int)) {swap(&sides[entry],&sides[entry-1]);entry--;}}void processx(int first_s,int last_s){int k;x_int_c=0;for(k=first_s;k<last_s+1;k++){if(sides[k].delta_y>0){x_int_c++;sortonx(k,first_s);}}}void drawline(int scan,int x_int_c,int index){int k,x,x1,x2;for(k=1;k<(int)(x_int_c/2+1.5);k++){while(sides[index].delta_y==0)index++;x1=(int)(sides[index].x_int+0.5);index++;while(sides[index].delta_y==0)index++;x2=(int)(sides[index].x_int+0.5);/*line((short)x1,480-(short)scan,(short)x2,480-(short)scan);*/ moveto((short)x1,480-(short)scan);lineto((short)x2,480-(short)scan);index++;}}void updatesl(){int k;for(k=first_s;k<last_s+1;k++){if(sides[k].delta_y>0){sides[k].delta_y--;sides[k].x_int-=sides[k].x_cps;}}}。
多边形区域填充课程设计
![多边形区域填充课程设计](https://img.taocdn.com/s3/m/ed0c8374905f804d2b160b4e767f5acfa0c7837a.png)
多边形区域填充课程设计一、课程目标知识目标:1. 学生能够理解多边形区域填充的基本概念,掌握填充算法的原理。
2. 学生能够运用所学的算法,对给定的多边形进行正确、高效的填充。
3. 学生能够了解多边形填充在不同应用场景中的重要性。
技能目标:1. 学生能够运用计算机辅助设计软件(如CAD等)进行多边形区域填充的实践操作。
2. 学生能够通过编程语言(如Python等)实现多边形区域填充算法,提高编程实践能力。
3. 学生能够运用所学的技能解决实际生活中的多边形区域填充问题。
情感态度价值观目标:1. 学生在探索多边形区域填充的过程中,培养对几何学的兴趣和热情。
2. 学生通过团队协作解决问题,增强合作意识和团队精神。
3. 学生能够认识到几何学在现实生活中的应用,增强学以致用的意识。
本课程针对初中生设计,结合学生的年龄特点和知识水平,注重理论与实践相结合。
课程旨在让学生在掌握多边形区域填充知识的同时,提高编程实践能力,培养几何学兴趣和团队协作精神。
通过具体的学习成果分解,为后续教学设计和评估提供明确的方向。
二、教学内容1. 多边形区域填充基本概念:多边形、区域、填充、边界、内部点等。
2. 多边形区域填充算法:扫描线算法、边界填充算法、种子填充算法等。
3. 计算机辅助设计软件应用:CAD软件的基本操作,多边形区域填充的实践操作。
4. 编程语言实现:Python编程环境搭建,多边形区域填充算法的编程实现。
5. 实际应用案例分析:多边形区域填充在地图制作、图形设计、游戏开发等领域的应用。
教学内容安排和进度:第一课时:多边形区域填充基本概念介绍,理解多边形和区域的关系。
第二课时:讲解扫描线算法和边界填充算法,分析其优缺点。
第三课时:介绍种子填充算法,对比三种算法的适用场景。
第四课时:计算机辅助设计软件操作教学,进行多边形区域填充实践。
第五课时:Python编程环境搭建,实现多边形区域填充算法。
第六课时:分析实际应用案例,巩固所学知识。
cad 区域填充的算法
![cad 区域填充的算法](https://img.taocdn.com/s3/m/18c8d99f6e1aff00bed5b9f3f90f76c660374c4f.png)
cad 区域填充的算法
CAD区域填充是一种用于计算机辅助设计软件中的算法,用于在指定区域内填充颜色。
这个算法基于扫描线填充方法,它从图形的顶部开始
扫描,逐行地将颜色填充到区域中。
具体而言,CAD区域填充算法可以通过以下步骤来实现:
1. 选择一个起始点,并确保该点位于待填充区域内。
2. 在当前扫描线上,从起始点开始向左和向右移动,找到左和右边界。
这可以通过检测不同颜色或图形边界来确定。
3. 填充当前扫描线的像素点,从左边界到右边界之间的像素。
4. 移动到下一行,通过向下移动一行并在新的扫描线上重复步骤2和
步骤3,直到所有行都被处理完毕或者遇到边界。
5. 当遇到边界或结束时,停止填充过程。
需要注意的是,在实际应用中,为了提高效率和减少计算量,可以使
用一些优化策略来加速CAD区域填充算法的执行,例如边界框剪裁和
扫描线段合并。
总之,CAD区域填充算法是一种实现图形填充的重要方法,它可以在计算机辅助设计软件中帮助用户快速填充指定区域并实现更好的可视化
效果。
区域填充算法的实现
![区域填充算法的实现](https://img.taocdn.com/s3/m/0c79a807326c1eb91a37f111f18583d049640f1e.png)
区域填充算法的实现实现区域填充算法的一种常见方法是使用递归。
以下是一个使用递归实现的区域填充算法的伪代码:1. 定义函数fillPixel(x, y, targetColor, fillColor):-如果像素点(x,y)的颜色与目标颜色相同,将其颜色修改为填充颜色。
-否则,返回。
2. 定义函数regionFill(x, y, targetColor, fillColor):-如果像素点(x,y)的颜色与目标颜色相同,返回。
- 否则,调用fillPixel(x, y, targetColor, fillColor)。
- 递归调用regionFill(x-1, y, targetColor, fillColor)。
- 递归调用regionFill(x+1, y, targetColor, fillColor)。
- 递归调用regionFill(x, y-1, targetColor, fillColor)。
- 递归调用regionFill(x, y+1, targetColor, fillColor)。
3. 调用regionFill(seedX, seedY, targetColor, fillColor)。
在上述算法中,fillPixel函数用于将特定颜色填充到像素点(x, y)。
regionFill函数使用递归的方式遍历相邻的像素点,并对目标颜色的像素点调用fillPixel函数。
seedX和seedY表示种子像素点的坐标,targetColor表示目标颜色,fillColor表示填充颜色。
实现区域填充算法时还需要考虑以下几个问题:1.像素点的表示:图像可以由二维数组表示,其中每个元素表示一个像素点的颜色。
2.填充颜色选择:填充颜色可以由RGB值表示,或者在预定义的颜色集合中选择。
3.边界处理:对于位于图像边界上的种子像素点,需要特殊处理以防止数组越界错误。
4.递归终止条件:填充算法使用递归,需要定义递归终止的条件,以防止无限递归。
cv2.filled算法原理
![cv2.filled算法原理](https://img.taocdn.com/s3/m/fc508e30f342336c1eb91a37f111f18583d00ced.png)
CV2.fill算法原理1. CV2库简介CV2是一个开源计算机视觉和图像处理库,主要用于处理和分析图像、视频和二维数据。
在CV2中,fill算法是一种常用的填充算法,用于填充封闭区域。
本文将针对CV2.fill算法原理展开深度讨论。
2. CV2.fill算法简介CV2.fill算法是一种基于图像处理的填充算法,它主要用于填充封闭区域。
在图像处理和计算机视觉中,填充算法是一种常见的操作,它可以帮助我们实现对图像中的特定区域进行填充操作,从而实现图像的处理和分析。
CV2.fill算法主要通过对图像的像素进行操作来实现填充的效果。
3. CV2.fill算法原理CV2.fill算法的原理主要包括以下几个方面:- 区域识别:CV2.fill算法首先对指定的封闭区域进行识别和确认,确定需要进行填充操作的具体区域范围。
- 像素填充:CV2.fill算法通过对指定区域内的像素进行填充操作,实现对指定区域的颜色、灰度等数值的调整和填充。
- 边界处理:CV2.fill算法还需要考虑封闭区域的边界情况,对于边界像素的填充需要进行特殊处理,以确保填充效果的完整和准确。
4. CV2.fill算法的应用CV2.fill算法在图像处理和计算机视觉领域有着广泛的应用,它可以帮助我们实现图像的分割、填充和修复等操作。
在实际应用中,CV2.fill算法可以用于图像的自动分割、图像的去噪、图像的修复等方面。
通过对CV2.fill算法的灵活应用,可以实现对图像的精细处理和分析。
5. 个人观点和总结从我的个人观点来看,CV2.fill算法是一种非常有效的填充算法,它在图像处理和计算机视觉方面有着重要的应用。
通过对CV2.fill算法的深入理解和掌握,我们可以更好地实现对图像的处理和分析,从而提高图像处理的效率和质量。
CV2.fill算法是图像处理和计算机视觉领域不可或缺的重要算法之一。
CV2.fill算法是一种基于图像处理的填充算法,它通过对指定区域的像素进行填充操作,实现对封闭区域的颜色、灰度等数值的调整和填充。
区域填充算法
![区域填充算法](https://img.taocdn.com/s3/m/ed1ea940e45c3b3567ec8b7e.png)
7
9 9
9
对边界和内点表示的八连通区域的填充,只要将上述算法的对四 个像素点填充改为八个像素点即可。 四连通区域种子填充算法的缺点是有时不能通过狭窄区域区域, 因而不能填满多边形。八连通算法的缺点是有时会填出多边形的 边界。由于填不满比涂出更容易补救,因此四连通算法比八连通 算法用得更多。
(3)扫描线种子填充算法
(2)内点表示的四连通区域种子填充算法
基本思想:从多边形内部任一点(像素)出发,按照“右 上左下”的顺序判断相邻像素,若是区域内的像素,则对 其填充,并重复上述过程,直至所有像素填充完毕。 可以使用栈结构来实现该算法,种子像素入栈,档栈非空, 重复执行下面操作: 1)栈顶像素出栈; 2)将出栈像素置成多边形填充的颜色;
基本思想:从多边形内部任一点(像素)出发,按照 “右上左下”的顺序判断相邻像素,若不是边界像素 且没被填充过,则对其填充,并重复上述过程,直至 所有像素填充完毕。 可以使用栈结构来实现该算法,种子像素入栈,档栈 非空,重复执行下面操作: 1)栈顶像素出栈; 2)将出栈像素置成多边形填充的颜色; 3)按“右上左下”的顺序检查与出栈像素相邻的四个 像素,若其中某个像素不在边界上且未置成多边形色, 则把该像素入栈。
扫描线算法分析(举例分析)
基本思想:在任意不间断的区间中只取一个像素(不 间断区间指一条扫描线上的一组相邻元素),填充当 前扫描线上的该段区间,然后确定与这一段相邻的上 下两条扫描线位于区域内的区段,并依次把它们保存 起来,反复进行这个过程,指导所有保存的每个区段 都填充完毕。
(3)扫描线种子填充算法
种子像素入栈,当栈非空时,重复以下步骤: (1)栈顶像素出栈 (2)沿扫描线对出栈像素的左右像素进行填充, 直到遇到边界像素为止 (3)将上述区间内最左、最右像素记为xl 和xr (4)在区间[xl ,xr]中检查与当前扫描线相邻的上 下两条扫描线是否全为边界像素、或已填充 的像素,若为非边界、未填充的像素,则把 每一区间的最右像素取为种子像素入栈
计算机图形学——区域填充算法(基本光栅图形算法)
![计算机图形学——区域填充算法(基本光栅图形算法)](https://img.taocdn.com/s3/m/b68a02fa18e8b8f67c1cfad6195f312b3169eb4f.png)
计算机图形学——区域填充算法(基本光栅图形算法)⼀、区域填充概念区域:指已经表⽰成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的⼀点(常称【种⼦点】)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。
1、区域有两种表⽰形式1)内点表⽰:枚举出区域内部的所有象素,内部所有象素着同⼀个颜⾊,边界像素着与内部象素不同的颜⾊。
2)边界表⽰:枚举出区域外部的所有象素,边界上的所有象素着同⼀个颜⾊,内部像素着与边界象素不同的颜⾊。
21)四向连通区域:从区域上⼀点出发可通过【上、下、左、右】四个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
2)⼋向连通区域:从区域上⼀点出发可通过【上、下、左、右、左上、右上、左下、右下】⼋个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
⼆、简单种⼦填充算法给定区域G⼀种⼦点(x, y),⾸先判断该点是否是区域内的⼀点,如果是,则将该点填充为新的颜⾊,然后将该点周围的四个点(四连通)或⼋个点(⼋连通)作为新的种⼦点进⾏同样的处理,通过这种扩散完成对整个区域的填充。
这⾥给出⼀个四连通的种⼦填充算法(区域填充递归算法),使⽤【栈结构】来实现原理算法原理如下:种⼦像素⼊栈,当【栈⾮空】时重复如下三步:这⾥给出⼋连通的种⼦填充算法的代码:void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color){if(x<w&&x>0&&y<h&&y>0){if (pixels[y*w+x]==old_color){pixels[y*w+x]== new_color);flood_fill_8(pixels, x,y+1,old_color,new_color);flood_fill_8(pixels, x,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y,old_color,new_color);flood_fill_8(pixels, x+1,y,old_color,new_color);flood_fill_8(pixels, x+1,y+1,old_color,new_color);flood_fill_8(pixels, x+1,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y+1,old_color,new_color);flood_fill_8(pixels, x-1,y-1,old_color,new_color);}}}简单种⼦填充算法的不⾜a)有些像素会多次⼊栈,降低算法效率,栈结构占空间b)递归执⾏,算法简单,但效率不⾼,区域内每⼀像素都要进/出栈,费时费内存c)改进算法,减少递归次数,提⾼效率三、扫描线种⼦填充算法基本思想从给定的种⼦点开始,填充当前扫描线上种⼦点所在的⼀区段,然后确定与这⼀段相邻的上下两条扫描线上位于区域内的区段(需要填充的区间),从这些区间上各取⼀个种⼦点依次把它们存起来,作为下次填充的种⼦点。
扫描线区域填充算法
![扫描线区域填充算法](https://img.taocdn.com/s3/m/2ef17a0cdc36a32d7375a417866fb84ae45cc32d.png)
扫描线区域填充算法
扫描线区域填充算法,又称为"扫描线填涂算法",它用于对平面中特定区域填充指定的颜色、灰度或纹理,是计算机图形学中常用的算法之一。
该算法的原理是:给定待填充的区域内的点的有限个边界,从某一顶点开始,以某一规则遍历所有的边界点,形成边界数组,接着顺次扫描边界数组,将包含在边界中的每个合理像素点标记成已填充状态,由此而达到填充区域的目的。
算法步骤如下:
(1)设置起始点A,判断是否存在右方向上有没有边界点,若有,则把下一个边界点B作为起始点;
(2)从起始点A 开始,以扫描线的形式一次扫描边界点,把有效的像素点标记为“已填充”;
(3)把已扫描的点加入边界数组,直到下一个边界点C,且C点不等于起始点A;
(4)重复步骤(2)和(3),直至再回到起始点A,完成一次区域填充;
(5)如果还有未填充的区域,则重复步骤(1)至(4),直至所有区域填充完成。
实际应用中,为了避免停滞,可以采用八方向搜索策略;此外,由于扫描线填充算法中填充空间的范围是由边界点定义的,因此,当边界未经处理的是孤立的点或直线时,将无法实现实际的填充效果。
基本图形元素-区域填充算法的实现
![基本图形元素-区域填充算法的实现](https://img.taocdn.com/s3/m/945f3a68af1ffc4ffe47ac6f.png)
实验四、基本图形元素-区域填充算法的实现实验目的:①理解区域的表示和类型,能正确区分四连通和八连通区域,了解区域填充的实现原理,②利用Visual C++ 6实现区域填充的递归算法。
理解扫描线多边形填充的实现原理。
实验内容③利用前面实验实现的画线函数,绘制封闭区域的边界④利用种子填充算法,填充四连通区域和八连通区域,要考虑两类区域表示(边界表示和内点表示)实验内容:①仿照课程中关于区域填充的递归算法,利用Visual C++ 实现该算法,边界表示的区域需要先定义区域边界并使用画线函数绘制边界,内点表示的区域需要确定区域内部属性。
②编译、调试、测试程序。
③使用Visual C++ 6.0 编写程序验证算法,参考“MFC图形算法简单程序.rar”、“VC 经典教程.chm前8讲”,掌握菜单、对话框程序编制方法。
实验实现过程:①复习课程中关于区域填充的相关原理;②根据多边形区域的填充原理可以推广到圆域的填充,由于圆的特殊属性,即可根据任何欲填充的像素点与圆心的距离是否大于或小于半径来判断是否在圆内或圆外,具体实现程序如下;利用中点画圆算法实现边界程序:void CArea_FillData::MidpointCircle(int xc, int yc, int r, int color){//画八分之一的圆int x,y,d;x=0;y=r;d=1-r;WholeCircle(xc,yc,x,y,color);while(x<y){x++;if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}WholeCircle(xc,yc,x,y,color);}}void CArea_FillData::WholeCircle(int xc, int yc, int x, int y, int color) {//根据圆的对称性画出整圆SetPixel(xc+x,yc+y,color);SetPixel(xc-x,yc+y,color);SetPixel(xc+x,yc-y,color);SetPixel(xc-x,yc-y,color);SetPixel(xc+y,yc+x,color);SetPixel(xc-y,yc+x,color);SetPixel(xc+y,yc-x,color);SetPixel(xc-y,yc-x,color);}采用种子填充算法的四向连通递归算法实现圆域的填充程序:void CArea_FillData::CircleFill4(int xc,int yc,int r,int seedx,int seedy, unsigned long color) {unsigned long fill;fill=GetPixel(seedx,seedy);if(((seedx-xc)*(seedx-xc)+(seedy-yc)*(seedy-yc)<r*r)&&(fill!=color)){SetPixel(seedx,seedy,color);CircleFill4(xc,yc,r,seedx+1,seedy,color);CircleFill4(xc,yc,r,seedx-1,seedy,color);CircleFill4(xc,yc,r,seedx,seedy+1,color);CircleFill4(xc,yc,r,seedx,seedy-1,color);}}实验体会:填充算法本来是很简单的问题,边界定义好,添加填充算法程序就可以了,但是在做实验的过程中遇到了一些问题,填充算法没有问题,边界函数也没问题,但在运行是几只能填充一条直线,怎么也找不到问题,最后请教老师才知道电脑显示颜色的质量也和填充有关呀,真是收益不少。
计算机图形学 区域填充算法的实现
![计算机图形学 区域填充算法的实现](https://img.taocdn.com/s3/m/93d2042dccbff121dd36837b.png)
实验四区域填充算法的实现班级 08信计学号 67姓名张洪伟分数一、实验目的和要求:1. 理解区域的表示和类型;2.实现区域填充的扫描线算法;3.WIN-TC 图形编程模板实现编程结果并保存。
二、实验内容:在任意不间断区间中只取一个种子像素(不间断区间指在一条扫描线上一组相邻元素),填充当前扫描线上的该段区间;然后确定与这一区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来,反复进行这个过程,直到所保存的每个区段都填充完毕。
1. 确定种子区段:从种子点出发,沿当前扫描线向左右两个方向填充直到边界。
用三元组(y,xLeft,xRight)记录此区段。
2.初始化:将堆栈设为空,将种子区段压入堆栈。
3.出栈:若堆栈为空,算法结束;否则取栈顶元素,以纵坐标为y的扫描线为当前扫描线,[xLeft,xRight]为搜索区间。
4.进栈:分别确定与当前扫描线相邻的上下两条扫描线与区段(y,xLeft,xRight)连通的位于给定区域内的区段。
如果有这样的区段,填充并将它们的信息压入堆栈,返回步骤3。
三、实验结果分析1该实验先用fillellipse(100,100,60,40) 画出实心椭圆,然后用如上算法填充,代码如下:setcolor(5);fillellipse(300,250,60,40);ScanLineFill(300,250,15,5);此算法还能填充带边框的多边形,如下代码填充一个矩形区域,oldColor 为背景色0:rectangle(100,20,200,50);ScanLineFill(125,30,0,5);如下代码填充带孔的四连通区域:bar(100,80,150,180);bar(150,80,200,90);bar(200,80,250,180);bar(150,130,200,180);ScanLineFill(110,150,15,2);对于每一个待填充的区段,只需压栈一次,因此扫描线算法的效率提高了很多。
区域填充种子算法实现
![区域填充种子算法实现](https://img.taocdn.com/s3/m/3753647f302b3169a45177232f60ddccda38e6f7.png)
区域填充种子算法实现实验三区域填充种子算法实现实验目的: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时鼠标左键按下可取种子点。
【免费下载】计算机图形学 区域填充算法的实现
![【免费下载】计算机图形学 区域填充算法的实现](https://img.taocdn.com/s3/m/20ada34f52d380eb63946d20.png)
圆中填充蓝色,
2. 出栈,若栈空则结束;否则取栈顶元素(x,y),以 y 作为扫描线。
3. 填充并确定种子点所在区段,从种子点(x,y)出发,沿当前扫描线向左、右两个方
向填充,直到边界。
4. 确定新的种子点,在以上确定的边界中检查与当前扫描线 y 上、下相邻的两条扫描线
上的像素。若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入
三、实验内容及步骤:
3.1、实验内容:
1. 利用种子算法实现内点表示的四连通区域的填充。如:设(x,y)为内点表示的四连
通区域内的一点,oldcolor 为区域的原色,要将整个区域填充为新的颜色 newcolor;
2. 利用扫描线算法实现以上区域的填充。如:填充以下图案,
三角形中填充红色;
3.2、实验步骤:
typedef struct{ NhomakorabeaElemType data[MaxSize];
int top;
} SqStack;
//栈顶指针
void InitStack(SqStack *&s) {
s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; }
int StackEmpty(SqStack *s) {
实验四 区域填充算法的实现
班级 08 信计二 学号 64 姓名 刘辉 分数
一、实验目的和要求:
1、理解区域的表示和类型; 2、能够正确区分四连通、八连通的区域; 3、了解填充函数、区域填充的实现原理; 4、了解掌握区域填充的各种算法(种子填充算法、扫描线算法、边填充
算法等),并实现种子填充算法和扫描线算法; 5、用种子填充算法实现四连同区域和八连通区域的填充,并观察他们之
4 区域填充算法
![4 区域填充算法](https://img.taocdn.com/s3/m/d2c914795acfa1c7aa00cc8b.png)
20
P2
区域的连贯性
根据这些性质,实际上只需知道该长方形区 根据这些性质, 域内任一梯形内一点和多边形的内外关系后, 域内任一梯形内一点和多边形的内外关系后, 即可确定长方形区域内所有像素点与多边形的 内外关系。 内外关系。
P1 P3 P7 P0 P8 P6 P5 P4
10
非零环绕数规则举例
自相交多边形的顶点分别为A 自相交多边形的顶点分别为A、B、C、D、E、 F、G,如图所示,试用非零环绕数规则判断此多 如图所示, 边形的内部和外部。 边形的内部和外部。
A D C G E F B
11
非零环绕数规则举例: 非零环绕数规则举例: 自相交多边形ABCDEFG的内 的内- 自相交多边形ABCDEFG的内-外测试
8
奇偶规则举例: 奇偶规则举例: 自相交多边形ABCDEFG的内 的内- 自相交多边形ABCDEFG的内-外测试
内部 A D C G E F B
外部
9
非零环绕数规则
统计多边形以逆时针方向 统计多边形以逆时针方向环绕某一特定点的次 逆时针方向环绕某一特定点的次 环绕数。 数,这个数称为环绕数。 这个数称为环绕数 环绕数初始为零; 环绕数初始为零; 从位置P作不经过顶点的射线; 从位置P作不经过顶点的射线; 多边形边从右至左穿过射线,环绕数加 多边形边从右至左穿过射线,环绕数加1; 从右至左穿过射线 多边形边从左至右穿过射线,环绕数减 多边形边从左至右穿过射线,环绕数减1; 从左至右穿过射线 环绕数非零则该点为内部点;否则为外部点。 环绕数非零则该点为内部点;否则为外部点。
P1 P2 P0
0 x
15
逐点判断法
逐点判断的算法虽然程序简单,但不可取。 逐点判断的算法虽然程序简单,但不可取。 速度太慢, 原因是速度太慢 原因是速度太慢,主要是由于该算法割断了各 像素之间的联系, 像素之间的联系,孤立地考察各像素与多边形 的内外关系,使得几十万甚至几百万个像素都 的内外关系, 要一一判别,每次判别又要多次求交点, 要一一判别,每次判别又要多次求交点,需要 做大量的乘除运算,花费很多时间。 做大量的乘除运算,花费很多时间。
第三章(区域填充)
![第三章(区域填充)](https://img.taocdn.com/s3/m/edac8c28915f804d2b16c16a.png)
4连通区域边界为: 8连通区域边界为:
和
堆栈结构实现种子算法,四向算法:
1、种子象素压入堆栈 2、若堆栈非空,即有区域中象素在堆栈中,做如下循 环: A.栈顶象素出栈; B.将出栈象素置为多边形颜色。 C.按左、上、右、下四个方向左右顺序检查与出栈象素相邻 的 四个象素,若其中某象素不在边界置为多边形颜色,则将该
11
0
x
x
y
x
y
x
x
y
x
x
y
扫描线的活性边表
6
5 4 3 2 1 0
p4 p5 p5 p6
5
p3
2
p4
8
5
-1.5
7
11 0 2 5
8 7
0
-3 2
5
3
3
p1 p2
p2 p3
各扫描线的新边表(存放在该扫描线第一次出现的边
三,边标志算法(轮廓填充算法)-改进的边填充法
优点:对每个象素只访问一次。不必建立、维护边表 及对边表进行排序,适于硬件实现。 步骤:1、对多边形的每条边进行直线扫描变换,即 将多边形经过的象素打上边标志。 2、填充,即对每条多边形相交的扫描线依次从左到 右逐个访问该扫描线上的象素,使用一个布尔变量 inside 来指示当前点的状态,(inside的初始值为False.) 若当前象素在多边形内部,则inside为真,反之为假。 若当前象素为打上边标志的点,就将inside取反(为 True),对未打标志的象素,inside不变仍为False。 对inside为True 的象素进行填充。
扫描线种子算法:
测试对象为象素段 ,对区域内的每一象素段,只 保留其最右边(或左边)的象素作为种子象素.
矩形区域填充算法
![矩形区域填充算法](https://img.taocdn.com/s3/m/068a87ae03d276a20029bd64783e0912a2167cb8.png)
矩形区域填充算法
矩形区域填充算法是一种常用的计算机图形学算法。
该算法的主要作用是将一定区域内的颜色进行填充。
在计算机可视化技术中,该算法是非常重要的,特别是在制作游戏、动画和画图软件中。
该算法的实现过程较为简单,其主要原理是通过输入一个种子点,向四周扩展填充其颜色。
整个填充过程可以理解为一个递归的过程,即将当前点的颜色变更、修改并递归到四周的点。
这种递归填充算法能够保证填充区域的完整性和准确性。
矩形区域填充算法的实现通常涉及以下步骤:
(1)输入起始点:首先需要用户输入一个起始点,作为要填充的区域的起点。
该点往往是具有特殊颜色的点。
(2)确定填充颜色:用户需要指定要填充的颜色。
该颜色将被用于填充区域。
(3)填充区域:从起始点开始,进行递归填充操作。
如果当前点的颜色与起始点的颜色相同,则修改当前点的颜色为要填充的颜色,递归到当前点的四周点进行相同的操作;否则,递归结束。
(4)显示填充结果:填充完毕后,显示填充的结果图形。
在实际应用中,该算法可能存在一些问题,如内存消耗和填充速度等方面的问题。
此外,一些具有不规则形状或复杂边界的区域可能需要采用其他算法或技术来完成填充。
总之,矩形区域填充算法是一种常用的计算机图形学算法,其实现过程简单,应用广泛。
在可视化技术的应用中扮演着重要角色,可以用于制作游戏、动画和画图软件等。
但在应用时,需考虑应用环境和效率等方面的问题,选择适合的算法或技术完成填充。
图像局部区域填充课程设计
![图像局部区域填充课程设计](https://img.taocdn.com/s3/m/4fb9a41ba9956bec0975f46527d3240c8447a1cb.png)
图像局部区域填充课程设计一、课程目标知识目标:1. 学生能理解图像局部区域填充的基本概念,掌握不同填充算法的原理和应用场景。
2. 学生能运用所学的图像处理技术,对给定的图像进行局部区域填充,并分析填充效果。
3. 学生能解释并比较不同填充算法的优缺点,针对特定问题选择合适的填充方法。
技能目标:1. 学生能够熟练操作图像处理软件,运用局部区域填充技术进行图像编辑。
2. 学生能够独立分析图像填充问题,设计并实现相应的解决方案。
3. 学生能够通过实践,培养观察、分析、解决问题的能力。
情感态度价值观目标:1. 学生通过学习图像局部区域填充,培养对图像处理技术的兴趣和热情。
2. 学生在学习过程中,养成合作、探究、创新的学习态度,提高自主学习能力。
3. 学生能够关注图像处理技术在现实生活中的应用,认识到科技对生活的改变,增强社会责任感。
课程性质:本课程为信息技术课程,旨在通过图像局部区域填充的教学,让学生掌握图像处理的基本技能,培养实际操作能力和解决问题的能力。
学生特点:本课程面向初中年级学生,学生对图像处理有一定的基础,好奇心强,喜欢动手实践。
教学要求:教师应注重理论与实践相结合,引导学生通过实际操作掌握知识,注重培养学生的创新思维和解决问题的能力。
在教学过程中,关注学生的个体差异,提供有针对性的指导。
通过课程学习,使学生能够达到上述课程目标,并在后续的教学设计和评估中,对学习成果进行有效监控和反馈。
二、教学内容1. 图像局部区域填充基本概念:介绍图像处理中区域填充的概念,以及其在图像编辑中的应用。
- 区域填充的定义与作用- 常见的填充算法简介2. 填充算法原理及实现:- 邻近填充算法:原理讲解与实例演示- 双线性插值填充算法:原理讲解与实例演示- 立方插值填充算法:原理讲解与实例演示3. 填充算法应用场景与实践:- 分析不同场景下填充算法的适用性- 实践操作:运用所学算法对图像进行局部填充4. 比较与优化填充算法:- 对比分析不同填充算法的效果与性能- 针对特定问题,选择合适的填充算法进行优化5. 教学案例分析与讨论:- 分析实际案例,探讨图像局部区域填充在实际应用中的技巧和注意事项- 学生分组讨论,分享学习心得与经验教学内容安排与进度:第一课时:图像局部区域填充基本概念,邻近填充算法原理及实现第二课时:双线性插值填充算法原理及实现,立方插值填充算法原理及实现第三课时:填充算法应用场景分析,实践操作第四课时:比较与优化填充算法,教学案例分析讨论教材章节关联:《信息技术》第七章 图像处理技术- 第三节 图像局部处理技术- 第四节 图像填充与修复技术三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:- 对于图像局部区域填充的基本概念和理论,教师将采用讲授法进行教学,通过生动的语言和形象的比喻,帮助学生理解填充算法的原理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四区域填充算法的实现
一、实验目的和要求:
1、掌握区域填充算法基本知识
2、理解区域的表示和类型,能正确区分四连通和八连通的区域
3、了解区域填充的实现原理,利用Microsoft Visual C++ 6.0(及EasyX_2011版)
实现区域种子填充的递归算法。
二、实验内容:
1、编程完成区域填色
2、利用画线函数,在屏幕上定义一个封闭区域。
3、利用以下两种种子填充算法,填充上述步骤中定义的区域
(1)边界表示的四连通区域种子填充的实现
(2)内点表示的四连通区域种子填充的实现
4、将上述算法作部分改动应用于八连通区域,构成八连通区域种子填充算法,
并编程实现。
三、实验结果分析
1、以上各种算法相应代码及运行结果如下:
程序代码:
#include<graphics.h>
#include<conio.h>
#include<time.h>
void FloodFill4(int x,int y,int oldcolor,int newcolor)
{
if(getpixel(x,y)==oldcolor)
{
putpixel(x,y,newcolor);
Sleep(1);
FloodFill4(x-1,y,oldcolor,newcolor);
FloodFill4(x,y+1,oldcolor,newcolor);
FloodFill4(x+1,y,oldcolor,newcolor);
FloodFill4(x,y-1,oldcolor,newcolor);
}
}
void main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT;
int graphmode=0;
initgraph(&graphdriver,&graphmode," ");
cleardevice();
setcolor(RED);
setfillstyle(RGB(255,255,0));
fillcircle(315,200,50);
a=300;
b=200;
c=RGB(255,255,0);
d=RGB(0,255,0);
FloodFill4(a,b,c,d);
getch();
closegraph();
}
运行结果:
程序代码:
#include<graphics.h>
#include <conio.h>
#include<time.h>
void BoundaryFill4(int x,int y,int Boundarycolor,int newcolor) {
if(getpixel(x,y) != newcolor && getpixel(x,y) !=Boundarycolor) {
putpixel(x,y,newcolor);
Sleep(1);
BoundaryFill4(x-1,y,Boundarycolor,newcolor);
BoundaryFill4(x,y+1,Boundarycolor,newcolor);
BoundaryFill4(x+1,y,Boundarycolor,newcolor);
BoundaryFill4(x,y-1,Boundarycolor,newcolor);
}
}
void main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT;
int graphmode=0;
initgraph(&graphdriver,&graphmode," ");
cleardevice();
setcolor(RGB(0,255,0));
setfillstyle(WHITE);
fillellipse(50,75,150,125);
a=100;
b=100;
c=RGB(0,255,0);
d=RGB(255,0,255);
BoundaryFill4(a,b,c,d);
getch();
closegraph();
}
运行结果:
程序代码:
#include<graphics.h>
#include<conio.h>
#include<time.h>
void FloodFill8(int x,int y,int oldcolor,int newcolor) {
if(getpixel(x,y)==oldcolor)
{
putpixel(x,y,newcolor);
Sleep(1);
FloodFill8(x-1,y,oldcolor,newcolor);
FloodFill8(x,y+1,oldcolor,newcolor);
FloodFill8(x+1,y,oldcolor,newcolor);
FloodFill8(x,y-1,oldcolor,newcolor);
FloodFill8(x-1,y+1,oldcolor,newcolor);
FloodFill8(x+1,y+1,oldcolor,newcolor);
FloodFill8(x+1,y-1,oldcolor,newcolor);
FloodFill8(x-1,y-1,oldcolor,newcolor);
}
}
void main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT;
int graphmode=0;
int points[] = {250, 250, 300, 150, 350, 250,300,350};
initgraph(&graphdriver,&graphmode," ");
cleardevice();
setcolor(GREEN);
setfillstyle(RGB(0,0,255));
fillpoly(4, points);
a=300;
b=200;
c=RGB(0,0,255);
d=RGB(255,255,0);
FloodFill8(a,b,c,d);
getch();
closegraph();
}
运行结果:
程序代码:
#include<graphics.h>
#include <conio.h>
#include<time.h>
void BoundaryFill8(int x,int y,int Boundarycolor,int newcolor) {
if(getpixel(x,y) != newcolor && getpixel(x,y) !=Boundarycolor) {
putpixel(x,y,newcolor);
Sleep(1);
BoundaryFill8(x-1,y,Boundarycolor,newcolor);
BoundaryFill8(x,y+1,Boundarycolor,newcolor);
BoundaryFill8(x+1,y,Boundarycolor,newcolor);
BoundaryFill8(x,y-1,Boundarycolor,newcolor);
BoundaryFill8(x-1,y+1,Boundarycolor,newcolor);
BoundaryFill8(x+1,y+1,Boundarycolor,newcolor);
BoundaryFill8(x+1,y-1,Boundarycolor,newcolor);
BoundaryFill8(x-1,y-1,Boundarycolor,newcolor);
}
}
void main()
{
int a,b,c,d,i,j;
int graphdriver=DETECT;
int graphmode=0;
initgraph(&graphdriver,&graphmode," ");
cleardevice();
setcolor(RGB(255,0,255));
rectangle(170,80,270,130);
for(i=171;i<270;i++)
for(j=81;j<130;j++)
{
putpixel(i,j,RGB(0,255,0));
}
a=200;
b=100;
c=RGB(255,0,255);
d=RGB(0,0,255);
BoundaryFill8(a,b,c,d);
getch();
closegraph();
}
运行结果:
2、结果分析:
通过以上各算法运行结果分析与对比可知:
1.四连通算法的缺点是有时不能通过狭窄区域,因而不能填满多边形。
2.八连通算法的缺点是有时会填出多边形的边界。
3.由于填不满往往比涂出更易于补救,因此四连通算法比八连通算法用的更
多。