
维线画图元及属性PPT课件.ppt
60页第第3章章 二维线画图元及属性二维线画图元及属性 在图形系统的输出设备上生成的画面,都是由各种基本几何元在图形系统的输出设备上生成的画面,都是由各种基本几何元素素————图形输出基元(简称为输出图元)构成的画面上最简单图形输出基元(简称为输出图元)构成的画面上最简单的输出图元是点和直线,其他还有多边形、曲线图形以及字符串的输出图元是点和直线,其他还有多边形、曲线图形以及字符串等本章介绍一些常用直线段、圆弧的扫描转换算法本章介绍一些常用直线段、圆弧的扫描转换算法第第3章章 二维线画图元及属性二维线画图元及属性 直线的扫描转换及算法 圆和椭圆的扫描转换算法 其他输出图元的生成 输出图元的属性 字符的生成 直线的扫描转换及算法 扫描转换扫描转换::从图形定义的物空间到进行显示处理的图像空间的转换从图形定义的物空间到进行显示处理的图像空间的转换线画图元的扫描转换线画图元的扫描转换::计算出落段上或充分靠近它的一串像素,计算出落段上或充分靠近它的一串像素,并以此像素集近似替代连续直线段在屏幕上显示的过程并以此像素集近似替代连续直线段在屏幕上显示的过程由像素表示的直线段为均匀填充的实心原点由像素表示的直线段为均匀填充的实心原点像素:中心为网格点的圆点,距离均匀,相互不重叠像素:中心为网格点的圆点,距离均匀,相互不重叠 直线的扫描转换及算法 一、点的生成一、点的生成 点是图形中最基本的图素,直线、曲线以及其它的图元都是点是图形中最基本的图素,直线、曲线以及其它的图元都是点的集合。
在几何学中,一个点既没有大小,也没有维数,点只点的集合在几何学中,一个点既没有大小,也没有维数,点只是表示坐标系统中的一个位置在计算机图形学中,点是用数值是表示坐标系统中的一个位置在计算机图形学中,点是用数值坐标表示的在直角坐标系中点由坐标表示的在直角坐标系中点由( (x x, , y y) )两个数值组成的坐标表两个数值组成的坐标表示,在三维坐标系中点由示,在三维坐标系中点由( (x x, , y y, , z z) )三个数值组成的坐标表示三个数值组成的坐标表示 在输出设备上输出一个点,首先需要计算出该点的坐标位置在输出设备上输出一个点,首先需要计算出该点的坐标位置(最逼近该点的像素位置),其次需要把应用程序中的坐标信息(最逼近该点的像素位置),其次需要把应用程序中的坐标信息转换成所用输出设备的相应指令转换成所用输出设备的相应指令 直线的扫描转换及算法 二、二、 直线的扫描转换直线的扫描转换v在数学上,理想的点和直线都是没有宽度的但是,由于每个像素在数学上,理想的点和直线都是没有宽度的但是,由于每个像素对应于图形设备上的一个矩形区域,当我们在光栅图形设备上显示一对应于图形设备上的一个矩形区域,当我们在光栅图形设备上显示一个点时,实际上它是有用一个发光的矩形区域来表示的;当在光栅图个点时,实际上它是有用一个发光的矩形区域来表示的;当在光栅图形设备上显示一条直线时,我们只能在显示器所给定的有限个像素组形设备上显示一条直线时,我们只能在显示器所给定的有限个像素组成的矩阵中,按扫描线顺序,依次确定最佳逼近于该直线的一组像素,成的矩阵中,按扫描线顺序,依次确定最佳逼近于该直线的一组像素,并且对这些像素进行写操作。
这个过程称为直线的扫描转换并且对这些像素进行写操作这个过程称为直线的扫描转换 直线的扫描转换及算法 二、二、 直线的扫描转换直线的扫描转换v对于水平线、垂直线和对于水平线、垂直线和45º45º斜线,选择哪些像素是显而易见的,但是斜线,选择哪些像素是显而易见的,但是对于其它的直线,确定用哪些像素来表示它就不那麽简单了本节我对于其它的直线,确定用哪些像素来表示它就不那麽简单了本节我们介绍用于直线扫描转换的常用算法:们介绍用于直线扫描转换的常用算法:•数值微分法数值微分法•BresenhamBresenham画线算法画线算法•中点画线法中点画线法 直线的扫描转换及算法 象素象素线线圆圆Geometric Graphics G={Pi | Pi--nearest pixel } 基本图形的生成算法任务之一就是找出所有的Pi 直线的扫描转换及算法 在介绍画线算法之前,我们先讨论画直线的基本要求:在介绍画线算法之前,我们先讨论画直线的基本要求:•直线必须有精确的起点和终点,直线必须有精确的起点和终点,•外观要直,外观要直,•线宽应当均匀一致、且与直线的长度和方向无关,线宽应当均匀一致、且与直线的长度和方向无关,•算法速度要快。
算法速度要快 直线的扫描转换及算法 直线方程:直线方程:y==kx++bk是直线的斜率,是直线的斜率,b是是y方向的截距,若直线的两端点为(方向的截距,若直线的两端点为(x0,,y0)及()及(x1,,y1),则),则 k=(=(y1--y0))/((x1--x0)) b==y1--kx1对于一直线,在对于一直线,在x方向取间隔方向取间隔dx,,则可计算则可计算y方向的间隔方向的间隔dy dy==k×dx该方法涉及到浮点数的乘除法、加减法以及取整运算,因此,效率非常低该方法涉及到浮点数的乘除法、加减法以及取整运算,因此,效率非常低 数值微分法数值微分法即数值微分法即DDA(( Digital Differential Analyzer ))基本思想基本思想: :先对一个方向的坐标取单位步长的变化先对一个方向的坐标取单位步长的变化, ,然后计算另一方向坐然后计算另一方向坐标相应的变化值标相应的变化值 假定直线的起点、终点分别为:(假定直线的起点、终点分别为:(X0,Y0), (X1,Y1),,且都为整数。
且都为整数则直线方程和斜率则直线方程和斜率k k为:为: YY = k*X+B k = (Y1-Y0)/(X1-X0) 数值微分法1.|k|<=11.|k|<=1, ,则应取则应取x x坐标的增量为坐标的增量为 x=x=1,可得如下Y的增量方程:1,可得如下Y的增量方程: Yi+1 = k Xi+1 + B = k (Xi + x) + B = kXi + B + k x = Yi + k x = Yi + k i i取自取自1 1开始的整数开始的整数, ,顺次加顺次加1,1,直到最后的端点直到最后的端点,y,y取最接近的整数取最接近的整数2.|k|>12.|k|>1, ,则应取则应取y y坐标的增量为坐标的增量为 y=y=1,可得如下1,可得如下X X的增量方程:的增量方程: Xi+1 = Xi +1/ k 3.开始端点在右端点开始端点在右端点,中止端点在左端点中止端点在左端点,则则 x =-=-1 Yi+1 = Yi -- k y=-=-1 Xi+1 = Xi --1/ k 数值微分法算法过程:算法过程:Dx==X1--X0 ; Dy==Y1--Y0此两参数的绝对值哪一个大,哪一个就作为步长参数(此两参数的绝对值哪一个大,哪一个就作为步长参数(n n),此参数),此参数将作为沿直线所画出点的数目将作为沿直线所画出点的数目(1)(1)当当|Dx|>= |Dy|(即(即|k|<=1)时)时若若X0
因此,用次加法因此,用DDADDA法生成直线的速度是相当快的法生成直线的速度是相当快的DDADDA算法的缺点:算法的缺点:在此算法中,在此算法中,x x,,y y、、k k必须是必须是floatfloat,且每一步都必须对,且每一步都必须对x x或或y y进行进行舍入取整,不利于硬件实现舍入取整,不利于硬件实现 BresenhamBresenham画线算法画线算法Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换算法该方法最初是为数字绘图仪设计的,后来被广泛地应用于光栅图形显示和数控(NC)加工该算法构思巧妙,使得每次只需检测误差项的符号就能决定直线上的下一个像素的位置 BresenhamBresenham画线算法画线算法算法原理算法原理:过各行、各列像素中心构造一组虚拟网格线,按直线:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素该列像素中与此交点最近的像素. .如图所示,先假设直线的斜率在如图所示,先假设直线的斜率在0 0~~1 1之间。
设之间设P Pi-1i-1是已选定的离直是已选定的离直线最近的象素,现在要决定下一个象素是线最近的象素,现在要决定下一个象素是T Ti i还是还是S Si i由图上可直观由图上可直观看出:看出:若若s
个象素单位对于任意走向的直线,则可以根据其端点的位置来对于任意走向的直线,则可以根据其端点的位置来控制其增量的正负控制其增量的正负该方法所需的计算量很小,它只包括加法、减法和该方法所需的计算量很小,它只包括加法、减法和左移操作这也是本算法得到广泛应用的原因左移操作这也是本算法得到广泛应用的原因dx = x2-x1=5;dy = y2-y1=2; d1=2dy-dx=-1d1<0,则选则选Si,y1=y0,且且 d2= d1+2dy=3d2>0,则选则选Ti, y2=y1+1 d3= d2+2(dy-dx)=-3以此类推以此类推 BresenhamBresenham画线算法画线算法举例:用举例:用BresenhamBresenham方法画直线段方法画直线段P1(0,0)—P2(5,2)P1(0,0)—P2(5,2)ixydi00→1011→20→1--122 →31 3 33 →41 →2--344 →52155 →62 BresenhamBresenham画线算法画线算法程序如下:程序如下: BresenhamLine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; { int x,y,dx,dy,e; dx = x1-x0; dy = y1-y0; x=0; y=0; e=2*x*dy-2*y*dx+2*dy-dx; for( i=0; i<=dx; i++){ draw_pixel (x+x0 ,y+y0 ,color); if(e>=0){ y++; // y=y+1; x++; d += 2*dy-2*dx ; }else { x++; d+=2*dy; } } } 中点画线法n为了讨论方便,假定直线斜率为了讨论方便,假定直线斜率0 之间假设已确定点亮象素点假设已确定点亮象素点P((Xi ,Yi )), ,则下一个与直线最接近的像素只能则下一个与直线最接近的像素只能是是P1P1点或点或P2P2点设M M为中点,为中点,Q Q为交点,则需确定下一个点亮的象素为交点,则需确定下一个点亮的象素PP2P1Q 中点画线法n当当M在在Q的下方的下方-> P2离直线更近更近离直线更近更近->取取P2 nM在在Q的上方的上方-> P1离直线更近更近离直线更近更近->取取P1nM与与Q重合,重合, P1、、P2任取一点任取一点n问题:如何判断问题:如何判断M与与Q点的关系?点的关系?PP2P1Q 中点画线法假设直线的起点和终点分别为(假设直线的起点和终点分别为(x0,,y0)和()和(x1,,y1),),则方程为:则方程为:ax+by+c=0其中其中a=y0 0-y1 1, b=x1 1-x0 0, c=x0 0y1 1-x1 1y0 0由常识知:由常识知:∴∴欲欲判判断断M点点是是在在Q点点上上方方还还是是在在Q点点下下方方,,只只需需把把M代代入入F(x,y),并并检检查查它的符号它的符号 中点画线法构造判别式:构造判别式:M(xi+1,yi+0.5)d=F(M)=F(xi i+1,yi i+0.5) =a(xi+1)+b(yi+0.5)+c当当d<0,,M在直线在直线(Q点点)下方,取右上方下方,取右上方P2 2;;当当d>0,,M在直线在直线(Q点点)上方,取右方上方,取右方P1 1;;当当d=0,选,选P1 1或或P2 2均可,约定取均可,约定取P1 1;;能否采用增量算法呢?能否采用增量算法呢?PP2P1Q 中点画线法若若d 0->M在直线上方在直线上方->取取P1;此时再下一个象素的判别式为此时再下一个象素的判别式为 d1 1=F(xi i+2, yi i+0.5)=a(xi i+2)+b(yi i+0.5)+c = a(xi i +1)+b(yi i +0.5)+c +a =d+a;; 增量为增量为a若若d<0->M在直线下方在直线下方->取取P2;此时再下一个象素的判别式为此时再下一个象素的判别式为 d2 2= F(xi i+2, yi i+1.5)=a(xi i+2)+b(yi i+1.5)+c = a(xi i +1)+b(yi i +0.5)+c +a +b =d+a+b ;; 增量为增量为a++bd的初始值的初始值(第一个象素应取左端点(第一个象素应取左端点(x0,y0)))d0= F(x0 0+1, y0 0+0.5)=a(xp p+1)+b(y0 0+0.5)+c = ax0 0+by0 0 +c +a +0.5b = F(x0 0, y0 0) +a +0.5b= ((2a+b)) 中点画线法012135a = y1-y2= -2; b = x2-x1= 5;d0 = 2*a+b = 1;d1 =2*a = -4; d2 = 2*(a+b) =6;ixyd0001110-32213331-144255521举例:用中点画线法画直线段举例:用中点画线法画直线段P1(0,0)—P2(5,2)P1(0,0)—P2(5,2) 中点画线法MidpointLine(X0,Y0,X1,Y1,Color) int X0,Y0,X1,Y1,Color; { int a,b,d1,d2,d,x,y; a=Y0-Y1; b=X1-X0; d=a+a+b; d1=a+a; d2=a+b+a+b; x=X0; y=Y0; drawpixle(x,y,Color); while(x 进行写操作 圆的八点对称 利用圆周坐标的对称性,可将圆周分为利用圆周坐标的对称性,可将圆周分为8 8个象限,只要将第个象限,只要将第1a1a象限中的圆周光栅象限中的圆周光栅点求出,其余点求出,其余7 7部分圆周就可以通过对称部分圆周就可以通过对称法则计算出来法则计算出来 如位于如位于1/81/8圆周上的一个点(圆周上的一个点(x x,,y y),可),可以把以把x x,,y y值进行交换及改变值进行交换及改变x x、、y y值的符值的符号,从而在圆周上映射出另外号,从而在圆周上映射出另外7 7个点,这个点,这种性质称为八点对称种性质称为八点对称(x, y)(y, x)(y, -x)(x, -y)(-x, -y)(-y, -x)(-y, x)(-x, y) 圆的八点对称在在x x==y y时,不应该调用函数时,不应该调用函数CirpotCirpot(),因为上面的程序将对称(),因为上面的程序将对称轴上的轴上的4 4个像素重绘两次,当采用异或方式绘图时,圆上会出现个像素重绘两次,当采用异或方式绘图时,圆上会出现4 4个缺口nBresenham画圆法画圆法n中点画圆法中点画圆法n生成圆弧的其它算法生成圆弧的其它算法圆的扫描转换算法有:圆的扫描转换算法有:圆的解析方程有圆的解析方程有: :1)1)利用圆的一般方程画圆利用圆的一般方程画圆( x – a )( x – a )2 2 + ( y – b )+ ( y – b )2 2 = r= r2 2 2)2)利用极坐标方程画圆利用极坐标方程画圆x = a + 2x = a + 2r r cos cos2 2θ θ y = b + y = b + r r sin2θ sin2θ Bresenham画圆法(x, y)H(x+1, y)D(x+1, y-1)n只考虑位于第一象限只考虑位于第一象限1/81/8圆弧的画法,即(圆弧的画法,即(0 0,,R R)~()~(R/ , R/ R/ , R/ ))n基本思想:基本思想:对于在第一象限内顺时针确定最佳逼近于圆弧的像素序列时,从任对于在第一象限内顺时针确定最佳逼近于圆弧的像素序列时,从任一像素出发,下一像素的取法有两种可能,分别为图示的一像素出发,下一像素的取法有两种可能,分别为图示的H H、、D D点。 点 Bresenham画圆法n显然应选择离圆弧最近的像素点作为显示圆弧的点,应对以下显然应选择离圆弧最近的像素点作为显示圆弧的点,应对以下误差项作比较误差项作比较n两点到圆心的距离平方与圆弧上任一点到圆心的距离平方(两点到圆心的距离平方与圆弧上任一点到圆心的距离平方(R R2 2))之差分别为:之差分别为:◎◎ΔH = ( x +1)2 + ( y )2 – R2◎◎ΔD = ( x +1)2 + ( y–1)2 – R2 (x, y)H(x+1, y)D(x+1, y-1)引入判别式引入判别式:di==| ΔH |-| ΔD |d di i>=0,>=0,则选择则选择D D,且,且y yi i++1 1==y yi i--1 1d di i<0,<0,则选择则选择H H,且,且y yi i++1 1==y yi i Bresenham画圆法n理想圆周穿过垂线理想圆周穿过垂线x x==x xi i++1 1存在存在5 5种情况种情况(1)H(1)H、、D D均在圆内均在圆内 → ΔH<0 , , ΔD<<0 取更靠近理想圆周的取更靠近理想圆周的H H(2)H(2)H在圆上,在圆上,D D在圆内在圆内 → → ΔH=0 ,ΔΔD<<0 0,取,取H H(3)H(3)H在圆外,在圆外,D D在圆内在圆内 → → ΔH>0, ΔΔD <0<0(4)H(4)H在圆外,在圆外,D D在圆上在圆上 → → ΔΔH>>0,Δ0,ΔD==0 0 取取D D(5)H(5)H、、D D均在圆外均在圆外 → → ΔΔH>>0,Δ0,ΔD>>0 0取更靠近理想圆周的取更靠近理想圆周的D D(x, y)H(x+1, y)D(x+1, y-1) Bresenham画圆法1.1.如何处理情况如何处理情况(3)(3)呢?呢?H在圆外,在圆外,D在圆内在圆内 即即ΔH>0, ΔD<0di==| ΔH |--| ΔD | → di== ΔH ++ΔDdi>=0,选择选择D,, di<0,选择选择H2.情况(情况(1)和()和(2),由于),由于ΔH<==0, ΔD <0,代入上式,得代入上式,得di<0,应选,应选H3.情况(情况(4)和()和(5),由于),由于ΔH>0, ΔD >=0,代入上式,得代入上式,得di>0,应选,应选D如何简化如何简化di的计算?的计算? Bresenham画圆法di=ΔH ++ΔD =(xi+1)2+yi2-R2++(xi+1)2+(yi-1)2-R2用用i++1代代i,得,得 di++1=(xi++1+1)2+yi++12-R2++(xi++1+1)2+(yi++1-1)2-R2如果如果di<0,选,选H,,xi++1==xi++1,, yi++1==yi,,得得 di++1=di++4xi++6如果如果di>=0,选,选D,,xi++1==xi++1,, yi++1==yi-1,得,得 di++1=di++4(xi-yi)++10对于对于i==0,,x0==0,,y0==R ,则初值,则初值 d0==3--2R这个算法中计算量很小,因此,算法效率很高这个算法中计算量很小,因此,算法效率很高(x, y)H(x+1, y)D(x+1, y-1) Bresenham画圆法画圆算法画圆算法基本思想:基本思想: 与中点画线法基本思想相类似。 对于第与中点画线法基本思想相类似对于第1a象限内从象限内从(0,R)到到((R/√2, R/√2 )顺时针确定最佳逼近于圆弧的像素序列,假定)顺时针确定最佳逼近于圆弧的像素序列,假定P点像点像素位置已经确定素位置已经确定P = (xi, yi),则下一个像素只能是,则下一个像素只能是NE=(xi+1, yi)或或E= (xi+1, yi-1)设M为中点,即为中点,即M = (xi+1, yi-0.5);; Q为交点显然,当为交点显然,当Q在在M的上方,应取的上方,应取NE ;当;当Q在在M的下方,应取的下方,应取E ;当;当M与与Q重合时,重合时, NE、、E任取一点以后依次类推任取一点以后依次类推 中点画圆法NEEMP = (xi, yi)Q 中点画圆法构造函数:构造函数: F(x, y) = x2 + y2 - R2,,圆上的点,圆上的点, F(x, y) = 0;圆内的点,;圆内的点, F(x, y)< 0;圆外的点,;圆外的点, F(x, y)> 0由此得到判别式:由此得到判别式:di = F(M) = F(xi+1,yi- 0.5) = (xi+1)2 + (yi- 0.5)2 - R2()当()当di < 0,,M在在Q点下方,取上方点下方,取上方NE,即,且再下一像素的判别式为:,即,且再下一像素的判别式为: di+1 = F(xi+2,yi- 0.5) = (xi+2)2 + (yi- 0.5)2 - R2 = di + 2xi +3((2)当)当d≥0,,M在在 Q点上方,取下方点上方,取下方E,再下一像素的判别式为:,再下一像素的判别式为: di+1 = F(xi+2,yi- 1.5) = (xi+2)2 + (yi- 1.5)2 - R2 = di + 2(xi-yi) +5对于在第对于在第1a象限内,第一像素是象限内,第一像素是(0,R),判别式,判别式d的初值为的初值为 d0 = F(x0+1, y0- 0.5) = 12 + (R- 0.5)2 - R2NEEMP = (xi, yi)Q 中点画圆法中点画圆算法只用到整数的加法、减法和左移(乘中点画圆算法只用到整数的加法、减法和左移(乘2)运算,)运算,故效率高且适合硬件实现。 故效率高且适合硬件实现 中点画圆法程序示例程序示例 正负法画圆n基本思想:基本思想:确保用于表示圆弧的点均在圆弧附近,且使逼近确保用于表示圆弧的点均在圆弧附近,且使逼近于圆弧的像素序列在圆弧内外交替出现,即于圆弧的像素序列在圆弧内外交替出现,即F(xi,yi) 时正时负,故称正负法时正时负,故称正负法 正负法画圆设圆的方程为设圆的方程为F(x, y) = x2 + y2 - R2 =0;•点点(x, y)在圆上,有在圆上,有F(x, y) ==0•点点(x, y)在圆内,有在圆内,有F(x, y) <0•点点(x, y)在圆外在圆外,有,有F(x, y) >0n假设求得假设求得Pi的坐标为的坐标为(xi,yi);;•当当Pi在圆内时,在圆内时,F(xi,yi)<0,,下一像素取右方、向圆外下一像素取右方、向圆外;;•当当Pi在圆外时,在圆外时,F(xi,yi)>0,,下一像素取下方、向圆内;下一像素取下方、向圆内;n即求得即求得Pi点后选择下一个象素点点后选择下一个象素点Pi+1的规则为:的规则为:•当当F(xi,yi)≤0时,取时,取xi+1 = xi+1,,yi+1 = yi;•当当F(xi,yi)>>0时,取时,取xi+1 = xi,, yi+1 = yi-1;n这样用于表示圆弧的点均在圆弧附近,且使这样用于表示圆弧的点均在圆弧附近,且使F(xi,yi) 时正时负,故时正时负,故称正负法。 称正负法Pi+1PiPi+2 正负法画圆 椭圆的扫描转换可以把画圆算法扩展到既可画圆又可画椭圆椭圆的标准方程为:可以把画圆算法扩展到既可画圆又可画椭圆椭圆的标准方程为:可以修改前面讲过的可以修改前面讲过的Bresenham画圆算法,使它也可生成椭圆画圆算法,使它也可生成椭圆要画椭圆,只要在计算要画椭圆,只要在计算di时用椭圆方程代替圆的方程时用椭圆方程代替圆的方程画椭圆算法与画圆算法的唯一差别是参数画椭圆算法与画圆算法的唯一差别是参数d的形式不同的形式不同 其他输出图元的生成常用的其他曲线:正弦函数曲线常用的其他曲线:正弦函数曲线 、指数函数曲线、多项式、指数函数曲线、多项式函数曲线、概率分布曲线、样条函数曲线函数曲线、概率分布曲线、样条函数曲线如果函数曲线可以用如果函数曲线可以用y==f((x)形式来表示,则可指定)形式来表示,则可指定x间隔间隔计算出相应的计算出相应的y值,由各值,由各x,,y值画出此曲线值画出此曲线由若干离散数据点所定义的曲线,可用其他方法绘出,由若干离散数据点所定义的曲线,可用其他方法绘出,((1 1)先画出各个数据点,然后用直线连接这些点先画出各个数据点,然后用直线连接这些点。 2 2)用曲线拟合技术平滑地逼近数据点所定义的曲线)用曲线拟合技术平滑地逼近数据点所定义的曲线 输出图元的属性在图元输出之前,可为其指定不同的属性,属性定义了图在图元输出之前,可为其指定不同的属性,属性定义了图元在输出设备上的外部特征例如,可用属性为输出图元元在输出设备上的外部特征例如,可用属性为输出图元定义线型、线宽、色彩等本节将讨论如何在扫描转换的定义线型、线宽、色彩等本节将讨论如何在扫描转换的同时控制输出图元的线宽和线型同时控制输出图元的线宽和线型 线宽控制1.复制像素法复制像素法((1 1)基本思想:)基本思想:在扫描转换图元时,同时显示在扫描转换图元时,同时显示n n个像素这样就将原来绘制个像素这样就将原来绘制单个像素的语句改写成以该像素为中心绘制水平或垂直排单个像素的语句改写成以该像素为中心绘制水平或垂直排列的多个像素,因此,可产生具有一定线宽的线条列的多个像素,因此,可产生具有一定线宽的线条2 2)复制方法)复制方法斜率绝对值小于斜率绝对值小于1 1,垂直方向上像素复制,垂直方向上像素复制斜率绝对值大于斜率绝对值大于1 1,水平方向上像素复制,水平方向上像素复制斜率绝对值斜率绝对值<1斜率绝对值斜率绝对值>1 线宽控制((3)特点)特点算法简单、执行效率高,适合于比较小的线宽。 当线算法简单、执行效率高,适合于比较小的线宽当线宽较大时,该算法的缺点是:宽较大时,该算法的缺点是:a a))线段的两端只有水平或垂直两种情况线段的两端只有水平或垂直两种情况b b)曲线要根据当前绘制像素的斜率来决定是在水平方向还)曲线要根据当前绘制像素的斜率来决定是在水平方向还是垂直方向复制像素是垂直方向复制像素c c)在折线连接处由水平复制转为垂直复制时,会产生缺口)在折线连接处由水平复制转为垂直复制时,会产生缺口复制像素法产生的缺口复制像素法产生的缺口用复制像素法绘制圆弧用复制像素法绘制圆弧 线宽控制2.移动画笔法移动画笔法基本思想:基本思想:将原来绘制单个像素的语句改写成以该像素为中心绘制画将原来绘制单个像素的语句改写成以该像素为中心绘制画笔位图的语句也就是将设定宽度为笔位图的语句也就是将设定宽度为k k的画笔的中心沿线段的画笔的中心沿线段移动,即可产生具有线宽移动,即可产生具有线宽k k的线条端点是方的端点是方的斜率接近斜率接近1 1时,宽度最大时,宽度最大 线宽控制3.区域填充法区域填充法基本思想:基本思想:根据线条的宽度,计算出线条的外轮廓,然后调用填充图根据线条的宽度,计算出线条的外轮廓,然后调用填充图元的生成函数将其填充,产生具有一定线宽的线条。 元的生成函数将其填充,产生具有一定线宽的线条用区域填充法绘制圆弧用区域填充法绘制圆弧 线型控制在图形系统中经常使用具有不同线型的线条来表示不同的含义,线在图形系统中经常使用具有不同线型的线条来表示不同的含义,线型属性主要包括实线、虚线、点划线型属性主要包括实线、虚线、点划线在显示虚线时,把画线算法修改为沿一直线输出带有间隙的短实线在显示虚线时,把画线算法修改为沿一直线输出带有间隙的短实线点划线则是每画一短实线加入一点点划线则是每画一短实线加入一点其他线型可通过短划线的长短不同及间隙不同来重新组合得到其他线型可通过短划线的长短不同及间隙不同来重新组合得到 字符的生成在图形系统中,除了要显示各种几何元素之外,还要显示在图形系统中,除了要显示各种几何元素之外,还要显示字符及各种标记符号目前常用的字符有两种:字符及各种标记符号目前常用的字符有两种:一、一、ASCII码字符码字符二、汉字字符二、汉字字符 字符的生成一、一、ASCII码字符码字符7 7位二进制数编码,只能表示位二进制数编码,只能表示128128个字符,每个个字符,每个ASCII:ASCII:编码编码0 0~~3131表示控制字符(不可显示)表示控制字符(不可显示)编码编码3232~~127127表示英文字母、数字、标点符号等可显示字符表示英文字母、数字、标点符号等可显示字符二、汉字字符二、汉字字符汉字编码的国家标准字符集汉字编码的国家标准字符集————国标码国标码67636763个汉字,图形符号个汉字,图形符号682682个个汉字和图形符号组成一个汉字和图形符号组成一个94×9494×94的矩阵的矩阵每一行称为每一行称为““区区””,用区码标识;每列称为,用区码标识;每列称为““位位””,用位码标识,用位码标识一个符号由一个区码和一个位码共同标识,区码和位码分别需要一个符号由一个区码和一个位码共同标识,区码和位码分别需要7 7个二进制位来表示个二进制位来表示 字符形状表示在计算机中最常用的表示字符形状的方法有两种,即在计算机中最常用的表示字符形状的方法有两种,即位图位图((Bitmap))表示和表示和轮廓线(轮廓线(Outline))表示表示((b)所示为位图表示,即用)所示为位图表示,即用0,,1位图来描述字符的形状,这个位图来描述字符的形状,这个0、、1位图被称为点阵位图被称为点阵((c)所示的为轮廓线表示,即用直线或曲线来描述字符的轮廓)所示的为轮廓线表示,即用直线或曲线来描述字符的轮廓 字符形状表示显示位图表示的字符的过程很简单,可用写位图的方法,写位图显示位图表示的字符的过程很简单,可用写位图的方法,写位图有透明方式和不透明方式。 有透明方式和不透明方式缺点:需要占用大量的存储空间,可以使用固定大小的字体来产缺点:需要占用大量的存储空间,可以使用固定大小的字体来产生大小和字形等方面的各种变化,但效果往往不能令人满意生大小和字形等方面的各种变化,但效果往往不能令人满意显示轮廓线表示字符的过程要复杂一些,需要用扫描转换算法对显示轮廓线表示字符的过程要复杂一些,需要用扫描转换算法对轮廓线的内部进行填充轮廓线的内部进行填充特点:可对字符的轮廓线作变换产生一种字体的各种变化,只需存储一套轮廓线表示,可节省大量的存储空间,但扫描转换需要更长的处理时间 字符属性在输出字符(或字符串)之前,往往需要指定一系列字符属在输出字符(或字符串)之前,往往需要指定一系列字符属性字符属性包括字体、字形、字符大小、字符间距、字符性字符属性包括字体、字形、字符大小、字符间距、字符颜色、字符串对齐方式等颜色、字符串对齐方式等字符属性字符属性。
