收藏 分享(赏)

计算机图形学基础教程——第2章1.ppt

上传人:精品资料 文档编号:10743503 上传时间:2020-01-04 格式:PPT 页数:51 大小:445KB
下载 相关 举报
计算机图形学基础教程——第2章1.ppt_第1页
第1页 / 共51页
计算机图形学基础教程——第2章1.ppt_第2页
第2页 / 共51页
计算机图形学基础教程——第2章1.ppt_第3页
第3页 / 共51页
计算机图形学基础教程——第2章1.ppt_第4页
第4页 / 共51页
计算机图形学基础教程——第2章1.ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

1、清华大学计算机科学与技术系 计算机图形学基础,第二章 光栅图形学,什么是光栅图形学?光栅显示器 图形光栅化、光栅化图形的处理,清华大学计算机科学与技术系 计算机图形学基础,光栅图形学的研究内容 直线段的扫描转换算法 圆弧的扫描转换算法 多边形的扫描转换与区域填充 字符 裁剪 反走样 消隐,清华大学计算机科学与技术系 计算机图形学基础,2.1 直线段的扫描转换算法,直线的扫描转换: 确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。 三个常用算法: 数值微分法(DDA) 中点画线法 Bresenham算法。,清华大学计算机科学与技术系 计算机图形学基础,2.1.1 数值微分

2、(DDA)法,基本思想已知过端点 的直线段L:直线斜率为 从 的左端点 开始,向 右端点步进。步长=1(个象素),计算相应的y坐标 ;取象素点(x, round(y)作为当前点的坐标。,清华大学计算机科学与技术系 计算机图形学基础,作为最底层的光栅图形算法,在通常的CAD/图形系统中,会被大量应用,因此,哪怕节约一个加法或减法,也是很了不起的改进。 由此出发点,导致增量算法的思想。,清华大学计算机科学与技术系 计算机图形学基础,计算当 时; 即:当x每递增1,y递增k(即直线斜率);,清华大学计算机科学与技术系 计算机图形学基础,例:画直线段 x int(y+0.5) y+0.5 0 0 0

3、1 0 0.4+0.5 2 1 0.8+0.5 3 1 1.2+0.5 4 2 1.6+0.5 5 2 2.0+0.5 注:网格点表示象素,清华大学计算机科学与技术系 计算机图形学基础,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, y=y0; for (x=x0; xx1, x+) drawpixel (x, int(y+0.5), color); y=y+k;,清华大学计算机科学与技术系 计算机图形学基础,问题:当 k

4、 1时,会如何?,清华大学计算机科学与技术系 计算机图形学基础,注意上述分析的算法仅适用于k 1的情形。在这种情况下,x每增加1, y最多增加1。 当 k 1时,必须把x,y地位互换k 1 示意图,清华大学计算机科学与技术系 计算机图形学基础,2.1.2 中点画线法,采用增量思想的DDA算法,每计算一个象素,只需计算一个加法,是否最优?如非最优,如何改进?目标:进一步将一个加法改为一个整数加法。新思路 DDA算法采用点斜式,可否采用其他的直线表示方式?,清华大学计算机科学与技术系 计算机图形学基础,基本思想 当前象素点为(xp, yp) 。下一个象素点为P1 或P2 。 设M=(xp+1, y

5、p+0.5),为p1与p2 之中点,Q为理想直线与x=xp+1 垂线的交点。将Q与M的y坐标进 行比较。 当M在Q的下方,则P2 应为下一个象素点; M在Q的上方,应取P1为下一点。,清华大学计算机科学与技术系 计算机图形学基础,构造判别式: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为下一个象素;,清华大学计算机科学与技术系 计算机图形学基础,但这样做,每一个象素的计算量是4个加法,两个乘法。“山穷水尽

6、疑无路”如果也采用增量算法呢?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)。要判断再下一象素,则要计算d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为ab,清华大学计算机科学与技术系 计算机图形学基础,至此,至少新算法可以和DDA算法一样好

7、。能否再做改进?能否实现整数运算?,清华大学计算机科学与技术系 计算机图形学基础,画线从(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,我们有如下算法 。,清华大学计算机科学与技术系 计算机图形学基础,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

8、, 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 */,清华大学计算机科学与技术系 计算机图形学基础,例:用中点画线法i xi yi d 1 0 0 1 2 1 0 -3 3 2 1 3 4 3 1 -1 5 4 2 5,清华大学计算机科学与技术系 计算机图形学基础,2.1.3 Bresenham算法,基本思想 DDA算法采用点斜式,中点法采用

9、隐式表示。中点法可以有整数算法。其他表示可以推出整数算法吗?,清华大学计算机科学与技术系 计算机图形学基础,过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。,清华大学计算机科学与技术系 计算机图形学基础,设直线方程为: ,其中k=dy/dx。 因为直线的起始点在象素中心,所以误差项d的初值d00。 X下标每增加1,d的值相应递增直线的斜率值k,即ddk。一旦d1,就把它减去1,这样保证d在0、1之间。 当d0.5时,最接近于当前象素的右上方象素( ) 而当d0.5时,更接近于右方象素( )。 为方

10、便计算,令ed-0.5, e的初值为-0.5,增量为k。 当e0时,取当前象素(xi,yi)的右上方象素( ); 而当e0时,更接近于右方象素( )。,清华大学计算机科学与技术系 计算机图形学基础,可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换: 例:Line: P0(0, 0), P1(5,2) k=dy/dx=0.4x y e0 0 -0.51 0 -0.12 1 0.33 1 -0.34 2 0.1 5 2 -0.5 大于零,y加一,小于零,不变,清华大学计算机科学与技术系 计算机图形学基础,void Bresenhamline (int x0,int y0,in

11、t 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, y=y0;for (i=0; idx; i+) drawpixel (x, y, color);x=x+1,e=e+k;if (e0) y+, e=e-1;,清华大学计算机科学与技术系 计算机图形学基础,最终,Bresenham算法也是每个象素,需一个整数算法,其优点是可以用于其他二次曲线。至此,直线光栅化是否终结?,清华大学计算机科学与技术系 计算机图形学基础,新方法:BRDC: binary

12、representation of displacement code for line Miao LF, Liu XG, Peng QS, Bao HJ COMPUTERS & GRAPHICS-UK 26 (3): 401-408 JUN 2002,清华大学计算机科学与技术系 计算机图形学基础,2.2 圆弧的扫描转换算法,圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集 中点画圆法 考虑中心在原点,半径为R 的第二个8分圆, 构造判别式(圆方程),清华大学计算机科学与技术系 计算机图形学基础,若 d=0, 则应取P2为下一象素,而且下一象素的判别式为第 一个象素是(

13、0,R),判别式d的初始值为,清华大学计算机科学与技术系 计算机图形学基础,为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 使用e=d-0.25代替d e0=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-;

14、x+; circlepoints (x,y,color); ,清华大学计算机科学与技术系 计算机图形学基础,2.3 多边形的扫描转换与区域填充,多边形有两种重要的表示方法:顶点表示和点阵表示。 多边形的扫描转换:把多边形的顶点表示转换为点阵表示。 区域可采用内点表示和边界表示两种表示形式。 区域填充:指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。,清华大学计算机科学与技术系 计算机图形学基础,多边形分为凸多边形、凹多边形、含内环的多边形。,清华大学计算机科学与技术系 计算机图形学基础,2.3.1多边形的扫描转换,2.3.1.1 扫描线算法 基本思想: 按扫描线顺序,计算扫描

15、线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。 对于一条扫描线填充过程可以分为四个步骤: 求交 排序 配对 填色,清华大学计算机科学与技术系 计算机图形学基础,一个多边形与若干扫描线,清华大学计算机科学与技术系 计算机图形学基础,数据结构 活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中 结点内容x:当前扫描线与边的交点坐标 x:从当前扫描线到下一条扫描线间x的增量 ymax:该边所交的最高扫描线号ymax,清华大学计算机科学与技术系 计算机图形学基础,新边表(NET):存放在该扫描线第一次出现的边。若某边的

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

17、,void polyfill (polygon, color)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

18、表中删除,并把y max i 结点的x值递增x; 若允许多边形的边自相交,则用冒泡排序法对AET表重新排序; /* polyfill */,清华大学计算机科学与技术系 计算机图形学基础,2.3.1.2边界标志算法,基本思想: 帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志。 然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色。 使用一个布尔量inside来指示当前点是否在多边形内的状态。,清华大学计算机科学与技术系 计算机图形学基础,算法过程,void edgemark_fill(polydef, color) 多边形定义 polydef;

19、int color; 对多边形polydef 每条边进行直线扫描转换;inside = FALSE;for (每条与多边形polydef相交的扫描线y )for (扫描线上每个象素x ) if(象素 x 被打上边标志)inside = ! (inside);if(inside!= FALSE)drawpixel (x, y, color);else drawpixel (x, y, background); ,清华大学计算机科学与技术系 计算机图形学基础,用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同, 但由于边界标志算法不必建立维护边表以及对它进行排序,所以边界标志算法更适合硬件实

20、现,这时它的执行速度比有序边表算法快一至两个数量级。,清华大学计算机科学与技术系 计算机图形学基础,2.3.2区域填充算法,区域指已经表示成点阵形式的填充图形,它是象素的集合。 区域可采用内点表示和边界表示两种表示形式。 区域可分为4向连通区域和8向连通区域。 区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的,清华大学计算机科学与技术系 计算机图形学基础,4向连通区域和8向连通区域四个方向运动 八个方向运动 四连通区域 八连通区域,清华大学计算机科学与技术系 计算机图形学基础,2.3.2.1区域填充的递归算法,内点表示的4连通区域的递归填充

21、算法: 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);FloodFill4(x+1,y,oldcolor,newcolor); ,清华大学计算机科学与技术系 计算机图形学基础,边界表示的

22、4连通区域的递归填充算法: void BoundaryFill4(int x,int y,int boundarycolor,int newcolor) int color;if(color!=newcolor ,清华大学计算机科学与技术系 计算机图形学基础,2.3.2.2区域填充的扫描线算法,算法步骤: 首先填充种子点所在扫描线上的位于给定区域的一个区段 然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。 反复这个过程,直到填充结束。,清华大学计算机科学与技术系 计算机图形学基础,(1)初始化:堆栈置空。将种子点(x,y)入栈。 (2)出栈:若栈空则结束。否则

23、取栈顶元素(x,y),以y作为当前扫描线。 (3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。 (4)并确定新的种子点:在区间xl,xr中检查与当前扫描线y上、下相邻的两条扫描线上的象素。若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(2)步。上述算法对于每一个待填充区段,只需压栈一次;因此,扫描线填充算法提高了区域填充的效率。,清华大学计算机科学与技术系 计算机图形学基础,本课总结: 直线段的扫描转换算法 DDA 中点算法 Bresenham算法 圆弧的扫描转换算法 多边形的扫描转换与区域填充 扫描转换 区域填充,清华大学计算机科学与技术系 计算机图形学基础,谢谢!,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报