光栅图形学要点.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
光栅图形学要点

包装计算机辅助设计 第三章 光栅图形学 §3.1 直线的生成算法 一、数值微分法(DDA) 1.原理 过起点Ps(xs , ys)和终点Pe(xe , ye)画一条直线段L, 直线的斜率为k,则: 从起点Ps开始,到Pe结束。x轴方向的步长为1个像 素,按y=kx+b计算相应的y坐标,并取像素点(x,round(y)) 作为当前点的坐标。 §3.1 直线的生成算法 2.程序 LineWithDDA(int xs, int ys, int xe, int ye, int color) { float x, y, delta_x, delta_y; int dx, dy, steps, k; dx = xe - xs; dy = ye - ys; if (fabs(dx) fabs(dy)) steps = fabs(dx); else steps = fabs(dy); §3.1 直线的生成算法 delta_x = (float)dx / (float)steps; delta_y = (float)dy / (float)steps; x=xs; y=ys; putpixel((int)x, (int)y, color); for(k=0; ksteps; k++) { x + = delta_x; ? ?y + = delta_y; ? ?putpixel((int)(x + 0.5), (int)(y + 0.5), color);} getch( ); } §3.1 直线的生成算法 3.示例 用DDA法扫描转换连接(0,0)和(5,2)两点的直线段。 §3.1 直线的生成算法 二、中点画线法 1.原理 当前像素点为P(xp,yp),则下一个像素点有两种选 择:P1(xp+1,yp)或P2(xp+1,yp+1)。M为P1与P2的中点,Q 为理想直线与x=xp+1的交点。 §3.1 直线的生成算法 当M在Q的上方时,应取P1为下一个像素点;当M在 Q的下方时,P2应为下一个像素点。当M与Q重合时,取 P1或P2为下一个像素点均可,约定取P2。 将起点为Ps(xs,ys)和终点Pe(xe,ye)的直线段L用如下 方程表示:F(x,y)= ax + by + c = 0。 其中,a = ys - ye,b = xe - xs ,c = xsye - xeys 。 F(M)= 0,M点在直线上,取P2 ; F(M) 0,M点在直线的上方,取P1 ; F(M) 0,M点在直线的下方,取P2 ; §3.1 直线的生成算法 构造判别式: d = F(M)= F(xp+1,yp+0.5)= a(xp+1)+ b(yp+0.5)+ c 若d0 ,则取P1(xp+1,yp),判断下一个像素的位置 时,应计算d1=F(xp+2,yp+0.5)=d+a,增量为a。 若d≤0 ,则取P2(xp+1,yp+1),判断下一个像素的位 置时,应计算d2=F(xp+2,yp+1.5)=d+a+b,增量为a+b。 d的初值: d0 = F(xs+1,ys+0.5)= F(xs,ys)+ a + 0.5b = a + 0.5b 由于只用d的符号,且d的增量都是整数,可用2d来 代替d。 §3.1 直线的生成算法 2.程序 LineWithMidPoint(int xs, int ys, int xe, int ye, int color) { int a, b, d1, d2, d, x, y; a = ys - ye; b = xe - xs; d = 2*a + b; d1 = 2*a; d2 = 2*(a+b); x=xs; y=ys; §3.1 直线的生成算法 putpixel(x, y, color); while(xxe) { if(d0) { x=x

文档评论(0)

little28 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档