370 likes | 546 Views
第二章 光栅图形学. 2.1 直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7 消隐. 基本概念. 图形的显示 : 光栅图形显示器上显示的图形都是具有一种或多种颜色的像素集合 光栅图形学的几个重要概念 光栅化 ( 或图形的扫描转换 ): 确定最佳逼近图形的像素集合 , 并用指定属性写像素的过程称为图形光栅化 ( 或图形的扫描转换 ). 区域填充 : 二维图形的光栅化必须确定区域对应的像素集 , 并用指定的属性或图案显示. 基本概念. 光栅图形学的几个重要概念
E N D
第二章 光栅图形学 2.1直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7消隐 重庆文理学院数学与计算机科学系 计算机图形学
基本概念 • 图形的显示:光栅图形显示器上显示的图形都是具有一种或多种颜色的像素集合 • 光栅图形学的几个重要概念 • 光栅化(或图形的扫描转换):确定最佳逼近图形的像素集合,并用指定属性写像素的过程称为图形光栅化(或图形的扫描转换). • 区域填充:二维图形的光栅化必须确定区域对应的像素集,并用指定的属性或图案显示. 重庆文理学院数学与计算机科学系 计算机图形学
基本概念 • 光栅图形学的几个重要概念 • 裁剪:确定一个图形的哪些部分在窗口内,必须显示,那些部分落在窗口之外,不用显示的过程. • 走样:对图形进行光栅化时,由于显示器的空间分辨率有限,对于非水平、垂直、+45O的直线,因像素逼近误差,使所画图形产生畸变的显现称为走样 • 反走样:用于减少或消除走样的技术称为反走样。 • 消隐: 重庆文理学院数学与计算机科学系 计算机图形学
光栅图形学的研究内容 • 直线段的扫描转换算法 • 圆弧的扫描转换算法 • 多边形的扫描转换与区域填充 • 字符 • 裁剪 • 反走样 • 消隐 重庆文理学院数学与计算机科学系 计算机图形学
2.1 直线段的扫描转换算法 • 直线的扫描转换: 确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。 • 三个常用算法: 数值微分法(DDA) 中点画线法 Bresenham算法。 重庆文理学院数学与计算机科学系 计算机图形学
2.1.1 数值微分(DDA)法 • 基本思想 已知过端点 的直线段L: 直线斜率为 从 的左端点 开始,向 右端点步进。步长=1(个象素),计算相应的y坐标 ;取象素点(x, round(y))作为当前点的坐标。 重庆文理学院数学与计算机科学系 计算机图形学
计算量分析: • 每个点计算量:上边的算法每个点需要 • 一个“+” • 一个“*” • 用到浮点数的乘法、加法和取整运算 • 作为最底层的光栅图形算法,在通常的CAD/图形系统中,会被大量应用,因此,哪怕节约一个加法或减法,也是很了不起的改进。 • 由此出发点,导致增量算法的思想。 重庆文理学院数学与计算机科学系 计算机图形学
增量算法的思想 设步长为 计算 当 时; 即:当x每递增1,y递增k(即直线斜率); 计算量:每个点只有一个“+” 重庆文理学院数学与计算机科学系 计算机图形学
例题 例:画直线段 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 注:网格点表示象素 重庆文理学院数学与计算机科学系 计算机图形学
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; xx1, x++) drawpixel (x, int(y+0.5), color); y=y+k; 重庆文理学院数学与计算机科学系 计算机图形学
增量算法的缺点 注意上述分析的算法仅适用于k≤1的情形。在这种情况下,x每增加1, y最多增加1。 当 k1时,必须把x,y地位互换 • 缺点: • 有浮点数取整运算 • 不利于硬件实现 • 效率低 • 仅适用于k≤1的情形:x每增加1,y最多增加1。当 k1时,必须把x,y互换。 重庆文理学院数学与计算机科学系 计算机图形学
2.1.2 中点画线法 采用增量思想的DDA算法,每计算一个象素,只需计算一个加法,是否最优? 如非最优,如何改进? 目标:进一步将一个加法改为一个整数加法。 新思路-> DDA算法采用两点式,可否采用其他的直线表示方式? 重庆文理学院数学与计算机科学系 计算机图形学
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为下一点。 重庆文理学院数学与计算机科学系 计算机图形学
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为下一个象素; 重庆文理学院数学与计算机科学系 计算机图形学
但这样做,每一个象素的计算量是4个加法,两个乘法。但这样做,每一个象素的计算量是4个加法,两个乘法。 “山穷水尽疑无路” d=a(xp+1)+b(yp+0.5)+c 重庆文理学院数学与计算机科学系 计算机图形学
如果也采用增量算法呢? 重庆文理学院数学与计算机科学系 计算机图形学
d是xp, yp的线性函数,因此可采用增量计算,提高运算效率。 重庆文理学院数学与计算机科学系 计算机图形学
M • 若当前象素处于d0情况,则取正右方象素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 重庆文理学院数学与计算机科学系 计算机图形学
至此,至少新算法可以和DDA算法一样好。 • 能否再做改进? 重庆文理学院数学与计算机科学系 计算机图形学
能否实现整数运算? 重庆文理学院数学与计算机科学系 计算机图形学
画线从(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, 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 */ 重庆文理学院数学与计算机科学系 计算机图形学
例:用中点画线法 i xi yi d 1 0 0 1 2 1 0 -3 3 2 1 3 4 3 1 -1 5 4 2 5 重庆文理学院数学与计算机科学系 计算机图形学
中点画线法的真实执行过程 • 直线上方点: 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 重庆文理学院数学与计算机科学系 计算机图形学
中点画线法的优点 • 优点: • 只有整数运算,不含乘除法 • 可用硬件实现 重庆文理学院数学与计算机科学系 计算机图形学
2.1.3 Bresenham算法 • 基本思想 • DDA算法采用点斜式,中点法采用隐式表示。 • 中点法可以有整数算法。 • 其他表示可以推出整数算法吗? 重庆文理学院数学与计算机科学系 计算机图形学
过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。 重庆文理学院数学与计算机科学系 计算机图形学
设直线方程为: ,其中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时,更接近于右方象素( )。 重庆文理学院数学与计算机科学系 计算机图形学
可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换: 例: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加一,小于零,不变 重庆文理学院数学与计算机科学系 计算机图形学
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; idx; i++) { drawpixel (x, y, color); x=x+1,e=e+k; if (e0) { y++, e=e-1;} } } 重庆文理学院数学与计算机科学系 计算机图形学
最终,Bresenham算法也是每个象素,需一个整数算法,最终,Bresenham算法也是每个象素,需一个整数算法, 其优点是可以用于其他二次曲线。 重庆文理学院数学与计算机科学系 计算机图形学
新方法: 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 重庆文理学院数学与计算机科学系 计算机图形学
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); } 重庆文理学院数学与计算机科学系 计算机图形学
2.2 圆弧的扫描转换算法 • 圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集 • 中点画圆法 考虑中心在原点,半径为R 的第二个8分圆, • 构造判别式(圆方程) 重庆文理学院数学与计算机科学系 计算机图形学
若 d<0, 则取P1为下一象素,而且再下一象素的判别式为 若d>=0, 则应取P2为下一象素,而且下一象素的判别式为 第 一个象素是(0,R),判别式d的初始值为 重庆文理学院数学与计算机科学系 计算机图形学
算法过程 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); } } 重庆文理学院数学与计算机科学系 计算机图形学
为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 • 使用e=d-0.25代替d • e0=1-R 重庆文理学院数学与计算机科学系 计算机图形学