图形学教案 第三章二Word格式文档下载.docx

上传人:b****5 文档编号:19203980 上传时间:2023-01-04 格式:DOCX 页数:16 大小:1.31MB
下载 相关 举报
图形学教案 第三章二Word格式文档下载.docx_第1页
第1页 / 共16页
图形学教案 第三章二Word格式文档下载.docx_第2页
第2页 / 共16页
图形学教案 第三章二Word格式文档下载.docx_第3页
第3页 / 共16页
图形学教案 第三章二Word格式文档下载.docx_第4页
第4页 / 共16页
图形学教案 第三章二Word格式文档下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

图形学教案 第三章二Word格式文档下载.docx

《图形学教案 第三章二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《图形学教案 第三章二Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。

图形学教案 第三章二Word格式文档下载.docx

⏹边界表示的四连通区域种子填充算法

⏹边界表示的八连通区域种子填充算法

⏹内点表示的四连通区域种子填充算法

⏹内点表示的八连通区域种子填充算法

⏹扫描线种子填充算法

先介绍一个以边界表示的四连通区域种子填充算法(基于递规)

voidBoundaryFill4(intx,inty,TColorboundaryColor,TColornewColor)

{

}

可以稍加修改将其改为基于栈的算法。

(本质上递归也是用栈实现的)

种子填充法不断要进出栈操作,并且重复检查率极高,因此效率非常低。

一种改进方法是使用扫描线种子填充法。

3.3.2扫描线种子填充算法

目标:

减少递归层次

适用于边界表示的4连通区域

算法思想:

在任意不间断区间中只取一个种子像素(不间断区间指在一条扫描线上一组相邻象素),填充当前扫描线上的该段区间;

然后确定与这一区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来,反复进行这个过程,直到所保存的个区段都填充完毕。

扫描线种子填充法的流程描述:

(1)初始化:

堆栈置空。

将种子点(x,y)入栈。

(2)出栈:

若栈空则结束。

否则取栈顶元素(x,y),以y作为当前扫描线。

(3)填充并确定种子点所在区段:

从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。

分别标记区段的左、右端点坐标为xl和xr。

(4)确定新的种子点:

在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素。

若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回

(2)。

该算法对于每一个待填充区段,只需压栈一次;

因此,扫描线填充算法提高了区域填充的效率。

下面将要给出一段可以实现上述算法的C语言代码。

为了使读者易于理解这一段代码。

我们先提供在上述流程基础上结合了数据描述,并且具有更精确描述的一种改进版:

//与上面流程中描述步骤的主要差异是将区间的左端点入栈

(1)若当前点在边界上或者已着色,则结束。

否则将栈清空,当前点(种子)进栈。

(2)出栈,由栈顶元素(x0,y0)确定当前扫描线。

(3)沿扫描线y=y0左移,直到受阻于边界点或已着色点。

将上行标志和下行标志(是两个布尔型的变量)都置为无。

(4)对当前点着色。

(5)检查上行当前点:

若上行标志为无,并且该点既非边界也没有被着色,则置上行标志为有,并且使上行当前点(x,y-1)进栈;

若该点为边界点或者已被着色,则置上行标志为无。

(6)检查下行当前点:

若下行标志为无,并且该点既非边界也没有被着色,则置下行标志为有,并且使下行当前点(x,y+1)进栈;

若该点为边界点或者已被着色,则置下行标志为无。

(7)将当前点右移一个象素(x++)。

(8)若当前点不是边界则转(4)。

否则:

若栈空则结束,否则转

(2)。

如果要准确描述上行标志(下行标志)的作用,可以将其称为进入上行待填充区段标志(进入下行待填充区段标志)。

我们的任务是找到每一个待填充的区段,并且将取自该区段的一个点(一般是左端点或右端点)压入栈内。

根据以上流程编写的C语言代码如下:

voidfloodFill(TColorbCL,TColorfCL)

intX,Y;

//定义用于当前点位置坐标的变量

TColorCL;

booluflag,dflag;

//定义用于上行标志和下行标志的变量

while(!

emptys())

}

}

调用时先清空栈,再将当前点入栈。

然后执行floodFill。

例如:

top=0;

Push(x0,y0);

floodFill(clred,clBlue);

 

3.3.3扫描线多边形填充算法

3.4字符

3.4.1字符存储与显示

1.点阵字符

点阵字符利用掩膜(是一种位图)来定义,可将其写入帧缓存显示。

点阵字符的显示:

首先从字库中将它的位图检索出来,然后将检索到的位图写到帧缓冲器中。

读取帧缓存中这些像素值,就可以在屏幕上显示此字符。

如果将保存在帧缓存中某字符掩膜相应像素值均置成背景色或背景光强,就可以擦除帧缓存中的该字符。

点阵字库文件大小的计算问题

例:

已知字库中有8000汉字,字符使用12*12点阵显示,求字库在未压缩时的文件尺寸。

解:

12*12*8000/8=144000≈144k字节。

2.矢量字符

矢量字符被表达为一个点坐标(以及一些附加标志)的序列,相邻两点可以连成一个线段(笔划),字符的形状用这样的序列描述。

矢量字符的显示:

首先从字库中读它的字符信息。

然后取出端点坐标,对其进行适当的几何变换,再根据各标志显示出字符。

3.TrueType字符

注:

TrueType是微软Windows中使用的名称。

可能称为曲线型字符更贴切。

这种字符有点类似矢量字符,但能够更精确描绘曲线的笔画(也更复杂)。

适合中文等有较高显示要求的场合。

它综合了曲线表示、填充、数据压缩等技术手段,并多方面对算法进行优化,具有高科技特点。

4.比较几种类型字符的优缺点

点阵字符:

存储量大,易于显示

矢量字符:

存储量小,美观,变换方便需要光栅化后才能显示。

3.4.2字符属性

显示的字符的外观由字体、字形、字号、字间距、行间距等属性控制。

一般来说,字体确定风格,字形确定外观,字号确定尺寸。

3.5裁剪

裁剪(Clipping)是裁去窗口之外物体的一种操作。

在二维图形显示处理中,首先在物体坐标系中取“景”,即在某一定观察范围(窗口)对原始图形进行“剪取”,保留窗口内的可见部分,舍弃窗口外的不可见部分,如图3-40所示。

然后对窗口内保留的这一部分图形进行各种变换处理,并在屏幕上显示出来。

这种先裁剪后变换的处理顺序可以省去许多不必要的后续变换处理工作,从而提高图形处理的速度。

图3-40裁剪示意图

裁剪的基本目的是判断图形元素是否在所考虑的区域内,如在区域内,则进一步求出区域内的那一部分。

因此,裁剪处理包含两部分内容:

(1)点在区域内外的判断;

(2)计算图形元素与区域边界的交点。

由于组成图形、图像的每一个基本图形元素都要经过裁剪工作,因此效率的高低是至关重要的,下面就分别介绍一些常用的基本图形元素裁剪算法。

被裁剪的对象可以是线段、多边形、字符,也可以是三维图形,本节主要讨论二维裁剪。

裁剪的边界(即窗口的边界)一般定义为标准矩形,即边与坐标轴平行的矩形,由上(y=yt)、下(y=yb)、左(x=xl)、右(x=xr)四条边界组成。

3.5.1点的裁剪

3.5.2直线裁剪

直线裁剪算法是最基本的裁剪算法。

由于复杂的曲线可以通过折线段来模拟,因此直线裁剪算法是复杂图元裁剪的基础。

基本思想是:

判断直线与窗口的位置关系,确定该直线是完全可见、部分可见或完全不可见,然后输出处于窗口内线段的端点,并显示此线段。

常用的直线裁剪方法有三种:

Cohen—Sutherland、中点分割算法和梁友栋-barskey算法。

1.Cohen—Sutherland裁剪算法

这种直线剪裁算法是由Cohen及Sutherland提出的,也称编码裁剪法。

编码裁剪法以区域编码为基础,将窗口及其周围的八个方向以4bit的二进制数进行编码,如图3-42所示。

具体编码过程为延长窗口的四条边线,将二维平面分成九个区域。

任何一条线段的端点都按其所处区域赋予4位编码CtCbCrCl。

其中各位编码的定义如下:

图3-42区域编码

⏹第一位为1:

端点处于上边界线的上方;

⏹第二位为1:

端点处于下边界线的下方;

⏹第三位为1:

端点处于右边界线的右方;

⏹第四位为1:

端点处于左边界线的左方;

⏹否则,相应位为0。

即按上,下,右,左(TBRL)顺序对4位编码,窗口边框之外时为1,之内为0。

编码裁剪算法的规则如下:

1.分别计算线段两端点的编码。

2.如果两个编码都是0000,则线段被保留;

算法结束。

3.对两端点的四位二进制编码进行逻辑与(按位乘)运算,如果结果不为0000,那么至少对某一位两个编码都是1,可推断出该线段必位于窗口某一侧之外,因此可直接舍弃;

4.否则,可找到线段与窗口某条边的一个交点,线段被该点分为二截,舍弃落在窗口外的一截。

计算该交点的二进制编码,用该编码替换调已舍弃的线段上原先那个端点的编码,再转到2进行下一轮检查。

(注意,该交点的编码不一定为0000,因为可能在边框的延伸部分上)

例3-10如图3-43所示,裁剪AB、CD、EF直线段。

图3-43AB、CD、EF直线段与裁剪窗口

解根据编码算法,各直线段端点的四位二进制编码如下:

C:

0000D:

0000C、D编码全为0,CD直线段直接保留。

E:

0010F:

0110E、F编码进行逻辑与运算,结果为非0,EF直线段直接舍弃。

A:

0001B:

0000A、B编码进行逻辑与运算,结果为0000,此时应求AB与窗口边界的交点。

因为A在左域,B在窗口内,故只要求得AB与左边线x=xl的交点(x*,y*)。

问题:

该算法下一线段最多被裁剪几次?

 答案:

最多时4次,如下图中线段按“上”、“下”、“左”、“右”四边顺序裁剪时(如按“左”、“右”、“上”、“下”、的顺序两次就够了,但一般事先并不知道哪个顺序好)  

                 

3.5.3多边形裁剪

多边形可描述为由一组顶点按一定顺序连接而成的有向点列。

可将多边形的顶点按逆时针方向顺序连接成一个环来描述多边形的组成,该环可用一链表结构描述。

如图3-45所示的多边形可描述为1-2-3-4-1的链表形式。

图3-45多边形的描述方式

多边形的裁剪基于直线的裁剪,因为可以把它分解为边界的线段,逐段进行裁剪,但它又不同于直线的裁剪。

首先,多边形的各条边是顺次连接的,而直线裁剪是把一条线段的两个端点孤立地加以考虑;

其次,计算机图形学中的多边形通常认为是封闭的图形,裁剪后的图形仍应该是封闭的,而简单的直线裁剪会造成许多孤立的线段。

图3-46多边形裁剪示意图

由此看出,多边形的裁剪要比直线裁剪复杂。

教材中介绍了两种多边形裁剪算法。

我们主要学习其中的逐边裁剪法(又叫Sutherland-Hodgman算法):

每次用窗口的一条边界对多边形进行裁剪,把落在窗口外部的图形去掉,落在窗口内部的图形保留,并把它作为下一次待裁剪的多边形。

连续用窗口的四条边界对原始多边形进行裁剪后,最后得到的就是裁剪后的结果多边形。

算法的每一步考虑窗口的一条边界及其延长线构成的裁剪线。

该裁剪线把平面分成两个部分,一部分包含窗口,称为可见一侧;

另一部分称为不可见一侧。

依序处理多边形各边时会有四种情况。

如图3-47所示,以窗口左边界为例,四种情况如下:

(1)边SP全部处于可见一侧:

此时将终点P放入新的顶点序列。

(2)边SP全部处于不可见一侧:

此时没有点放人新的顶点序列。

(3)边SP从可见一侧进入不可见一侧:

此时将SP与窗口边界的交点I放入新的顶点序列。

(4)边SP从不可见一侧进入可见一侧:

此时将SP与窗口边界的交点I和终点P放人新的顶点序列。

图3-47有向边SP与裁剪线的4种位置关系

说明:

为了上述算法完整,还要添加初始设置以及结束判断有关的描述。

对于其他3条裁剪线,4种位置关系及算法框图都一样,只是判断点在窗口哪一侧以及求线段SP与裁剪边的交点算法应随之改变。

例3-11对如图3-48所示的多边形(点1、2、3、4为多边形顶点,点5、6、7、8为多边形与窗口边界及其延长线的交点)进行裁剪,依次得到的多边形顶点序列如下所示。

初始多边形的顶点序列:

l-2-3-4-1;

经过窗口左边界裁剪后的多边形的顶点序列:

1-5-6-3-4-1;

继续经窗口下边界裁剪后的多边形的顶点序列:

1-5-7-8-4-1;

继续经窗口右边界裁剪后的多边形的顶点序列:

继续经窗口上边界裁剪后的多边形的顶点序列:

1-5-7-8-4-1。

结果多边形的顶点序列:

依次连接结果多边形的顶点序列,就得到了需要的结果多边形。

图3-48Sutherland-Hodgman算法裁剪多边形示意图

有时使用此算法会出现意想不到的结果。

例3-12如图3-49所示,正确的裁剪结果应该由两个不连通的多边形组成,如图(b)所示,但是此算法的裁剪结果增加了额外的边,使其两部分连在一起,如图(c)所示。

图3-49意外的裁剪结果

此时,可以通过后处理,从相反方向画多余的边,从而删除它们。

除此之外,Weiler-Atheflon算法(教材P81,同学可自学)能够很好地解决这类问题。

逐边裁剪(Sutherland—Hodgman)算法的程序实现(参考“实验指导书”中实验五)。

3.5.6三维图形的裁剪

三维图形必须经过投影变换才能在计算机屏幕上显示出来。

为了避免对根本不在投影窗口内的物体做投影变换,减少计算量,通常直接在三维窗口进行裁剪。

采用投影的方法不同,三维窗口的取法也不同。

对于平行投影,可取长方体作为三维裁剪窗口;

对于透视投影,可取四棱台作为三维裁剪窗口。

这里以平行投影为例讨论三维线段的裁剪方法,其余方式可以参考相关资料或自行推导。

...

如果把二维线段的Cohen-Sutherland裁剪算法稍加改进,就能推广到三维平行投影的对于空间任意一条直线段P:

(x1,y1,z1)、P:

(x2,y2,z2),按照上述规则分别赋予编码值。

(1)如果两个端点的编码全为0000,那么该线段完全位于窗口的空间内,可直接保留;

(2)如果对两端点的编码进行逻辑与运算,结果不为零,表示两端点有一相同位1,则两端点在窗口的同侧位置,那么整条线段必位于窗口外,可直接舍弃;

(3)若均不属于前两种情况,则这一线段既不能直接保留,也不能直接舍弃,它可能与窗口相交。

此时,需要计算出线段与窗口表面的交点,并将线段分段后继续处理,直到余下的线段符合前两种简单情况为止。

3.6反走样

对图形进行光栅化时,是用离散的像素显示在连续空间中定义的对象。

这种用离散量表示连续量时引起的失真现象称为走样;

用于减少或消除走样的技术称为反走样。

1.阶梯形走样

这是一种常见的走样现象。

像素是有面积的,并不是理想中面积为0的点。

由于显示器的空间分辨率有限,对于除水平、垂直、±

45º

以外的直线,因像素逼近误差,会使所画图形产生畸变(阶梯、锯齿)现象,又如在一个填充区域的边界也经常会看到阶梯形或锯齿形现象。

2.狭小图形遗失

如图3-53所示,在光栅图形终端上显示细长的多边形时,由于仅当像素中心被这些多边形覆盖时像素才被显示,对于一些分布在两条扫描线之间的狭小的多边形,因为它们不覆盖任何一个像素的中心,所以在显示时都遗失了。

3.细节失真

如图3-54所示,由于像素是图形显示的最小单位,当一些细小的多边形覆盖了像素的中心时,即使多边形没有像素宽,也至少要以像素的宽度显示,从而造成图形中那些比像素更窄的细节变宽。

除了静态图形的走样之外,动画序列中狭小的图形也会时隐时现,产生闪烁现象,如图3-55所示。

图3-53狭小图形遗失

图3-54细节失真

图3-55动画图形的闪烁

3.6.2常用反走样技术

为了提高图形的质量,常采用一些算法减少走样现象,称为反走样算法。

1.提高分辨率

可以分别从硬件和软件两方面提高分辨率。

(1)硬件方法:

采用高分辨率的光栅扫描显示器。

如图3-56所示,把光栅扫描显示器的分辨率提高一倍,每个阶梯的宽度也减小了一倍,走样没有以前明显,所以可用此方法来改善图形质量。

但是这种方法经济成本较高,而且分辨率也不能无限提高,要受到技术和经费的制约。

图3-56提高分辨率

(2)软件方法:

采用高分辨率计算,低分辨率显示。

这种方法的经济成本较低,而且易于实现。

高分辨率计算是指将低分辨率的图形显示像素划分为许多子像素,如2x2划分,3x3划分等,然后用扫描转换算法求得每个像素内的各个子像素的颜色或灰度值。

如图3-57所示,将每个像素划分成四个子像素,低分辨率显示是指对一像素内的各个子像素的颜色或灰度值求算术平均或加权平均,将平均值作为显示该像素的颜色或灰度值。

图3-57将每个像素划分成四个子像素(实心大圆为像素,空心小圆为子像素)

2.简单的区域取样(略)

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

当前位置:首页 > 成人教育 > 专升本

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

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