- 1、本文档共83页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 点阵图形的基本算法
第3章 点阵图形的基本算法 3.1 基本图形的点阵转换 评价一个转换算法的优劣可以通过如下三个方面来进行: (1) 所显示图形的精度。转换出的点阵图形毕竟只是对原始图形的近似, 有一定的误差, 这个误差的大小可根据实际需要而定。 (2) 算法的时间复杂性, 也就是算法的速度。 (3) 算法的空间复杂性, 即算法运行过程所需要的内存空间的大小。 3.2 直线点阵转换算法 3.2.1 描绘线条图形的要求 1. 直线段要显得笔直 在理论上的直线和点阵图形中,用像素点表示出的直线是有差别的。图3.1(a)表示出了一段理论直线段及所有涉及到的像素点。显然,用所有涉及到的像素点表示的图形不如用图3.1(b)中有选择的部分像素点表示的图形更像是直线段,也显得更笔直。当然,图3.2(a)表示出的垂直、水平及45°角的直线看起来是笔直的。而图3.2(b)接近垂直或水平线的直线总是呈现出一种阶梯状或锯齿状。 2. 线段端点位置应该准确 3. 线段亮度均匀 4. 转换算法速度快 3.2.2 增量DDA算法 1. 增量DDA算法思路 ? 设直线的起点坐标为(xs,ys), 终点坐标为(xe, ye), 则直线的方程为 y=mx+b (3.2.1) 其中, 直线的斜率为 在y轴上的截距为 那么画直线的最直观算法是: 给定直线的两个端点坐标后,求得m和b;然后在xs≤x≤xe范围内对x均匀取整数,利用式(3.2.1)进行浮点乘法和加法运算,求得y值后再取整数值即可得到需要的直线上的像素点。 最简单的改进算法是: 给定直线的两个端点坐标后,求得m和b;当|m|≤1时,在xs≤x≤xe范围内将x取整数,利用式(3.2.1)进行浮点乘法和加法运算, 求得y值后再取整数值;当|m|>1时,则y先取整数,利用式(3.2.1)进行浮点乘法和加法运算,求得x值后再取整数值。 可以认为直线图形上的点是由有先后顺序的一列像素点构成的,相邻的两点应满足: yi+1=yi+m(xi+1-xi) (3.2.5) 其中, (xi, yi)是第i步求得的像素点坐标,(xi+1, yi+1)是第i+1步求得的像素点坐标。类似前面的分析,我们应要求 并且要求其较大者就是1。也就是说,如果 |m|≤1,则要求 如果|m|>1,则要求 事实上,式(3.2.5)表示所求直线上y值的逐步递推关系,此式称为数字微分分析器(DDA)。于是,画直线的DDA算法可分两种情况描述如下: ? (a) |m|≤1的情况: 在xe-xs≥0时, 有 xi+1=xi+1, yi+1=yi+m (3.2.9) ? 在xe-xs≤0时, 有 xi+1=xi-1, yi+1=yi-m (3.2.10) (b) |m|>1的情况: 在ye-ys≥0时, 有 yi+1=yi+1, xi+1=xi+1/m (3.2.11) 在ye-ys≤0时, 有 yi+1=yi-1, xi+1=xi-1/m (3.2.12) ? 2. 线段DDA算法的伪代码描述 下面用伪代码给出DDA算法。 Procedure DDA-line(xs, ys, xe, ye) BEGIN /求线段在两坐标轴方向改变量的较大者/ IF ABS(xe-xs)>=ABS(ye-ys) THEN length=ABS(xe-xs); ELSE length=ABS(ye-ys); ENDIF /定义dx或dy中的较大值为1/ dx=(xe-xs)/length; dy=(ye-ys)/length; x=xs+0.5*SIGN(dx); y=ys+0.5*SIGN(dy); i=1; WHILE (i<length) PLOT(INTEGER(x), INTEGER(y)); x=x+dx; y=y+dy; i=i+l; END WHILE END 其中,函数SIGN ( )是符号函数,其表达式为: 用DDA算法表示的直线如图3.3所示。 3.2.3 Bresen
文档评论(0)