计算机图形学第2章.ppt.ppt

上传人:marr****208 文档编号:150260365 上传时间:2020-11-04 格式:PPT 页数:123 大小:1.04MB
返回 下载 相关 举报
计算机图形学第2章.ppt.ppt_第1页
第1页 / 共123页
计算机图形学第2章.ppt.ppt_第2页
第2页 / 共123页
计算机图形学第2章.ppt.ppt_第3页
第3页 / 共123页
计算机图形学第2章.ppt.ppt_第4页
第4页 / 共123页
计算机图形学第2章.ppt.ppt_第5页
第5页 / 共123页
点击查看更多>>
资源描述

《计算机图形学第2章.ppt.ppt》由会员分享,可在线阅读,更多相关《计算机图形学第2章.ppt.ppt(123页珍藏版)》请在金锄头文库上搜索。

1、第2章 光栅图形学,2.1直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7消隐,2.1 直线段的扫描转换算法,直线的扫描转换: 确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。 三个常用算法: 2.1.1数值微分法(DDA) 2.1.2中点画线法 2.1.3Bresenham算法。,2.1.1 数值微分(DDA)法,基本思想 已知过端点P0 (x0, y0), P1(x1, y1)的直线段L y=kx+b 直线斜率为 从x的左端点x0开始,向x右端点步进。步长=1(个象素),计算相应的y坐标y

2、=kx+B;取象素点(x, round(y)作为当前点的坐标。,计算yi+1= kxi+1+B = k1 xi+B+kx = yi+kx 当x =1;yi+1 = yi+k 即:当x每递增1,y递增k(即直线斜率); 注意上述分析的算法仅适用于k 1的情形。在这种情况下,x每增加1,y最多增加1。 当 k 1时,必须把x,y地位互换,例:画直线段p(0,0)-P1(5,2) x int(y+0.5) y+0.5 000 100.4+0.5 210.8+0.5 311.2+0.5 421.6+0.5 522.0+0.5 注:网格点表示象素,void DDALine(int x0,int y0,i

3、nt x1,int y1,int color) int x; float dx, dy, y, k; dx, = x1-x0, dy=y1-y0; k=dy/dx, y=y0; for (x=x0; xx1, x+) drawpixel (x, int(y+0.5), color); y=y+k; ,2.1.2 中点画线法,基本思想 当前象素点为(xp, yp) 。下一个象素点为P1或P2。 设M=(xp+1, yp+0.5),为p1与p2 之中点,Q为理想直线与x=xp+1 垂线的交点。将Q与M的y坐标进 行比较。 当M在Q的下方,则P2 应为 下一个象素点; M在Q的上方,应取P1为下一点

4、。,构造判别式:d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 当d0,M在L(Q点)上方,取右方P1为下一个象素; 当d=0,选P1或P2均可,约定取P1为下一个象素; d是xp, yp的线性函数,因此可采用增量计算,提高运算效率。,若当前象素处于d0情况,则取正右方象素P1(xp+1, yp), 要判下一个象素位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a; 增量为a 若d0时,则取右上方象素P2(xp+1, yp+1)。要判断再下一象素,则

5、要计算 d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为ab,画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b =a+0.5b。 可以用2d代替d来摆脱小数,提高效率。 令 d0=2a+b, d1=2a, d2=2a+2b,我们有如下算法 。,例:用中点画线法P0(0,0) P1(5,2) a = y0-y1=-2, b = x1-x0 = 5 d0 = 2a+b = 1, d1= 2a = - 4, d2 = 2(a+b)=6 ixiyid 1001 210-3 3213 431-

6、1 5425,void Midpoint Line (int x0,int y0,int x1, int y1,int color) int a, b, d1, d2, d, x, y; a=y0-y1, b=x1-x0, d=2*a+b; d1=2*a, d2=2* (a+b); x=x0, y=y0; drawpixel(x, y, color); while (xx1) if (d0) x+, y+, d+=d2; else x+, d+=d1; drawpixel (x, y, color); /* while */ /* mid PointLine */,2.1.3 Bresenha

7、m算法,基本思想 过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。,设直线方程为: ,其中k=dy/dx。 因为直线的起始点在象素中心,所以误差项d的初值d00。 X下标每增加1,d的值相应递增直线的斜率值k,即ddk。一旦d1,就把它减去1,这样保证d在0、1之间。 当d0.5时,最接近于当前象素的右上方象素(xi1,yi1 而当d0.5时,更接近于右方象素(xi1,yi)。 为方便计算,令ed-0.5, e的初值为-0.5,增量为k。 当e0时,取当前象素(xi,yi)的右上方象素(xi1,y

8、i1); 而当e0时,更接近于右方象素(xi1,yi)。,可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换: 例:Line: P0(0, 0), P1(5,2) k=dy/dx=0.4 x y e 0 0 -0.5 1 0 -0.1 2 1 0.3 3 1 -0.3 4 2 0.1 5 2 -0.5,void Bresenhamline (int x0,int y0,int x1, int y1,int color) int x, y, dx, dy; float k, e; dx = x1-x0, dy = y1- y0, k=dy/dx; e=-0.5, x=x0,

9、y=y0; for (i=0; idx; i+) drawpixel (x, y, color); x=x+1,e=e+k; if (e0) y+, e=e-1; ,2.2 圆弧的扫描转换算法,圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集 中点画圆法 考虑中心在原点,半径为R 的第二个8分圆, 构造判别式(圆方程),若 d=0, 则应取P2为下一象素,而且下一象素的判别式为 第 一个象素是(0,R),判别式d的初始值为,为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 使用e=d-0.25代替d e0

10、=1-R,算法过程,MidPointCircle(int r int color) int x,y; float d; x=0; y=r; d=1.25-r; circlepoints (x,y,color); /显示圆弧上的八个对称点 while(x=y) if(d0) d+=2*x+3; else d+=2*(x-y)+5; y-; x+; circlepoints (x,y,color); ,2.3 多边形的扫描转换与区域填充,多边形有两种重要的表示方法:顶点表示和点阵表示。 多边形的扫描转换:把多边形的顶点表示转换为点阵表示。 区域可采用内点表示和边界表示两种表示形式。 区域填充:指先

11、将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。,多边形分为凸多边形、凹多边形、含内环的多边形。,2.3.1多边形的扫描转换,扫描线算法 基本思想: 按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。 对于一条扫描线填充过程可以分为四个步骤: (1)求交(2)排序 (3)配对(4)填色,一个多边形与若干扫描线,数据结构 活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中 结点内容 x:当前扫描线与边的交点坐标 x:从当前扫描线到下一条扫描线间x的增量 ymax:该边所交的最高扫描

12、线号ymax,新边表(NET): 存放在该扫描线第一次出现的边。若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中 上图所示各条扫描线的新边表NET,假定当前扫描线与多边形某一条边的交点的x坐标为x,则下一条扫描线与该边的交点不要重计算,只要加一个增量x。 设该边的直线方程为:ax+by+c=0; 若yyi,x=x i;则当y = y i+1时, 其中 为常数,扫描线与多边形的顶点或边界相交时,必须正确的交点的取舍。只需检查顶点的两条边的另外两个端点的y值。按这两个y值中大于交点y值的个数是0,1,2来决定。,算法过程,void polyfill (polygon, color)

13、 int color; 多边形 polygon; for (各条扫描线i ) 初始化新边表头指针NET i; 把y min = i 的边放进边表NET i; y = 最低扫描线号; 初始化活性边表AET为空; for (各条扫描线i ) ,把新边表NET i 中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列; 遍历AET表,把配对交点区间(左闭右开)上的象素(x, y),用drawpixel (x, y, color) 改写象素颜色值; 遍历AET表,把y max= i 的结点从AET表中删除,并把y max i 结点的x值递增x; 若允许多边形的边自相交,则用冒泡排序法对AET表

14、重新排序; /* polyfill */,边界标志算法,基本思想: 帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志。 然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色。 使用一个布尔量inside来指示当前点是否在多边形内的状态。,算法过程,void edgemark_fill(polydef, color) 多边形定义 polydef; int color; 对多边形polydef 每条边进行直线扫描转换; inside = FALSE; for (每条与多边形polydef相交的扫描线y ) for (扫描线上每个象素x ) if(象素

15、 x 被打上边标志) inside = ! (inside); if(inside!= FALSE) drawpixel (x, y, color); else drawpixel (x, y, background); ,用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同, 但由于边界标志算法不必建立维护边表以及对它进行排序,所以边界标志算法更适合硬件实现,这时它的执行速度比有序边表算法快一至两个数量级。,2.3.2区域填充算法,区域指已经表示成点阵形式的填充图形,它是象素的集合。 区域可采用内点表示和边界表示两种表示形式。 区域可分为4向连通区域和8向连通区域。 区域填充指先将区域的

16、一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的,4向连通区域和8向连通区域 四个方向运动 八个方向运动 四连通区域 八连通区域,区域填充的递归算法,内点表示的4连通区域的递归填充算法: void FloodFill4(int x,int y,int oldcolor,int newcolor) if(getpixel(x,y)=oldcolor) /属于区域内点oldcolor drawpixel(x,y,newcolor); FloodFill4(x,y+1,oldcolor,newcolor); FloodFill4(x,y-1,oldcolor,newcolor); FloodFill4(x-1,y,oldcolor,newcolor

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号