中国高校课件下载中心 》 教学资源 》 大学文库

吉林大学:《计算机图形学》课程电子教案(PPT课件)第二章 图形基元的显示 第四节 多边形的扫描转换算法

文档信息
资源类别:文库
文档格式:PPT
文档页数:17
文件大小:180.5KB
团购合买:点击进入团购
内容简介
吉林大学:《计算机图形学》课程电子教案(PPT课件)第二章 图形基元的显示 第四节 多边形的扫描转换算法
刷新页面文档预览

利用区域的连通性进行区域填充, 除了需要区域应该明确定义外,还需要 事先给定一个区域内部象素,这个象素 称为种子。 做区域填充时,要进行对光栅网格 的遍历,找出由种子出发能达到而又不 穿过边界的所有象素。 这种利用连通性的填充,其主要优 点是不受区域不规则性的影响,主要缺 点是需要事先知道一个内部象素

利用区域的连通性进行区域填充, 除了需要区域应该明确定义外,还需要 事先给定一个区域内部象素,这个象素 称为种子。 做区域填充时,要进行对光栅网格 的遍历,找出由种子出发能达到而又不 穿过边界的所有象素。 这种利用连通性的填充,其主要优 点是不受区域不规则性的影响,主要缺 点是需要事先知道一个内部象素

void Floodfill(int x,int y,COLORREF oldvalue,COLORREF newvalue) /:(x,y)为种子oldvalue是原值 newvalue 是新值,应不等于原值。*/ if (GetPixel(x,y)==oldvalue) {SetPixel(x,y,newvalue);//赋值为新值 Floodfill(x,y-l,oldvalue,.newvalue);l/四向扩散 Floodfill(x,y+1,oldvalue,newvalue); Floodfill(x-1,y,oldvalue,newvalue); Floodfill(x+1,y,oldvalue,newvalue);

void Floodfill(int x,int y,COLORREF oldvalue,COLORREF newvalue) /*(x,y)为种子 oldvalue是原值 newvalue 是新值,应不等于原值。*/ { if (GetPixel(x,y) == oldvalue) { SetPixel(x,y,newvalue);//赋值为新值 Floodfill(x,y-1,oldvalue,newvalue);//四向扩散 Floodfill(x,y+1,oldvalue,newvalue); Floodfill(x-1,y,oldvalue,newvalue); Floodfill(x+1,y,oldvalue,newvalue); } }

void Boundaryfill(int x,int y,COLORREF boundaryvalue,COLORREF newvalue) /(x,y)为种子位置 boundaryvalue是边界象素值 newvalue是区域内象素新值,未填充前区域 内不应有值为aewvaluel的象素。*/ if(GetPixel(x,y)!=boundaryvalue &GetPixel(x,y)!=newvalue) //未达边界且未访问过

void Boundaryfill(int x,int y,COLORREF boundaryvalue,COLORREF newvalue) /*(x,y) 为种子位置 boundaryvalue是边界象素值 newvalue是区域内象素新值,未填充前区域 内不应有值为newvalue的象素。*/ { if( GetPixel(x,y)!=boundaryvalue && GetPixel(x,y)!=newvalue) // 未达边界且未访问过

SetPixel(x,y,newvalue);//赋以新值 Boundaryfill(x,y-1,boundaryvalue,newvalue); //向四个方向扩散。 Boundaryfill(x,y+1,boundaryvalue,newvalue); Boundaryfill(x-1,y,boundaryvalue,newvalue); Boundaryfill(x+1,y,boundaryvalue,newvalue);

{ SetPixel(x,y,newvalue);//赋以新值 Boundaryfill(x,y-1,boundaryvalue,newvalue); //向四个方向扩散。 Boundaryfill(x,y+1,boundaryvalue,newvalue); Boundaryfill(x-1,y,boundaryvalue,newvalue); Boundaryfill(x+1,y,boundaryvalue,newvalue); } }

扫描线种子填充算法 将区域内由边界点限定的同一行内相 连接的不具有新值newvalue的一组象素 称为一个象素段,象素段用它最右边的 象素来标识。 算法的步骤如下: 1.对种子所在象素段进行填充。 2.从右至左检查种子所在行的上一 横行,将查得的象素段依次编号存入堆 栈。接着对种子所在行的下一横行同样 处理

扫描线种子填充算法 将区域内由边界点限定的同一行内相 连接的不具有新值newvalue的一组象素 称为一个象素段,象素段用它最右边的 象素来标识。 算法的步骤如下: 1.对种子所在象素段进行填充。 2.从右至左检查种子所在行的上一 横行,将查得的象素段依次编号存入堆 栈。接着对种子所在行的下一横行同样 处理

3。若堆栈为空则算法结束,否则从堆栈 顶部取出一个象素段。就以这个象素为 新的种子,返回到1。 下面我们用伪C语言写出扫描线填充 算法。 void ScanlineSeedfill(int x,int y,COLORREF boundaryvalue,COLORREF newvalue) int x0,xl,xr,y0,xid; int flag; Stack s;

3.若堆栈为空则算法结束,否则从堆栈 顶部取出一个象素段。就以这个象素为 新的种子,返回到1。 下面我们用伪C语言写出扫描线填充 算法。 void ScanlineSeedfill(int x,int y,COLORREF boundaryvalue,COLORREF newvalue) { int x0,xl,xr,y0,xid; int flag; Stack s;

Point p; s.push(Point(xy);//种子象素入栈 while(!s.isempty() p=spop0;//栈顶象素出栈 X-p.X; y-p.y; SetPixel(x,y ,newvalue); x0=X+1; while(GetPixel(x0,y)!=boundaryvalue)// 填充右方象素

Point p; s.push(Point(x,y));//种子象素入栈 while(!s.isempty()) { p=s.pop(); //栈顶象素出栈 x=p.x; y=p.y; SetPixel(x ,y ,newvalue); x0= x+1; while(GetPixel(x0,y)!=boundaryvalue)// 填充右方象素

{ SetPixel(x0,y,newvalue); x0++; 3 xr=x0-1;//最右象素 x0=X-1; while(GetPixel(x0,y)!=boundaryvalue)// 填充左方象素 SetPixel(x0,y ,newvalue); x0-;

{ SetPixel(x0 ,y ,newvalue); x0++; } xr=x0-1;//最右象素 x0= x-1; while(GetPixel(x0,y)!=boundaryvalue)// 填充左方象素 { SetPixel(x0 ,y ,newvalue); x0--; }

x=x0+1;/最左象素 /检查上一条扫描线和下一条扫描线, /若存在非边界且未填充的象素, //则选取代表各连续区间的种子象素入 栈。 y0=y; for(int i=1;i>=-1;i-=2) xO=xr; y=y0+i;

xl=x0+1;//最左象素 //检查上一条扫描线和下一条扫描线, //若存在非边界且未填充的象素, //则选取代表各连续区间的种子象素入 栈。 y0=y; for(int i=1;i>=-1;i-=2) { x0=xr; y=y0+i;

while(x0>=xI) flag-0; while((GetPixel(x0,y)!=boundaryvalue) && (GetPixel(x0,y)!=newvalue) &&(x0>x)) if(flag==0)

while(x0>=xl) { flag=0; while((GetPixel(x0,y)!=boundaryvalue) && (GetPixel(x0,y)!=newvalue) && (x0>xl)) { if(flag==0) {

共17页,试读已结束,阅读完整版请下载
刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档