1 / 37

第二章 光栅图形学

第二章 光栅图形学. 2.1 直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7 消隐. 基本概念. 图形的显示 : 光栅图形显示器上显示的图形都是具有一种或多种颜色的像素集合 光栅图形学的几个重要概念 光栅化 ( 或图形的扫描转换 ): 确定最佳逼近图形的像素集合 , 并用指定属性写像素的过程称为图形光栅化 ( 或图形的扫描转换 ). 区域填充 : 二维图形的光栅化必须确定区域对应的像素集 , 并用指定的属性或图案显示. 基本概念. 光栅图形学的几个重要概念

najwa
Download Presentation

第二章 光栅图形学

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 光栅图形学 2.1直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7消隐 重庆文理学院数学与计算机科学系 计算机图形学

  2. 基本概念 • 图形的显示:光栅图形显示器上显示的图形都是具有一种或多种颜色的像素集合 • 光栅图形学的几个重要概念 • 光栅化(或图形的扫描转换):确定最佳逼近图形的像素集合,并用指定属性写像素的过程称为图形光栅化(或图形的扫描转换). • 区域填充:二维图形的光栅化必须确定区域对应的像素集,并用指定的属性或图案显示. 重庆文理学院数学与计算机科学系 计算机图形学

  3. 基本概念 • 光栅图形学的几个重要概念 • 裁剪:确定一个图形的哪些部分在窗口内,必须显示,那些部分落在窗口之外,不用显示的过程. • 走样:对图形进行光栅化时,由于显示器的空间分辨率有限,对于非水平、垂直、+45O的直线,因像素逼近误差,使所画图形产生畸变的显现称为走样 • 反走样:用于减少或消除走样的技术称为反走样。 • 消隐: 重庆文理学院数学与计算机科学系 计算机图形学

  4. 光栅图形学的研究内容 • 直线段的扫描转换算法 • 圆弧的扫描转换算法 • 多边形的扫描转换与区域填充 • 字符 • 裁剪 • 反走样 • 消隐 重庆文理学院数学与计算机科学系 计算机图形学

  5. 2.1 直线段的扫描转换算法 • 直线的扫描转换: 确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。 • 三个常用算法: 数值微分法(DDA) 中点画线法 Bresenham算法。 重庆文理学院数学与计算机科学系 计算机图形学

  6. 2.1.1 数值微分(DDA)法 • 基本思想 已知过端点 的直线段L: 直线斜率为 从 的左端点 开始,向 右端点步进。步长=1(个象素),计算相应的y坐标 ;取象素点(x, round(y))作为当前点的坐标。 重庆文理学院数学与计算机科学系 计算机图形学

  7. 计算量分析: • 每个点计算量:上边的算法每个点需要 • 一个“+” • 一个“*” • 用到浮点数的乘法、加法和取整运算 • 作为最底层的光栅图形算法,在通常的CAD/图形系统中,会被大量应用,因此,哪怕节约一个加法或减法,也是很了不起的改进。 • 由此出发点,导致增量算法的思想。 重庆文理学院数学与计算机科学系 计算机图形学

  8. 增量算法的思想 设步长为 计算 当 时; 即:当x每递增1,y递增k(即直线斜率); 计算量:每个点只有一个“+” 重庆文理学院数学与计算机科学系 计算机图形学

  9. 例题 例:画直线段 x int(y+0.5) y+0.5 0 0 0 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 注:网格点表示象素 重庆文理学院数学与计算机科学系 计算机图形学

  10. DDA算法程序 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; xx1, x++)  drawpixel (x, int(y+0.5), color); y=y+k;   重庆文理学院数学与计算机科学系 计算机图形学

  11. 增量算法的缺点 注意上述分析的算法仅适用于k≤1的情形。在这种情况下,x每增加1, y最多增加1。 当 k1时,必须把x,y地位互换 • 缺点: • 有浮点数取整运算 • 不利于硬件实现 • 效率低 • 仅适用于k≤1的情形:x每增加1,y最多增加1。当 k1时,必须把x,y互换。 重庆文理学院数学与计算机科学系 计算机图形学

  12. 2.1.2 中点画线法 采用增量思想的DDA算法,每计算一个象素,只需计算一个加法,是否最优? 如非最优,如何改进? 目标:进一步将一个加法改为一个整数加法。 新思路-> DDA算法采用两点式,可否采用其他的直线表示方式? 重庆文理学院数学与计算机科学系 计算机图形学

  13. M • 基本思想 当前象素点为(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为下一点。 重庆文理学院数学与计算机科学系 计算机图形学

  14. M 构造判别式: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 当d<0,M在L(Q点)下方,取右上方P2为下一个象素; 当d>0,M在L(Q点)上方,取右方P1为下一个象素; 当d=0,选P1或P2均可,约定取P1为下一个象素; 重庆文理学院数学与计算机科学系 计算机图形学

  15. 但这样做,每一个象素的计算量是4个加法,两个乘法。但这样做,每一个象素的计算量是4个加法,两个乘法。 “山穷水尽疑无路” d=a(xp+1)+b(yp+0.5)+c 重庆文理学院数学与计算机科学系 计算机图形学

  16. 如果也采用增量算法呢? 重庆文理学院数学与计算机科学系 计算机图形学

  17. d是xp, yp的线性函数,因此可采用增量计算,提高运算效率。 重庆文理学院数学与计算机科学系 计算机图形学

  18. M • 若当前象素处于d0情况,则取正右方象素P1 (xp+1, yp), 要判下一个象素位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a; 增量为a • 若d<0时,则取右上方象素P2 (xp+1, yp+1)。要判断再下一象素,则要计算 d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为a+b 重庆文理学院数学与计算机科学系 计算机图形学

  19. 至此,至少新算法可以和DDA算法一样好。 • 能否再做改进? 重庆文理学院数学与计算机科学系 计算机图形学

  20. 能否实现整数运算? 重庆文理学院数学与计算机科学系 计算机图形学

  21. 画线从(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,我们有如下算法 。 重庆文理学院数学与计算机科学系 计算机图形学

  22. 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 (x<x1) { if (d<0) {x++, y++, d+=d2; } else {x++, d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */ 重庆文理学院数学与计算机科学系 计算机图形学

  23. 例:用中点画线法 i xi yi d 1 0 0 1 2 1 0 -3 3 2 1 3 4 3 1 -1 5 4 2 5 重庆文理学院数学与计算机科学系 计算机图形学

  24. 中点画线法的真实执行过程 • 直线上方点: F(x,y)>0 直线下方点: F(x,y)<0 • 构造判别式: d=F(M)=F(Xp+1,Yp+0.5) • 由d>0,d<0可判定下一个象素 P2 M (Xp+1,Yp+0.5) P1 P 重庆文理学院数学与计算机科学系 计算机图形学

  25. 中点画线法的优点 • 优点: • 只有整数运算,不含乘除法 • 可用硬件实现 重庆文理学院数学与计算机科学系 计算机图形学

  26. 2.1.3 Bresenham算法 • 基本思想 • DDA算法采用点斜式,中点法采用隐式表示。 • 中点法可以有整数算法。 • 其他表示可以推出整数算法吗? 重庆文理学院数学与计算机科学系 计算机图形学

  27. 过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。 重庆文理学院数学与计算机科学系 计算机图形学

  28. 设直线方程为: ,其中k=dy/dx。 因为直线的起始点在象素中心,所以误差项d的初值d0=0。 X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥1,就把它减去1,这样保证d在0、1之间。 • 当d≥0.5时,最接近于当前象素的右上方象素( ) • 而当d<0.5时,更接近于右方象素( )。 为方便计算,令e=d-0.5, e的初值为-0.5,增量为k。 • 当e≥0时,取当前象素(xi,yi)的右上方象素( ); • 而当e<0时,更接近于右方象素( )。 重庆文理学院数学与计算机科学系 计算机图形学

  29. 可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换: 例: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 大于零,y加一,小于零,不变 重庆文理学院数学与计算机科学系 计算机图形学

  30. 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, y=y0; for (i=0; idx; i++) { drawpixel (x, y, color); x=x+1,e=e+k; if (e0) { y++, e=e-1;} } } 重庆文理学院数学与计算机科学系 计算机图形学

  31. 最终,Bresenham算法也是每个象素,需一个整数算法,最终,Bresenham算法也是每个象素,需一个整数算法, 其优点是可以用于其他二次曲线。 重庆文理学院数学与计算机科学系 计算机图形学

  32. 新方法: BRDC: binary representation of displacement code for line Miao LF, Liu XG, Peng QS, Bao HJ COMPUTERS & GRAPHICS-UK 26 (3): 401-408 JUN 2002 重庆文理学院数学与计算机科学系 计算机图形学

  33. y (-x,y) (x,y) (-y,x) (y,x) R x o (-y,-x) (y,-x) (-x,-y) (x,-y) 2.2 圆弧的扫描转换算法 • 圆的八对称性 • 只考虑第二个八分圆 假设圆心在原点 x2+y2=R2 circlepoints (x,y,color) { drawpixel (x,y,color); drawpixel (y,xcolor); drawpixel (-x,y,color); drawpixel (y,-x,color); drawpixel (x,-y,color); drawpixel (-y,x,color); drawpixel (-x,-y,color); drawpixel (-y,-x,color); } 重庆文理学院数学与计算机科学系 计算机图形学

  34. 2.2 圆弧的扫描转换算法 • 圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集 • 中点画圆法 考虑中心在原点,半径为R 的第二个8分圆, • 构造判别式(圆方程) 重庆文理学院数学与计算机科学系 计算机图形学

  35. 若 d<0, 则取P1为下一象素,而且再下一象素的判别式为 若d>=0, 则应取P2为下一象素,而且下一象素的判别式为 第 一个象素是(0,R),判别式d的初始值为 重庆文理学院数学与计算机科学系 计算机图形学

  36. 算法过程 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(d<0) d+=2*x+3; else { d+=2*(x-y)+5; y--;} x++; circlepoints (x,y,color); } } 重庆文理学院数学与计算机科学系 计算机图形学

  37. 为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 • 使用e=d-0.25代替d • e0=1-R 重庆文理学院数学与计算机科学系 计算机图形学

More Related