收藏 分享(赏)

第3章 二维线画图元及属性.ppt

上传人:gnk289057 文档编号:8306246 上传时间:2019-06-19 格式:PPT 页数:60 大小:850.50KB
下载 相关 举报
第3章 二维线画图元及属性.ppt_第1页
第1页 / 共60页
第3章 二维线画图元及属性.ppt_第2页
第2页 / 共60页
第3章 二维线画图元及属性.ppt_第3页
第3页 / 共60页
第3章 二维线画图元及属性.ppt_第4页
第4页 / 共60页
第3章 二维线画图元及属性.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、第3章 二维线画图元及属性,在图形系统的输出设备上生成的画面,都是由各种基本几何元素图形输出基元(简称为输出图元)构成的。画面上最简单的输出图元是点和直线,其他还有多边形、曲线图形以及字符串等。本章介绍一些常用直线段、圆弧的扫描转换算法。,第3章 二维线画图元及属性,3.1 直线的扫描转换及算法 3.2 圆和椭圆的扫描转换算法 3.3 其他输出图元的生成 3.4 输出图元的属性 3.5 字符的生成,3.1 直线的扫描转换及算法,扫描转换:从图形定义的物空间到进行显示处理的图像空间的转换 线画图元的扫描转换:计算出落在线段上或充分靠近它的一串像素,并以此像素集近似替代连续直线段在屏幕上显示的过程

2、。,由像素表示的直线段为均匀填充的实心原点,像素:中心为网格点的圆点,距离均匀,相互不重叠,3.1 直线的扫描转换及算法,一、点的生成,点是图形中最基本的图素,直线、曲线以及其它的图元都是点的集合。在几何学中,一个点既没有大小,也没有维数,点只是表示坐标系统中的一个位置。在计算机图形学中,点是用数值坐标表示的。在直角坐标系中点由(x, y)两个数值组成的坐标表示,在三维坐标系中点由(x, y, z)三个数值组成的坐标表示。,在输出设备上输出一个点,首先需要计算出该点的坐标位置(最逼近该点的像素位置),其次需要把应用程序中的坐标信息转换成所用输出设备的相应指令。,3.1 直线的扫描转换及算法,二

3、、 直线的扫描转换,在数学上,理想的点和直线都是没有宽度的。但是,由于每个像素对应于图形设备上的一个矩形区域,当我们在光栅图形设备上显示一个点时,实际上它是有用一个发光的矩形区域来表示的;当在光栅图形设备上显示一条直线时,我们只能在显示器所给定的有限个像素组成的矩阵中,按扫描线顺序,依次确定最佳逼近于该直线的一组像素,并且对这些像素进行写操作。这个过程称为直线的扫描转换。,3.1 直线的扫描转换及算法,二、 直线的扫描转换,对于水平线、垂直线和45斜线,选择哪些像素是显而易见的,但是对于其它的直线,确定用哪些像素来表示它就不那麽简单了。本节我们介绍用于直线扫描转换的常用算法: 数值微分法 Br

4、esenham画线算法 中点画线法,3.1 直线的扫描转换及算法,象素,线,圆,Geometric Graphics i | Pi-nearest pixel 基本图形的生成算法任务之一就是找出所有的i 。,3.1 直线的扫描转换及算法,在介绍画线算法之前,我们先讨论画直线的基本要求: 直线必须有精确的起点和终点, 外观要直, 线宽应当均匀一致、且与直线的长度和方向无关, 算法速度要快。,3.1 直线的扫描转换及算法,直线方程:ykxb k是直线的斜率,b是y方向的截距,若直线的两端点为(x0,y0)及(x1,y1),则k(y1y0)/(x1x0)by1kx1 对于一直线,在x方向取间隔dx,

5、 则可计算y方向的间隔dydykdx,该方法涉及到浮点数的乘除法、加减法以及取整运算,因此,效率非常低,3.1.1 数值微分法,数值微分法即DDA( Digital Differential Analyzer )基本思想:先对一个方向的坐标取单位步长的变化,然后计算另一方向坐标相应的变化值。 假定直线的起点、终点分别为:(X0,Y0), (X1,Y1),且都为整数。 则直线方程和斜率k为: = k*X+Bk = (Y1-Y0)/(X1-X0),3.1.1 数值微分法,1.|k|1,则应取y坐标的增量为y=,可得如下X的增量方程: Xi+1 = Xi +1/ k 3.开始端点在右端点,中止端点在

6、左端点,则 x 1 Yi+1 = Yi k y1 Xi+1 = Xi 1/ k,3.1.1 数值微分法,算法过程: DxX1X0 ; DyY1Y0 此两参数的绝对值哪一个大,哪一个就作为步长参数(n),此参数将作为沿直线所画出点的数目 (1)当|Dx|= |Dy|(即|k|X1,则 x1, y=k(2)当|Dx|1)时 若X0 X1,则 y1, x=1/k,3.1.1 数值微分法,例:画直线段P0(0,0)-P1(5,2)Dx=x2-x1=5, Dy=y2-y1=2 DxDyx =1 y =2/5=0.4 所以x方向上计长,走步数为5取初值x0=0.5, y0=0.5 (保证四舍五入) C=1

7、 x1= x0+1=1.5,y1= y0+0.4=0.9 取点(1,0) C=2 x2= x1+1=2.5,y2= y1+0.4=1.3 取点(2,1) C=3 x3= x2+1=3.5,y3= y2 +0.4=1.7 取点(3,1) C=4 x4= x3+1=4.5,y4= y3+0.4=2.1 取点(4,2) C=5 x5= x4+1=5.5,y5= y4+0.4=2.5 取点(5,2),3.1.1 数值微分法,程序实现:,3.1.1 数值微分法,DDA算法的优点:使用DDA算法,每生成一条直线做两次除法,每画线中一点做两次加法。因此,用DDA法生成直线的速度是相当快的。 DDA算法的缺点

8、:在此算法中,x,y、k必须是float,且每一步都必须对x或y进行舍入取整,不利于硬件实现。,3.1.2 Bresenham画线算法,Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换算法。该方法最初是为数字绘图仪设计的,后来被广泛地应用于光栅图形显示和数控(NC)加工。该算法构思巧妙,使得每次只需检测误差项的符号就能决定直线上的下一个像素的位置。,3.1.2 Bresenham画线算法,算法原理:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素. 如图所示,先假设直线的斜率在01之间。设Pi-1

9、是已选定的离直线最近的象素,现在要决定下一个象素是Ti还是Si。由图上可直观看出: 若st,则应选Ti; 即可以通过s-t的正负来判断选Si还是Ti,3.1.2 Bresenham画线算法,设直线从(x1,y1)到(x2,y2),经变换后可表示为从(0,0)到(dx,dy),其中:dxx2x1,dyy2y1直线方程:ydy/dx*x 设Pi1(r,q),则Si(r1,q),Ti(r1,q1)s=dy/dx*(r+1)-qt=(q+1)-dy/dx*(r+1) 则:s-t=2*dy/dx*(r+1)-2q-1所以:dx(s-t)=2(r*dy-q*dx)+2dy-dx 令di= dx(s-t)

10、,将r=xi-1, q=yi-1带入上式,,3.1.2 Bresenham画线算法,di=2xi-1*dy-2yi-1*dx+2dy-dx 以i1代替i(将每一下标加1): di+1=2xi*dy-2yi*dx+2dy-dx 从di+1减去di di+1- di=2dy(xi-xi-1)- 2dx(yi-yi-1) 因为xi-xi-1 1 di+1= di+2dy- 2dx(yi-yi-1) 如果di0;则选Ti, yi=yi-1+1,且di+1= di+2(dy- dx) 如果di0;则选Si, yi=yi-1,且di+1= di+2dy 初值为d1= 2dy-dx (x0,y0)(0,0)

11、,3.1.2 Bresenham画线算法,当斜率大于1时,可以将x,y交换,即以y方向作为计长方向,每次变化1个单位步长或1个象素单位。对于任意走向的直线,则可以根据其端点的位置来控制其增量的正负。 该方法所需的计算量很小,它只包括加法、减法和左移操作。这也是本算法得到广泛应用的原因。,dx = x2-x1=5; dy = y2-y1=2; d12dydx1 d10,则选Ti, y2y11d3 d2+2(dydx)3 以此类推,3.1.2 Bresenham画线算法,举例:用Bresenham方法画直线段P1(0,0)P2(5,2),3.1.2 Bresenham画线算法,程序如下: Bres

12、enhamLine(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=0)y+; / y=y+1;x+;d += 2*dy-2*dx ; else x+;d+=2*dy;,3.1.3 中点画线法,为了讨论方便,假定直线斜率0K1, 基本原理: 若直线在x方向上增加一个单位,则在y方向上的增量只能在0、1之间。 假设已确定点亮象素点P(Xi ,Yi ),则下一个与直线最接近的像素只能是P1点或P2点

13、。设M为中点,Q为交点,则需确定下一个点亮的象素。,3.1.3 中点画线法,当M在Q的下方- P2离直线更近更近-取P2 。 M在Q的上方- P1离直线更近更近-取P1 M与Q重合, P1、P2任取一点。问题:如何判断M与Q点的关系?,3.1.3 中点画线法,假设直线的起点和终点分别为(x0,y0)和(x1,y1), 则方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:欲判断M点是在Q点上方还是在Q点下方,只需把M代入F(x,y),并检查它的符号。,3.1.3 中点画线法,构造判别式:M(xi+1,yi+0.5) d=F(M)=F(xi+1,

14、yi+0.5) =a(xi+1)+b(yi+0.5)+c当d0,M在直线(Q点)上方,取右方P1;当d=0,选P1或P2均可,约定取P1;能否采用增量算法呢?,3.1.3 中点画线法,若d0-M在直线上方-取P1; 此时再下一个象素的判别式为d1=F(xi+2, yi+0.5)=a(xi+2)+b(yi+0.5)+c= a(xi +1)+b(yi +0.5)+c +a =d+a; 增量为a,若dM在直线下方-取P2; 此时再下一个象素的判别式为d2= F(xi+2, yi+1.5)=a(xi+2)+b(yi+1.5)+c= a(xi +1)+b(yi +0.5)+c +a +b =d+a+b

15、; 增量为ab d的初始值(第一个象素应取左端点(x0,y0)) d0= F(x0+1, y0+0.5)=a(xp+1)+b(y0+0.5)+c= ax0+by0 +c +a +0.5b = F(x0, y0) +a +0.5b= a +0.5b (2a+b),3.1.3 中点画线法,举例:用中点画线法画直线段P1(0,0)P2(5,2),3.1.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;

16、x=X0; y=Y0;drawpixle(x,y,Color);while(xX1)if(d0)x+; y+;d+=d2;elsex+;d += d1;drawpixle(x,y,Color);/*while*/*MidPointLine*/,3.2 圆和椭圆的扫描转换算法,为了便于讨论,仅考虑圆心位于坐标原点的圆弧的扫描转换算法,对于圆心不在原点的圆,可以通过平移变换,化为圆心在原点的圆,再将扫描转换所计算得到的所有像素坐标加上位移量即可;,圆的生成即是找出逼近圆的一组象素,按扫描线顺序,对这些象素(Pixel)进行写操作。,3.2.1 圆的八点对称,利用圆周坐标的对称性,可将圆周分为8个象

17、限,只要将第1a象限中的圆周光栅点求出,其余7部分圆周就可以通过对称法则计算出来。如位于1/8圆周上的一个点(x,y),可以把x,y值进行交换及改变x、y值的符号,从而在圆周上映射出另外7个点,这种性质称为八点对称,3.2.1 圆的八点对称,在xy时,不应该调用函数Cirpot(),因为上面的程序将对称轴上的4个像素重绘两次,当采用异或方式绘图时,圆上会出现4个缺口。,Bresenham画圆法 中点画圆法 生成圆弧的其它算法,圆的扫描转换算法有:,圆的解析方程有:,利用圆的一般方程画圆( x a )2 + ( y b )2 = r2利用极坐标方程画圆x = a + 2r cos2 y = b

18、+ r sin2,3.2.2 Bresenham画圆法,只考虑位于第一象限1/8圆弧的画法,即(0,R)(R/ , R/ ) 基本思想: 对于在第一象限内顺时针确定最佳逼近于圆弧的像素序列时,从任一像素出发,下一像素的取法有两种可能,分别为图示的H、D点。,3.2.2 Bresenham画圆法,显然应选择离圆弧最近的像素点作为显示圆弧的点,应对以下误差项作比较。 两点到圆心的距离平方与圆弧上任一点到圆心的距离平方(R2)之差分别为:H = ( x +1)2 + ( y )2 R2D = ( x +1)2 + ( y1)2 R2,引入判别式: di| H |-| D | di=0,则选择D,且y

19、i1yi1 di0,则选择H,且yi1yi,3.2.2 Bresenham画圆法,理想圆周穿过垂线xxi1存在5种情况 (1)H、D均在圆内 H0, D 0 (4)H在圆外,D在圆上 H0,D0 取D (5)H、D均在圆外 H0,D0取更靠近理想圆周的D,3.2.2 Bresenham画圆法,1.如何处理情况(3)呢?H在圆外,D在圆内 即H0, D=0,选择D, di0, D =0,代入上式,得di0,应选D,如何简化di的计算?,3.2.2 Bresenham画圆法,di=H D=(xi+1)2+yi2-R2(xi+1)2+(yi-1)2-R2 用i1代i,得di1=(xi1+1)2+yi

20、12-R2(xi1+1)2+(yi1-1)2-R2如果di=0,选D,xi1xi1, yi1yi-1,得di1=di4(xi-yi)10对于i0,x00,y0R ,则初值d032R这个算法中计算量很小,因此,算法效率很高,3.2.2 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

21、在M的上方,应取NE ;当Q在M的下方,应取E ;当M与Q重合时, NE、E任取一点。以后依次类推。,3.2.3 中点画圆法,3.2.3 中点画圆法,构造函数: F(x, y) = x2 + y2 - R2, 圆上的点, 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 +

22、3 (2)当d0,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 - R2 = 1.25-R,3.2.3 中点画圆法,中点画圆算法只用到整数的加法、减法和左移(乘2)运算,故效率高且适合硬件实现。,3.2.3 中点画圆法,程序示例,3.2.4 正负法画圆,基本思想: 确保用于表示圆弧的点均在圆弧附近,且使逼近于圆弧的像素序

23、列在圆弧内外交替出现,即F(xi,yi) 时正时负,故称正负法。,3.2.4 正负法画圆,设圆的方程为F(x, y) = x2 + y2 - R2 =0; 点(x, y)在圆上,有F(x, y) 0 点(x, y)在圆内,有F(x, y) 0 假设求得Pi的坐标为(xi,yi); 当Pi在圆内时,F(xi,yi)0,下一像素取下方、向圆内; 即求得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; 这样用于表示圆弧的点均在圆弧附近,且使F(xi,yi) 时正

24、时负,故称正负法。,3.2.4 正负法画圆,3.2.5 椭圆的扫描转换,可以把画圆算法扩展到既可画圆又可画椭圆。椭圆的标准方程为:,可以修改前面讲过的Bresenham画圆算法,使它也可生成椭圆。要画椭圆,只要在计算di时用椭圆方程代替圆的方程。 画椭圆算法与画圆算法的唯一差别是参数d的形式不同。,3.3 其他输出图元的生成,常用的其他曲线:正弦函数曲线 、指数函数曲线、多项式函数曲线、概率分布曲线、样条函数曲线。如果函数曲线可以用yf(x)形式来表示,则可指定x间隔计算出相应的y值,由各x,y值画出此曲线由若干离散数据点所定义的曲线,可用其他方法绘出, (1)先画出各个数据点,然后用直线连接

25、这些点。 (2)用曲线拟合技术平滑地逼近数据点所定义的曲线,3.4 输出图元的属性,在图元输出之前,可为其指定不同的属性,属性定义了图元在输出设备上的外部特征。例如,可用属性为输出图元定义线型、线宽、色彩等。本节将讨论如何在扫描转换的同时控制输出图元的线宽和线型。,3.4.1 线宽控制,1.复制像素法 (1)基本思想: 在扫描转换图元时,同时显示n个像素。这样就将原来绘制单个像素的语句改写成以该像素为中心绘制水平或垂直排列的多个像素,因此,可产生具有一定线宽的线条。 (2)复制方法 斜率绝对值小于1,垂直方向上像素复制 斜率绝对值大于1,水平方向上像素复制,斜率绝对值1,斜率绝对值1,3.4.

26、1 线宽控制,(3)特点 算法简单、执行效率高,适合于比较小的线宽。当线宽较大时,该算法的缺点是: a)线段的两端只有水平或垂直两种情况 b)曲线要根据当前绘制像素的斜率来决定是在水平方向还是垂直方向复制像素 c)在折线连接处由水平复制转为垂直复制时,会产生缺口,复制像素法产生的缺口,用复制像素法绘制圆弧,3.4.1 线宽控制,2.移动画笔法 基本思想: 将原来绘制单个像素的语句改写成以该像素为中心绘制画笔位图的语句。也就是将设定宽度为k的画笔的中心沿线段移动,即可产生具有线宽k的线条。,端点是方的,斜率接近1时,宽度最大,3.4.1 线宽控制,3.区域填充法 基本思想: 根据线条的宽度,计算

27、出线条的外轮廓,然后调用填充图元的生成函数将其填充,产生具有一定线宽的线条。,用区域填充法绘制圆弧,3.4.2 线型控制,在图形系统中经常使用具有不同线型的线条来表示不同的含义,线型属性主要包括实线、虚线、点划线。 在显示虚线时,把画线算法修改为沿一直线输出带有间隙的短实线 点划线则是每画一短实线加入一点 其他线型可通过短划线的长短不同及间隙不同来重新组合得到。,3.5 字符的生成,在图形系统中,除了要显示各种几何元素之外,还要显示字符及各种标记符号。目前常用的字符有两种: 一、ASCII码字符 二、汉字字符,3.5 字符的生成,一、ASCII码字符 7位二进制数编码,只能表示128个字符,每

28、个ASCII: 编码031表示控制字符(不可显示) 编码32127表示英文字母、数字、标点符号等可显示字符 二、汉字字符 汉字编码的国家标准字符集国标码 6763个汉字,图形符号682个 汉字和图形符号组成一个9494的矩阵 每一行称为“区”,用区码标识;每列称为“位”,用位码标识 一个符号由一个区码和一个位码共同标识,区码和位码分别需要7个二进制位来表示,3.5.1 字符形状表示,在计算机中最常用的表示字符形状的方法有两种,即位图(Bitmap)表示和轮廓线(Outline)表示,(b)所示为位图表示,即用0,1位图来描述字符的形状,这个0、1位图被称为点阵 (c)所示的为轮廓线表示,即用直

29、线或曲线来描述字符的轮廓,3.5.1 字符形状表示,显示位图表示的字符的过程很简单,可用写位图的方法,写位图有透明方式和不透明方式。 缺点:需要占用大量的存储空间,可以使用固定大小的字体来产生大小和字形等方面的各种变化,但效果往往不能令人满意。 显示轮廓线表示字符的过程要复杂一些,需要用扫描转换算法对轮廓线的内部进行填充。 特点:可对字符的轮廓线作变换产生一种字体的各种变化,只需存储一套轮廓线表示,可节省大量的存储空间,但扫描转换需要更长的处理时间,3.5.2 字符属性,在输出字符(或字符串)之前,往往需要指定一系列字符属性。字符属性包括字体、字形、字符大小、字符间距、字符颜色、字符串对齐方式等。,字符属性,

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

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

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


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

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

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