1、第3章 基本光栅图形生成技术,显示器是由离散像素组成的矩阵,在绘制具有连续性质的直线、曲线或区域等基本图形时,需要确定最佳逼近它们的像素,这个过程称为光栅化。当光栅化按照扫描线的顺序进行时,它被称为扫描转换。对于一维图形,在不考虑线宽时,用一个像素宽的直、曲线来显示图形。二维图形的光栅化必须确定区域对应的像素集,并用指定的属性或图案显示之,即区域填充。光栅化和扫描转换是光栅图形学的基本问题,其算法的好坏对系统的效率有直接的关系。,VC提供了一个显示像素函数:SetPixel(x,y, color); 而在Turbo中显示像素函数为:putpixel (x,y,color); 其中,x和y为像素
2、的位置坐标,color为像素的颜色。,安徽师范大学数学计算机科学学院 计算机图形学,图形光栅化,光栅化图形的处理,本章的主要内容,确定最佳逼近的象素集合及其颜色,进而在光栅图形显示器上显示一个图形的过程。,1、区域填充。2、线宽和线型。3、字符。4、图形的裁剪。5、图形的反走样。对一个图形进行光栅化处理时所出现的走样现象进行处理。,安徽师范大学数学计算机科学学院 计算机图形学,直线(段)的光栅化,区域填充,安徽师范大学数学计算机科学学院 计算机图形学,图案填充,具有一定宽度的直线,安徽师范大学数学计算机科学学院 计算机图形学,点阵字符 点阵字库中的位图表示,安徽师范大学数学计算机科学学院 计算
3、机图形学,二维图形的裁剪,安徽师范大学数学计算机科学学院 计算机图形学,反走样前的直线段,反走样后的效果,安徽师范大学数学计算机科学学院 计算机图形学,直线的扫描转换: 确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。 三个常用算法: 数值微分法(DDA) 中点画线法 Bresenham算法,3.2 线的生成算法,安徽师范大学数学计算机科学学院 计算机图形学,1 数值微分(DDA)法 Digital Differential Analyzer,基本思想已知过端点 的直线段L:直线斜率为 从 的左端点 开始,向 右端点前进。步长=1(个象素),计算相应的y坐标 ;取象素点
4、(x, round(y)作为当前点的坐标(k 1时)。,安徽师范大学数学计算机科学学院 计算机图形学,作为最底层的光栅图形算法,在通常的CAD/图形系统中,会被大量应用,因此,哪怕节约一个加法或减法,也是很了不起的改进。 由此出发点,导致增量算法的思想。 首先考虑k 1的情形。,这种方法非常直观、容易理解,但是效率较低。这是因为每步运算中都有一个浮点乘法与一个舍入运算。,安徽师范大学数学计算机科学学院 计算机图形学,考虑到即:当x每递增1,y递增k(即直线斜率);,例:画直线段 x floor(y+0.5) y 0 0 0 1 0 0.4 2 1 0.8 3 1 1.2 4 2 1.6 5 2
5、 2.0 注:网格点表示象素中心,K=0.4,void DDALine(int x0,int y0,int x1,int y1,int color) int x; float dx, dy, y, k; dx = x1-x0, dy=y1-y0; k=dy/dx; for (x=x0, y=y0; xx1;x+) putpixel (x, floor(y+0.5), color); y=y+k;,安徽师范大学数学计算机科学学院 计算机图形学,注意上述分析的算法仅适用于k 1的情形。 当 k 1时,会如何?(答案见下页),k 1 示意图,即:当y每递增1,x递增1/k.,安徽师范大学数学计算机科
6、学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,void ddaline(int x0,int y0,int x1,int y1,int color) int x; float dx, dy, y, k; dx = x1-x0, dy=y1-y0; k=dy/dx, x=x0; for (y=y0; yy1; y+) putpixel (floor(x+0.5), y, color); x=x+1/k;,void ddaline(int x0,int y0,int x1,int y1,int color) int i; float dx, dy, length,x,y; i
7、f (fabs(x1-x0)=fabs(y1-y0)length=fabs(x1-x0); elselength=fabs(y1-y0); dx = (x1-x0)/length; dy=(y1-y0)/length; i=1;x= x0;y= y0; while(i=length) putpixel (floor(x+0.5), floor(y+0.5), color); x=x+dx;y=y+dy;i+; ,DDA算法与基本算法相比,减少了浮点乘法,提高了效率。但是x与dx、y与dy用浮点数表示,每一步要进行四舍五入后取整,不利于硬件实现,因而效率仍有待提高。,Bresenham算法,假设
8、当前直线上的像素坐标为p(xi, yi),那么下一步需要在列xi+1上确定扫描线y的值。y值要么不变,要么递增1,可通过比较d1和d2来决定。,如图3-3所示,对于直线斜率k在01之间的情况,从给定线段的左端点P0(x0, y0)开始,逐步处理每个后续列(x位置),并在扫描线y值最接近线段的像素上绘出一点。,根据误差项d的值来决定是否增1的过程如下:,设y=y1y0, x=x1x0,则k=y/x,代入上式,得;,是常量,与像素位置无关,则di的计算仅包括整数运算,其符号与(d1-d2)的符号相同。 当di0时,像素p2(xi1,yi1)与直线上理想位置更接近; 当di=0时,两个像素与直线上理
9、想位置一样接近,可约定取p2(xi1,yi1)。,如果选择右上方像素,即: ,则:,如果选择右方像素,即: ,则:,对于每个整数x,从线段的坐标端点开始,循环的进行误差量的计算。在起始像素(x0,y0)的第一个参数d0为:,例:i xi yi e 1 0 0 -1 2 1 0 3 3 2 1 -3 4 3 1 1 4 2 -5 5 2 -1,安徽师范大学数学计算机科学学院 计算机图形学,void Bresenham_Line (int x0,int y0,int x1, int y1,int color) int dx,dy,e,i,x,y;dx = x1-x0, dy = y1- y0, e
10、=2*dy-dx; x=x0, y=y0; for (i=0; i=0) y+; e=e+2*dy-2*dx; else e=e+2*dy;,思考:如何将Bresenham画线算法推广到k1情形。,安徽师范大学数学计算机科学学院 计算机图形学,void bresenhamLine02 (int x0,int y0,int x1, int y1,int color)int dx,dy,e,i,x,y;dx = y1-y0, dy =x1- x0, e=2*dy-dx; x=y0, y=x0; for (i=0; i=0) y+; e=e+2*dy-2*dx; else e=e+2*dy;,习题3
11、.1,安徽师范大学数学计算机科学学院 计算机图形学,3.2 圆(弧)的扫描转换算法,直角坐标法、参数方程法、中点画圆算法和Bresenham画圆算法等。,1、直角坐标法,直角坐标法的缺点:1)效率太低。2)在圆的左右两侧象素太稀疏。,让x从xc-r到xc+r变化,每次递增1,就可以求出对应的y坐标。,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,2、参数方程法,给出圆的极坐标方程:,让从0到2变化,每次递增/180,可以求出圆周上的离散象素点。,该算法生成的象素均匀。但含有三角函数运算,效率太低。,安徽师范大学数学计算机科学学院 计算机图形学,安徽
12、师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,考虑中心在原点,半径为R 的第二个8分圆。 构造函数:构造判别式(圆方程),安徽师范大学数学计算机科学学院 计算机图形学,若 d=0, 则应取P2为下一象素,而且下一象素的判别式为第 一个象素是(0,R), 判别式d的初始值为,安徽师范大学数学计算机科学学院 计算机图形学,MidPointCircle(int r, int color) int x,y;float d;x=0; y=r; d=1.25-r;putpixel (x,y,color); while(xy) if(d0) d+=2*x+3; x+
13、;else d+=2*(x-y)+5; x+;y-; putpixel (x,y,color); ,为了进一步提高算法的效率,可以将上面算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 使用e=d-0.25代替d,则e为整数。 容易看出,e0=d0-0.25=1-R 因此有:,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,若 e=0, 则应取P2为下一象素,而且下一象素的判别式为第 一个象素是(0,R), 判别式d的初始值为,MidPointCircle(int r, int color) int x,y,e;x=0;
14、y=r; e=1-r;putpixel (x,y,color); while(xy) if(e0) e+=2*x+3; x+;else e+=2*(x-y)+5; x+;y-; putpixel (x,y,color); ,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,思考:如何生成圆心在(xc,yc),半径为r的圆?,可以看作圆心在原点的等圆的平移。,安徽师范大学数学计算机科学学院 计算机图形学,3.3 椭圆的扫描转换算法,讨论的方法与中点画圆类似。 我们首先讨论中心在坐标原点的标准椭圆。即令下面讨论第一象限的四分之一椭圆弧。,安徽师范大学数学计
15、算机科学学院 计算机图形学,由微积分的知识,在该椭圆上点(x,y)处的法向量为: 当椭圆弧上的点从(0,b )向(a,0)变化过程中,2b2x2a2y,也就是说,在该椭圆弧上一定存在点P,在该点处 2b2x=2a2y。,安徽师范大学数学计算机科学学院 计算机图形学,先讨论上半椭圆弧:假设当前象素为(xp,yp),那么下一对侯选象素的中点为(xp+1,yp-0.5)。因此,判别式如果 ,应取正右方的 象素(xp+1,yp);如果 , 应取右下方的象素(xp+1,yp-1)。与圆的中点扫描算法类似, 我们也可以采用增量算法计算判别式以提高计算效率。,安徽师范大学数学计算机科学学院 计算机图形学,如
16、果 ,应取正右方的象素(xp+1,yp);该象素的判别式为如果 ,应取右下方的象素(xp+1,yp-1)。该象素的判别式为初始时,,安徽师范大学数学计算机科学学院 计算机图形学,现在讨论下半椭圆弧:假设当前象素为(xp,yp),那么下一对侯选象素的中点为(xp+0.5,yp-1)。因此,判别式如果 ,应取右下方的 象素(xp+1,yp-1);如果 , 应取正下方的象素(xp,yp-1)。类似,我们来计算增量。,安徽师范大学数学计算机科学学院 计算机图形学,如果 ,应取右下方的象素(xp+1,yp-1);该象素的判别式为如果 ,应取正下方的象素(xp,yp-1)。该象素的判别式为,安徽师范大学数
17、学计算机科学学院 计算机图形学,下面来求d2的初值。显然, d2的初值出现在由上半椭圆弧转入下半椭圆弧的 时候。下半椭圆弧的第一个象素就是上半椭圆弧的最后一个象素。设在上半椭圆弧的最后一个象素是(xp,yp),那么d2的初值为,midpointellipse(a,b,c) int a,b,c; int x,y;float d1,d2; x=0;y=b; d1=b*b+a*a*(-b+0.25); putpixel(x,y,c); while(b*b*(x+1)a*a*(y-0.5) if(d10) d1+=b*b*(2*x+3);x+;elsed1+=b*b*(2*x+3)+a*a*(-2*y
18、+2);x+;y-;putpixel(x,y,c); /*上半椭圆结束*/,d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b; while(y0) if(d20)d1+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);y-;putpixel(x,y,c); ,midpointellipse(a,b,c) int a,b,c; int x,y;float d1,d2; x=0;y=b; d1=b*b+a*a*(-b+0.25); putpixel(x,y,c); putpixel(x,-y,c);
19、 putpixel(-x,y,c); putpixel(-x,-y,c); while(b*b*(x+1)a*a*(y-0.5) if(d10) d1+=b*b*(2*x+3);x+;elsed1+=b*b*(2*x+3)+a*a*(-2*y+2);x+;y-;putpixel(x,y,c); putpixel(x,-y,c); putpixel(-x,y,c); putpixel(-x,-y,c); /*上半椭圆结束*/,有对称性,不难得出中心在原点的整个椭圆的算法。,d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b; while(y0) if(d
20、20)d1+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);y-;putpixel(x,y,c); putpixel(x,-y,c); putpixel(-x,y,c); putpixel(-x,-y,c); ,midpointellipse(xr,yr,a,b,c) int xr,yr,a,b,c; int x,y;float d1,d2; x=0;y=b; d1=b*b+a*a*(-b+0.25); putpixel(x+xr,y+yr,c); putpixel(x+xr,-y+yr,c); putpixel(-x+xr,y+yr,
21、c); putpixel(-x+xr,-y+yr,c); while(b*b*(x+1)a*a*(y-0.5) if(d10) d1+=b*b*(2*x+3); x+;elsed1+=b*b*(2*x+3)+a*a*(-2*y+2);x+;y-;putpixel(x+xr,y+yr,c); putpixel(x+xr,-y+yr,c); putpixel(-x+xr,y+yr,c); putpixel(-x+xr,-y+yr,c); /*上半椭圆结束*/,由平移变换,立即得到中心在任意位置(xr,yr)的椭圆的算法。,d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)
22、-a*a*b*b; while(y0) if(d20)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);y-;putpixel(x+xr,y+yr,c); putpixel(x+xr,-y+yr,c); putpixel(-x+xr,y+yr,c); putpixel(-x+xr,-y+yr,c); ,安徽师范大学数学计算机科学学院 计算机图形学,主函数如下:,#include #include main() int gdriver=DETECT,gmode; initgraph( ,安徽师范大学数学计算机科学学院 计算机图形学,本
23、节思考题,1、请仿照图3-4用Bresenham画线算法对直线段P1P2进行光栅化时的光栅点的位置。其中P1(1,1),P2(8,5)。 2、将Bresenham画线算法推广到k1情形。 3、用直角坐标法对圆(弧)进行扫描转换有哪些缺陷? 4、试编写算法,对圆心在任意位置的圆进行扫描转换。 5、在对第一象限八分之一椭圆弧进行光栅扫描转换时,由上半椭圆弧向下半椭圆弧过渡的条件是什么?,安徽师范大学数学计算机科学学院 计算机图形学,void MidpointLine02 (int x0,int y0,int x1, int y1,int color)int dx,dy,e,i,x,y;dx = y
24、1-y0, dy =x1- x0, e=2*dy-dx; x=y0, y=x0; for (i=0; i=0) y+; e=e+2*dy-2*dx; else e=e+2*dy;,安徽师范大学数学计算机科学学院 计算机图形学,3.3 区域填充,安徽师范大学数学计算机科学学院 计算机图形学,填充二值位图,安徽师范大学数学计算机科学学院 计算机图形学,填充RGB图象,多边形区域有两种重要的表示方法顶点表示和点阵表示。 顶点表示,即是用多边形的顶点序列来表示多边形。这种表示直观、几何意义强、占内存少,易于进行几何变换,但由于它没有明确指出哪些像素在多边形内,故不能直接用于区域填充。 点阵表示,则是用
25、位于多边形内的像素集合来刻画多边形。这种表示丢失了许多几何信息,但便于进行填充。,安徽师范大学数学计算机科学学院 计算机图形学,区域填充的方法主要有: (多边形域的)扫描线填充算法、区域的递归填充算法 (简单的种子填充算法) 、区域的扫描线填充算法(改进的种子填充算法)。扫描线类算法适应于顶点表示,种子填充类算法适应于点阵表示。,安徽师范大学数学计算机科学学院 计算机图形学,3.3.1 区域的递归填充算法 (简单的种子填充算法),内点表示:区域内的所有像素着同一颜色,而区域外的所有像素具有另外的颜色; 边界表示:区域边界上的所有像素点具有特定的颜色(可以是填充色),在区域内的所有像素均不能具有
26、这一特定色,而且边界外的像素不能具有与边界相同的颜色。,和递归填充算法相关的两种区域的表示,安徽师范大学数学计算机科学学院 计算机图形学,边界表示的区域的递归填充算法的思想,在给出区域光栅化后的边界位置及边界颜色代码boundary_color后,现在要从多边形内部某一象素(x,y)开始按一定的填充方法对多边形进行填充。该象素称为种子点。要求填充的颜色为fill_color。,安徽师范大学数学计算机科学学院 计算机图形学,内点表示的区域的递归填充算法的思想,在给出区域光栅化后的内点的颜色代码oldcolor后,现在要从多边形内部某一象素(x,y)开始按某一种填充方法对多边形进行填充。该象素称为
27、种子点。要求填充的颜色为newcolor。,安徽师范大学数学计算机科学学院 计算机图形学,两种填充方式,四邻法:已知象素是区域内的一点,据此向上、下、左、右4个方向测试、填色、扩散。,八邻法:已知象素是区域内的一点,据此周围8个方向测试、填色、扩散。,安徽师范大学数学计算机科学学院 计算机图形学,四连通区域指的是从区域上一点出发,可通过四个方向,即上、下、左、右移动的组合,在不越出区域的前提下,到达区域内的任意像素。,区域按连通情况又可分为四连通区域和八连通区域。,区域的递归填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。,安徽师范大学数学计算机科学学
28、院 计算机图形学,八连通区域指的是从区域内每一像素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下移动的组合,在不越出区域的前提下,到达区域内的任意像素。,安徽师范大学数学计算机科学学院 计算机图形学,四邻法的缺点:当用四邻法填充一个八连通区域时,由于它无法填充对角线上的连通象素,因而可能造成某些区域没有被填上。但是,如果希望两个区域填不同的颜色,用四邻法就比较合适。,安徽师范大学数学计算机科学学院 计算机图形学,八邻法的缺点:当用八邻法填充一个四连通区域时,由于它填充是按8个方向进行的,因而可能造成从对角线方向越界,造成意想不到的后果。,一般来说,四邻法比八邻法用得更普遍。因为
29、,填不满比涂出界更容易补救。,安徽师范大学数学计算机科学学院 计算机图形学,边界表示的四连通区域的递归填充算法 。 内点表示的四连通区域的递归填充算法 。边界表示的八连通区域的递归填充算法 。 边界表示的八连通区域的递归填充算法 。,四邻法,八邻法,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,1、试写出和递归填充算法相关的两种区域的表示。 2、解释下列名词:四邻法、八邻法,四连通区域、八连通区域。 3、写出边界表示的4连通区域的递归填充算法。 4、写出内点表示的4连通区域的递归填充算法。,本节思考题(
30、作业),安徽师范大学数学计算机科学学院 计算机图形学,简单的种子填充算法中含有4条递归语句,效率太低。并且当区域过大时会造成堆栈溢出。解决上述问题的办法是引入扫描线算法,得到了各种改进的算法,即区域的扫描线填充算法。主要有多边形区域的扫描线填充算法、和扫描线种子填充算法等。,安徽师范大学数学计算机科学学院 计算机图形学,基本思想: 按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。 对于一条扫描线填充过程可以分为四个步骤: 求交(点) (交点)排序 交点配对 (区间)填色,3.3.2多边形的扫描线填充算法,安徽师范大学数学计算机科学学院 计算机图形学
31、,一个多边形与若干扫描线,扫描以线6为例进行分析,安徽师范大学数学计算机科学学院 计算机图形学,情况1 分析扫描线2与多边形的相交情况。,两个特殊情况的考虑,安徽师范大学数学计算机科学学院 计算机图形学,通过以上的分析,我们作出第一次修正。,当扫描线通过多边形的左右顶点时,交点计数为1。,注: 上述修正还不能保证填充的正确,因为对边界上象素的取舍不当会出现所谓的“过填”问题。,安徽师范大学数学计算机科学学院 计算机图形学,情况2 分析扫描线1、7与多边形的相交情况。,安徽师范大学数学计算机科学学院 计算机图形学,“过填”造成边长为2个单位的正方形变为边长为3个单位。,安徽师范大学数学计算机科学
32、学院 计算机图形学,避免出现上述“过填”现象,必须要对多边形的边界象素进行取舍。1)对扫描线与多边形的相交区间取“左闭右开”。2)对扫描线与多边形的上下顶点相交时,交点的取舍方法为“下闭上开”,即丢弃上方水平边或上顶点。即当扫描线与多边形交于上顶点时,交点计数为0。当扫描线通过多边形的下顶点时,交点计数为2。,安徽师范大学数学计算机科学学院 计算机图形学,将多边形的顶点进行上述处理之后,用(水平)扫描线由下到上扫描多边形,求出每条扫描线与多边形的交点,将这些交点按x 坐标进行排序,将排序后的交点成对取出,按照左闭右开的方式以给定的颜色画线。多边形被扫描后,填色也就完成了。,多边形扫描线填充算法
33、的思想,安徽师范大学数学计算机科学学院 计算机图形学,如何去求扫描线与多边形的交点?直接法将每根扫描线与多边形的所有边求交点。这种方法的效率太低,因为事实情况往往是扫描线只与多边形的少数边有交点。,安徽师范大学数学计算机科学学院 计算机图形学,活性边表法,把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表(或数组)中,称为活性边表(AET)。结点内容x:当前扫描线与边交点的x坐标 x:从当前扫描线到下一条扫描线间x的增量,为1/k,其中k为斜率。 ymax:该边所交的最高扫描线号ymax,安徽师范大学数学计算机科学学院 计算机图形学,扫描线6的AET。,安徽
34、师范大学数学计算机科学学院 计算机图形学,活性边表中的x(从当前扫描线到下一条扫描线间x的增量,为1/k,其中k为斜率)和ymax(该边所相交的最高扫描线号)在求交点过程中是非常有用的。这表现在如下两个方面:,安徽师范大学数学计算机科学学院 计算机图形学,1) 假定当前扫描线与多边形某一条边的交点的x坐标为x,则下一条扫描线与该边的交点不要重计算,只要加一个增量x。事实上,设该边的直线方程为:ax+by+c=0; 若yyi,x=x i;则当y = y i+1时,其中 =1/k为常数,安徽师范大学数学计算机科学学院 计算机图形学,2)当求完当前扫描线与多边形的交点后,应将与下一条扫描线不相交的边
35、从活性边表中删除。这可以通过比较边的最高顶点的y值和ymax得到。,安徽师范大学数学计算机科学学院 计算机图形学,对于那些与下一条扫描线有交点的新边,应及时插入到活性边表中(按x递增排序)。为了能快速找出与当前扫描线第一次有交点的新边,我们为每一条扫描线建立一个新边表(NET)新边表的建立:先按低端点的y坐标值对所有的边进行分组,若某边的低端点y值为ymin,则该边就放在扫描线y=ymin所对应的表中;然后用排序方法,按低端点的x坐标值递增的顺序将同一组中的边排列成行。,NET中的基本元素、结点的构成和AEL 相同,每个边结点由以下四个域组成:其中,各符号的含义为:ymax: 边的上端点的y坐
36、标x:在NET中表示边的下端点的x坐标,在AEL中表示边与扫描线的交点的x坐标1/k:边的斜率的倒数next:指向下一条边的指针,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,上图所示各条扫描线的新边表NET,当建立了边表NET后,扫描线多边形填充算法可按如下步骤进行:(1)初始化AET,使之为空,取扫描线纵坐标y的初始值为多边形所有顶点中最小的y值。 (2)将NET中与当前y有关的结点加入至AET,同时保存AEL中按x值从小到大实现的排序序列 。(3) 对于AET中的扫描线y,在一对交点之间填充所需要的像素值 。(4 )从AET中删掉y=ymax
37、的结点。(5) 对于留在AET中的每个结点,执行xi+1=xi + 1/k。(6) 对AET中的各结点按x值从小到大排序 。(7)y =y+1,成为下一条扫描线的坐标。(8)若AET非空 ,转(2),否则,停止。,安徽师范大学数学计算机科学学院 计算机图形学,void polyfill (polygon, color) for (各条扫描线,标识为i)初始化新边表头指针NET i;把ymin = i 的边放进边表NET i; y = 最低扫描线号;初始化活性边表AET为空;for (各条扫描线i)把新边表NETi中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;遍历AET表,把配对
38、交点区间上的像素(x, y),用drawpixel (x, y, color)改写像素颜色值;遍历AET表,把y max= i的结点从AET表中删除,并把y max i结点的x值递增x;,多边形扫描线填充的算法,具体实现代码请参考:潘云鹤,董金祥,陈德人.计算机图形学原理、方法及应用(修订版).高等教育出版社P31-35。,边界标志算法,基本思想在帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的像素打上标志。然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色。对每条与多边形相交的扫描线依从左到右的顺序,逐个访问该扫描线上的像素。使用一个布尔量inside来
39、指示当前点是否在多边形内的状态。Inside的初值为假,每当当前访问的像素为被打上边标志的点,就把inside取反。对未打标志的像素,inside不变。若访问当前像素时,inside为真,说明该像素在多边形内,则把该像素置为填充颜色。,void edgemark_fill(polydef, color) 多边形定义 polydef; int color; 对多边形polydef 每条边进行直线扫描转换;inside = FALSE;for (每条与多边形polydef相交的扫描线y )for (扫描线上每个象素x ) if(象素 x 被打上边标志)inside = ! (inside);if(
40、inside!= FALSE)putpixel (x, y, color);else putpixel (x, y, background); ,扫描线种子填充算法,简单种子填充算法原理和程序都很简单,但由于多次递归,费时、费内存,效率不高。为了减少递归次数,提高效率可以采用扫描线种子填充算法。算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。 区域填充的扫描线算法可由下列四个步骤实现: (1)初始化:堆栈置空。将种子点(x,y)入栈。
41、(2)出栈:若栈空则结束。否则取栈顶元素(x,y),以y作为当前扫描线。 (3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。(4)并确定新的种子点:在区间xl,xr中检查与当前扫描线y上、下相邻的两条扫描线上的像素。若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入堆栈,返回第(2)步。,安徽师范大学数学计算机科学学院 计算机图形学,1、在多边形扫描线填充算法中, (1)对于一条扫描线填充过程可以分为哪几个步骤? (2)对扫描线与多边形的相交区间取 闭 开。对扫描线与多边形的上下顶点相交时
42、,交点的取舍方法为 闭 开”,即丢弃上方水平边或上顶点。当扫描线与多边形交于上顶点时,交点计数为 。当扫描线通过多边形的下顶点时,交点计数为 。当扫描线通过多边形的左右顶点时,交点计数为 。 2、请分别为教材中图3.7各扫描线建立NET。为扫描线5建立AET。 3、简要叙述边界标志算法的思想。,上节思考题(作业),安徽师范大学数学计算机科学学院 计算机图形学,二维区域填充,向二维区域中填充同一种颜色,向二维区域中填充图案,简单的种子填充算法,多边形扫描线填充算法,边标志算法,二值位图填充,RGB图象填充,索引图象填充,灰度图象填充,主要内容回顾,扫描线种子填充算法,安徽师范大学数学计算机科学学
43、院 计算机图形学,3.3.3 区域图案填充算法,向二维区域中填充图案,可以分两步来进行:Step1:构造图案。Step2:将图案填充到指定的区域中去。,(1) 用户坐标系(UC)。又称为全局坐标系。就是我们通常所讲的空间三维直角坐标系。它是用户使用的最终定义三维空间完整图形对象的场所。在该坐标系下,用户定义最高层图形数据结构,各种图素、图段、子图都是经过坐标变换后放在用户坐标系的适当位置。,安徽师范大学数学计算机科学学院 计算机图形学,两个常用的坐标系,(2) 局部坐标系(MC)。又称为造型坐标系。它的主要作用是用来定义构成三维空间完整图形的各种基本的图素和子图。每一个被定义的子图或图素都有各
44、自的局部坐标系,并且所使用的单位长度也可以不一样。在局部坐标系下定义的图素经过坐标系变换后可以放在用户坐标系下进行三维物体的造型。,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,在进行图案填充时,必须要确定区域与图案之间的位置关系。这可以通过把图案原点与图形区中的某一点对齐的办法实现。 1)将图案原点与区域边界或内部某一点对齐。 2)将图案原点与填充区域外部的某一点对齐。,两种对齐方式,安徽师范大学数学计算机科学学院 计算机图形学,对一个MN的位图,可以用一个二维数组存放:int patternMN; 为讨论方便,设填充区域为矩形区域,其左下角点的
45、坐标为(x0,y0)。由于图案应比区域小得多,所以我们总可以将其设计成周期性的出现。假设当前扫描线与填充区域的相交区间上一象素坐标为(x,y)。,1)在第一种对齐方式下,我们可以用如下代码实现: n=(x-x0)%N; m=(y-y0)%M; if(patternmn)=1) putpixel(x,y,color);,二值位图的填充,安徽师范大学数学计算机科学学院 计算机图形学,2)在第二种对齐方式下,我们可以用如下代码实现: n=x%N; m=y%M; if(patternmn)=1) putpixel(x,y,color);,int a88=0,0,0,0,0,0,0,0,0,1,1,1,
46、1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0;,安徽师范大学数学计算机科学学院 计算机图形学,一个实例,安徽师范大学数学计算机科学学院 计算机图形学,for(y=101;y=170,安徽师范大学数学计算机科学学院 计算机图形学,运行结果,1)因为填充区域本身的复杂性,所以从算法的复杂性方面看,第二种对齐方式比第一种对齐方式要简单。 2)第一种对齐方式填充的图案,当填充区域移动时也会一道移动,看起来很自然;而第二种对齐方式就没有这个优点
47、。,安徽师范大学数学计算机科学学院 计算机图形学,几点说明,用第一种对齐方式填充,相邻区域之间有缝隙。,用第二种对齐方式填充,相邻区域之间达到无缝隙。,安徽师范大学数学计算机科学学院 计算机图形学,安徽师范大学数学计算机科学学院 计算机图形学,透明方式可用如下代码实现: n=x%N; m=y%M; if(patternmn)=1) pDC-SetPixel(x,y,RGB(255,0,0);,透明方式和非透明方式,安徽师范大学数学计算机科学学院 计算机图形学,而非透明方式可用如下代码实现: m=x%N; n=y%M; if(patternmn)=1) pDC-SetPixel(x,y,RGB(255,0,0); else pDC-SetPixel(x,y,RGB(255,255,255);,