- 1、本文档共97页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 基本图形的生成算法 基本图形的生成算法 直线的生成算法 画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这过程也称为直线光栅化。 常见算法: DDA算法 Bresenham算法 直线的生成算法 连续性 粗细、亮度要均匀 像素逼近待画直线 速度 直线DDA算法 (Digital Differential Analyser) 假设 直线的起点坐标为P0 (x0,y0),终点坐标为P1 (x1,y1),x方向的增量为 △x=x1-x0 ;y方向上增量为 △y=y1-y0,直线的斜率为:m=△y/△x 当 △x>△y 时,让 x 从 x0 到 x1 变化,每步递增 1,那么,x 的变化可以表示为 xi+1=xi+1,y 的变化可以表示为 yi+1=yi+k 特别注意显示时:要四舍五入 round(yi+1)=(int)(yi+1+0.5) 找到最靠近交点处的象素点来表示。 当 △x△y 时,让 y 递增 1,x作相应变化。 round(xi+1)=(int)(xi+1+0.5) 直线DDA算法 (Digital Differential Analyser) 直线DDA算法 (Digital Differential Analyser) 研究表中的数据,可以发现两个规律: 当?dx??dy?时( △x >△y ) ?Dx? = 1,?Dy? = m 否则( △x =△y ) ?Dx? = 1/m,?Dy? = 1 Dx、Dy的符号与dx、dy的符号相同。 直线DDA算法 (Digital Differential Analyser) 直线DDA算法 (Digital Differential Analyser) 问题:当直线不在第一象限? 第三象限? 第二、四象限( △x 与△y符号相反 )? 完善的算法: 设sign(dx)、sign(dx)为符号,则: x=x0+0.5*sign(dx); y=y0+0.5*sign(dy); 循环中: putpixel(int(x),int(y),color); 直线DDA算法 (Digital Differential Analyser) 综合考虑,按照从(x1, y1)到(x2, y2)方向不同,分8个象限(图2.1)。对于方向在第1a象限内的直线而言,取增量值Dx=1,Dy=m。对于方向在第1b象限内的直线而言,取增量值Dy=1,Dx=1/m。 直线DDA算法 (Digital Differential Analyser) DDA算法的缺点 X,Y用float, 并四舍五入, 不利于硬件实现 直线Bresenham算法 设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为: 方程 y=mx+b,其中 b=y1-m*x1 ,m=(y2-y1)/(x2-x1)=dy/dx; 此处的讨论先将直线方向限于1a象限, xi+1 = xi + 1(y的相应增加值应当小于1) yi+1 = yi + 1或者yi 直线Bresenham算法 Y=m(xi+1)+b d1=y-yi d2=yi+1-y d1-d2=2dy(xi+1)/dx-2yi+2b-1 两边同时乘以dx,将Pi=(d1-d2)dx带入 Pi=2xidy-2yidx+2dy+(2b-1)dx Pi+1=Pi+2dy-2(yi+1-yi)dx Pi的初值为 P1=2dy-dx 直线Bresenham算法 综述上面的推导,第1a象限内的直线中点Bresenham算法思想如下: ⒈ 画点(x0, y0),dx=x1?x0,dy=y1?y0,计算误差初值 d=dx-2dy,i=1; ⒉ 求直线的下一点位置 xi+1 = xi + 1 如果di=0,则yi+1=yi+1, 否则yi+1=yi; ⒊ 画点(xi+1, yi+1); ⒋ 求下一个误差di+1,如果di0,则di+1=di+ 2dx ? 2dy ,否则 di+1=di-2dy; ⒌ i=i+1;如果idx+1则转步骤2;否则结束操作。 直线Bresenham算法 void midBresenhamline(int x0, int y0,int x1,int y1) { …… //变量声明 if(x0x1) …… // 交换两个端点坐标 x=x0;y=y0; dx=x1-x0; dy=y1-y0; d=dx-2dy; up=2*dx-2dy; down=-2dy; while(x=x1) { putpixel(x,y,
文档评论(0)