1、,第6章 图形的生成与计算,6.1 直线生成的算法 6.1.1 直线生成的算法要求 6.1.2 逐点比较法 6.1.3 数值微分法 6.2 圆的生成算法 6.3 多项式曲线图的绘制 6.3.1 多项式计算的差分法 6.3.2 差分法计算步骤 6.3.3 多项式曲线图绘制的程序设计 6.4 内插法绘制曲线图的方法 6.4.1 内插法的原理和特点 6.4.2 用内插法实现曲线圆滑处理方法 6.4.3 用内插法实现曲线圆滑处理的程序设计,6.5 贝塞尔法曲线和B样条曲线 6.5.1 贝塞尔曲线 6.5.2 B样条曲线 6.6 字符的生成 6.6.1 点阵式字符的生成方法 6.6.2 矢量式字符的生成
2、方法 6.6.3 方向编码式字符 6.6.4 轮廓字形技术 习题6,6.1 直线生成的算法 6.1.1 直线生成的算法要求 6.1.2 逐点比较法 6.1.3 数值微分法 数值微分法称为DDA法( Digital Differential Analyzer ),它通过微分方程的方法简化方程,从而减小绘图计算的复杂度。 对上面的直线用微分方程法处理,具体方法是: 求导: X=Xa+(XbXa)t; Y=Ya+(YbYa)t.,得:,从而得出:,即: x = (XbXa)t ;y = (YbYa)t .式中的t、x和y的意义分别为;直线参变量增加的数值(步长)、对应图形在X方向和Y方向增加的坐标值
3、。 若令 t1/L,L=max(XbXa,YbYa),并计算出x和y的值,则在绘图过程中图形坐标的计算公式为: Xi+1=Xi +x ; Yi+1=Yi+y .,6.2 圆的生成算法 设要输出的图形是圆心在原点,半径为R的圆。它的参数方程为: X = Rcos(t) ( 0t2 ) Y = Rsin(t). 1. 求圆轨迹逼近方程 由圆微分方程: dx=Rsin(t)dt=Ydt; dy=Rcos(t)dt=Xdt. 得出差分方程: x = Yt; y=Xt. 若点(Xi,Yi)在圆上,令步长t,则圆轨迹逼近方程: Xi+1=XiYi; Yi+1=Yi+Xi.,2. 求步长值 由于是一个很小的
4、值,但不可能无穷小,所以逼近点(Xi+1,Yi+1)近似在圆上。为了使(Xi+1,Yi+1)与(Xi,Yi)邻近,要求满足关系式: (Xi+1Xi)2+(Yi+1Yi)22 变换它的形式: (Xi+1Xi)2+(Yi+1Yi)2 = 2(Yi2+Xi2)=2R2 2 要满足该式,则要求:3. 求逼近点的误差 逼近点(Xi+1, Yi+1)所在的圆轨迹方程为: Xi+12+Yi+12 = (Xi2+Yi2)+2(Xi2+Yi2) = (1+2) (Xi2+Yi2) 显然,逼近点不在要求的圆轨迹上。也就是说,如果按上述的圆逼近方程的算法绘图,每走一步,新点离圆心越远,其半径总要乘以一个大于1的系数
5、(1+2),使得图形越来越偏离理想圆,结果会是一个螺旋线,起始点与终止点不重合。,4. 求消除误差的圆轨迹逼近方程 对原圆轨迹逼近方程进行修正,使它的新形式为: Xi+1=XiYi Yi+1=Yi+Xi+1=Xi+(12)Yi 根据修正后的圆轨迹逼近方程,不难得出逼近点(Xi+1,Yi+1)与已有点(Xi,Yi)之间满足关系: Xi+12Xi+1Yi+1+Yi+12=Xi2XiYi+Yi2 该关系式说明,如果已有点(Xi,Yi)在X2XY+Y2=R2上,则逼近点(Xi+1,Yi+1)也在X2XY+Y2=R2上。而X2XY+Y2=R2是一个与圆X2+Y2=R2非常接近的椭圆,它的长半轴是 短半轴
6、是,6.3 多项式曲线图的绘制 6.3.1 多项式计算的差分法 设要处理的三次多项式为: Y = f ( X ) = aX3bX2cXd 令:Xi = ih, 其中:h 为绘图的步长,它可以是变量或常量,一般情况下它为常量。i 为步数,即已经进行逼近点计算次数。Xi 为曲线上第i个象素点的X坐标值。 1. 求一阶差值 将多项式曲线上的相邻点(Xi,Yi)和(Xi+1,Yi+1)代入方程: Yi = f (i,h) = ah3i3bh2i2chid Yi+1 = ah3(i1)3+bh2(i1)2+ch(i1)d,求一阶差值: Yi+1Yi = ah3(3i23i1)bh2(2h1)ch = q
7、 (i ,h) 令: Ri=Yi+1Yi = q ( i, h ) 得: Yi+1=Yi+Ri. 显然,一阶差值Ri为i的二阶多项式,比原方程降了一阶。 2. 求二阶差值 设:Ri+1Ri = R(h, i),则R (h, i)为二阶差值。 由于Ri+1与Ri对于q(i, h)来说,变量i的最高次数差别为(i+1)2和i2,其系数一样,最终结果R(h, i)的最高次数项(二次项)会抵消。R(h, i)为i的一次多项式,比原方程降了二阶。 令:Si=R(h, i) 即:Ri+1=Ri+Si,3. 求三阶差值 设:Si+1Si = S(h),则S(h)为三阶差值。 Si+1与Si是有关i的一次多项
8、式,它们的一次项系数是相等的,相减后,一次项被消去。S(h)是一个与i无关的常数。 S(h)可以利用S1和S0求得: S(h) = S1S0 = (R2R1)(R1R0) = R22R1R0= (Y3Y2)2(Y2Y1)(Y1Y0)=Y33Y23Y1Y0,6.3.2 差分法计算步骤 用差分法绘制多项式曲线方程,其计算步骤按下列顺序进行:S0 = (R1R0) = (Y2Y1)(Y1Y0) = Y22y1Y0S(h) = S1S0 = Y33Y23Y1Y0R0 = Y1Y0Si+1 = SiS(h)Ri+1 = RiSiYi+1 = YiRiXi = i h,该计算步骤用图示表示为:S(h) +
9、S(h) +S(h) +S(h) +S(h)S0 - S1 - S2 - S3 - S4 - S5 - - + + + R0 R1 R2 - R3 - R4 - R5 - - - + + +Y0 Y1 Y2 Y3 Y4 - Y5 - Y6 图6-3 差分法计算多项式值步骤,上述计算步骤说明:用差分法计算多项式要分两步进行,第一步为初始计算,第二步才是正式计算。初始计算结果得出正式计算需要的初始数据,它的内容有: (1) 通过多项式方程计算出Y0、Y1、Y2和Y3值。 (2) 对于Y0、Y1、Y2及Y3,求它们相邻数之间的差,得出R0、R1、R2值。 (3) 求R1R0、R2R1,得出S0和S1
10、。 (4) 计算S1S0,得出S(h)。 正式计算是根据已知数据及他们之间的差值关系,求下一个逼近点Yi+1值,具体求法是: Xi+1 = Xi+h; Yi+1 = Yi+Ri; Ri+1 = Ri+Si; Si+1 = Si+S(h).,6.3.3 多项式曲线图绘制的程序设计 1. 绘制多项式曲线图的关键问题 (1) 坐标转换 多项式方程对应的曲线坐标系是用户坐标系,而曲线图要通过设备坐标系输出,两个坐标系之间存在较大的差异。多项式方程的数据取值范围(Xmin,Xmax,Ymin,Ymax)和对图形坐标轴方向的要求,决定了图形的窗口情况;输出设备的绘图区域(Xmin,Xmax,Ymin,Ym
11、ax)和坐标轴的规定,决定图形的视口情况。绘制多项式曲线图要求通过窗口视口的转换实现坐标系之间的转换。,(2) 曲线质量 多项式曲线图应反映多项式方程的特征,对于一些具有特殊意义的点,包括拐点和极点,曲线上都要准确地表现出来,不能丢失。曲线的质量不仅反应在特征表达上,还要求曲线的线条光滑、均匀及粗细适当。 (3) 函数计算 函数计算在绘制多项式曲线工作中起很重要的作用。函数计算包括三个内容:确定多项式计算方法,计算自变量值和相应函数值,将结果暂存于数据库中。函数计算的特点是工作量大,好的计算方法可以大大提高曲线生成速度。差分法计算多项式可以简化计算的复杂度,在进行多项式曲线图设计时可以利用差分
12、法计算函数的数值。 (4) 绘图策略 确定计算数据的步长、图形画面总体布局、图形属性及曲线绘制的具体方法。,2. 绘制多项式曲线图需要的参数 (1) 画面视口参数 画面视口是图形画面输出的视口,是输出设备分配给图形画面的全部区域。画面视口用其区域的左下角坐标(Xlb,Ylb)和右上角坐标(Xrt, Yrt)表示。 (2) 多项式曲线图视口参数 多项式曲线图视口是曲线图可利用的有效绘图区域。由于画面视口内,图形边缘、曲线图的坐标轴及辅助说明正文都要占一定的图形区域,因而曲线图视口要比画面视口小。多项式曲线图视口用有效绘图区域的左下角坐标(Xlb“, Ylb“)和右上角坐标(Xrt“, Yrt“)
13、表示。 (3) 曲线坐标轴方向 曲线图使用的坐标系称为曲线图坐标系。曲线坐标轴方向指曲线图坐标系的X轴和Y轴的正方向。在曲线图中,为了充分利用曲线图视口,坐标轴的具体位置一般不固定,由图形数据决定。但曲线坐标系的方向必须确定,因为曲线坐标轴方向决定曲线图的走向。,(4) 多项式方程自变量的取值范围 多项式方程自变量的取值范围(Xmin,Xmax)直接决定了函数值的范围(Ymin, Ymax),它决定着曲线图的形状。 (5) 曲线说明正文的输出要求 曲线说明正文是图形画面上的辅助信息,它用于帮助用户理解图形。曲线说明正文内容不仅指曲线标题,还包括有关曲线坐标的单位、特殊数据的标注等内容。曲线说明
14、正文的输出要求不仅包括输出正文的内容,还包括其正文属性。 (6) 用户对画面的图形属性要求 画面图形属性指对画面各个部分的颜色及绘图使用的线型的要求。,3. 绘制多项式曲线图的方法步骤 (1) 求曲线步长 曲线步长是指在曲线坐标系上,自变量X每取一个值相对于上个取值的增量。 设曲线步长为h,曲线总步数n。包括X的起始点在内,自变量X的总取值个数是n+1。设曲线图视口的左下角坐标(Xlb“, Ylb“)和右上角坐标(Xrt“, Yrt“),自变量X的起始点和终止点为(Xmin, Xmax),其中的Xmax大于Xmin。 1) 求曲线总步数n 曲线总步数n是在X方向上曲线图视口具有的总象素点数减去
15、1。 n = Xrt“ Xlb“.,2) 求曲线步长h h = Xmax Xmin/ n. 曲线步长h在设备坐标系中是一个象素点,如果实际取值比它小,会增加不必要的计算,反之,就可能漏掉曲线的特征点。 (2) 计算函数值 假设使用差分法计算多项式函数值,该过程处理内容有: 1) 按上面所求步长h值,用差分法计算步骤计算Y0,Y1,Yi,Yn,将它们暂存在数据文件中。 2) 在计算函数值的同时,求出Y0,Y1,Yn中最大值Ymax和最小值Ymin。 3) 函数值的取值范围(Yin, Ymax)决定了曲线图坐标系的窗口参数。图形窗口的左下角坐标( Xlb,Ylb )和右上角坐标( Xrt,Yrt
16、)分别为: Xlb = Xmin ; Xrt = Xmax ; Ylb = Ymin ; Yrt = Ymax.,(3) 坐标转换 坐标转换过程是将多项式方程的自变量和函数值(X, Y)用相应的设备坐标值( X, Y)表示。 1) 坐标转换公式 设曲线图窗口参数为:(Xlb,Ylb)和(Xrt,Yrt),曲线图视口参数为:(Xlb“,Ylb“)和(Xrt“, Yrt“)。它们两者的坐标系是不一样的,前者对应多项式方程数据,后者对应绘图坐标值。按窗口/视口变换矩阵可以推出坐标转换公式。Sx = (Xrt“Xlb“)/(XrtXlb);Sy = (Yrt“Ylb“)/(YrtYlb). 坐标转换公
17、式为:X = SxX+Xlb“XlbSx;Y = SyY+Ylb“YlbSy. 2) 坐标转换的内容 由于多项式方程的自变量相应的绘图坐标X可以推算得出,因此需要进行坐标转换的数据只是函数集Y0,Y1,Yi,Yn。,3) 坐标转换的结果 经过坐标转换过程后,曲线绘图数据集为: 对于X:Xmin, Xmin+1, Xmin+2, , Xmax. 对于Y:Y0, Y1, , Yi,Yn. 对于绘图点坐标(X,Y):(Xmin, Y0), (Xmin+1, Y1), , (Xmax, Yn ). (4) 绘坐标轴 绘坐标轴过程是确定曲线图坐标轴的位置,并通过系统软件的绘图语句画出坐标轴。 设曲线坐标
18、轴的正方向为:X轴向右;Y轴向上。设设备坐标轴的正方向为:X轴向右,与曲线坐标轴一致;Y轴向下,与曲线坐标轴相反。曲线图中的X轴可能位于图形画面的上、下或中间任意位置,Y轴可能位于图形画面的左、右或中间任意位置。曲线图坐标轴的具体位置与多项式方程的数据值有关。,1) X全为正值,Y轴在图形左侧;Y全为正值,X轴在图形下侧。 当:Xmin0 AND Xmax0 . 则:Y轴方程为X = Xlb“1。 当:Ymin 0 AND Ymax 0. 则:X轴方程为Y =Ylb“+1. 2) X全为负值,Y轴在图形右侧;Y全为负值,X轴在图形上侧。 当:Xmin0 AND Xmax0 . 则:Y轴方程为X
19、=Xrt“+1。 当:Ymin0 AND Ymax0. 则:X轴方程为Y=Yrt“1. 3) 如果不满足以上两种情况,应把X轴或Y轴置于图形的中部。这时的X轴应位于Y=0处,Y轴应位于X=0处。 通过窗口/视口变换公式可以得出Y轴和X轴的方程: 当X=0时: X = Xlb“Xlb(Xrt“Xlb“)/(XrtXlb); 当Y=0时: Y = Ylb“Ylb(Yrt“Ylb“)/(YrtYlb). (5) 绘曲线 绘曲线的功能为:按计算出的绘图点坐标数据( Xmin, Y0 ), (Xmin+1, Y1), , (Xmax, Yn )画点,并依次用小线段将它们连接起来,形成一条光滑均匀的曲线。
20、最后,可以按图形要求,将曲线说明正文标出。,6.4 内插法绘制曲线图的方法 6.4.1 内插法的原理和特点 内插法画曲线的基本原理 2. 内插法曲线的特点 内插法曲线也存在着明显的不足之处,这些缺点是: 当所有的点都有同样的X值(XX0) 时,曲线上每个点的X坐标不一定是X0。由近似曲线的X坐标公式得:,2) 曲线可能出现拐角现象。 3) 曲线可能不光滑。,6.4.2 用内插法实现曲线圆滑处理方法 内插法绘制曲线的基本方法 2. 取绘图点和插入新点 3. 求内插点个数和U步长 6.4.3 用内插法实现曲线圆滑处理的程序设计 曲线圆滑处理程序过程有以下说明之处: (1) 该曲线圆滑程序是以函数的
21、形式编写的,在需要时,由主程序调用. 在调用该过程之前,计算机的工作模式已进入合适的图形模式。 (2) 在调用该函数之前,采样数据已经过坐标转换处理。处理后的采样点共j个,它们的X坐标放在数组q1qj中,Y坐标放在数组r1 rj中。,(3) 该函数不考虑变量定义问题. 函数中的变量都是合法的,它的全局变量在主程序中均已定义,即使局部变量,过程也略去了变量定义部分。 (4) 该函数没有画坐标轴和有关正文信息,也不考虑有关图形属性问题。 (5) 该过程假定曲线的X值不相等,因而不考虑曲线归一化问题。/ 曲线圆滑处理过程代码清单如下 void qxyh() k=4; m=1/6; / K中存放阶段处
22、理的数据下标,M为U的步长mo=-1; moo=0; / mo为U的起始值outtextxy(q1,r1, );/定曲线起始点do / 确定U初值if( k!=4 ) mo=0;if( kj+1 ) mo=1;if( k=4 ) xb=1;else if( kj+1 ) xb=3 ;,else xb=2; / 定内插点位置,xb为绘图点序号if( mo!=moo ) moo=mo;for( i=1 ; i=5 ;i+) mo=mo+m;mi=mo*mo;mx=mi*mo;b(i-1)*4+1=-(mx-3*mi+2*mo)/6;b(i-1)*4+2=(mx-2*mi-mo+2)/2;b(i-1
23、)*4+3=-(mx-mi-2*mo)/2;b(i-1)*4+4=(mx-mo)/6for( i=1 ; i=5 ;i+) / 计算内插点,并用线段连接,i1=(i-1)*4 ;x=trunc(q1*bi1+1+q2*bi1+2+q3*bi1+3+q4*bi1+4); y=trunc(r1*bi1+1+r2*bi1+2+r3*bi1+3+r4*bi1+4);lineto(x,y);/ 将最后绘图点用线段连接到曲线上lineto(qxb+1,rxb+1);/ 确定处理阶段的绘图点if( k4 ,6.5 贝塞尔法曲线和B样条曲线 6.5.1 贝塞尔曲线 贝塞尔曲线的基本方法 2. Bezier曲线
24、讨论 3. Bezier曲线的性质 4. Bezier曲线的基函数存在的问题 5. 二次Bezier曲线和三次Bezier曲线 6.5.2 B样条曲线 B样条曲线的数学表达式 (2) 对定义的理解 (3) 结点向量的选取法,6.6 字符的生成 6.6.1 点阵式字符的生成方法 6.6.2 矢量式字符的生成方法 6.6.3 方向编码式字符 6.6.4 轮廓字形技术 一般采用压缩技术解决这个问题。对字形数据压缩后再存储,使用时,将压缩的数据还原为字符位图点阵。压缩方法有多种,最简单的有黑白段压缩法,这种方法简单,还原快,不失真,但压缩质量较差,使用起来也不方便,一般用于低级的文字处理系统中。另一种方法是部件压缩法。这种方法压缩比大,缺点是字形质量不能保证。三是轮廓字形法,这种方法压缩比大,且能保证字符质量,是当今国际上最流行的一种方法,基本上也被认为是符合工业标准化的方法。 轮廓字形法采用直线、或者二次Bezier曲线、三次Bezier曲线的集合来描述一个字符的轮廓线。,习题6 6.1 DDA法生成直线的基本原理是什么? 6.2 为什么利用差分法计算多项式的效率最高? 6.3 试述内插法的原理和曲线特点。 6.4 试述Bezier曲线的原理和曲线特点。 6.5 试述Bezier曲线的性质。 6.6 试述二次B样条曲线具有的特点。 6.7 试述常用的字符表示方法和技术。,