计算机图形学主要算法总结.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2.1.1 生成直线的DDA算法   数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。   一、直线DDA算法描述:   设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得 = m =直线的斜率 (2-1)   可通过计算由x方向的增量△x引起y的改变来生成直线: xi+1=xi+△x (2-2) yi+1=yi+△y=yi+△x·m (2-3)   也可通过计算由y方向的增量△y引起x的改变来生成直线: yi+1=yi+△y (2-4) xi+1=xi+△x=xi+△y/m (2-5)   式(2-2)至(2-5)是递推的。   二、直线DDA算法思想:   选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(△x=1),然后利用式(2-1)计算另一个方向的增量(△y=△x·m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(xi+1,yi+1)经取整后送到显示器输出,则得到扫描转换后的直线。   之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。   另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。   三、直线DDA算法实现:   1、已知直线的两端点坐标:(x1,y1),(x2,y2)   2、已知画线的颜色:color   3、计算两个方向的变化量:dx=x2-x1                dy=y2-y1   4、求出两个方向最大变化量的绝对值:                steps=max(|dx|,|dy|)   5、计算两个方向的增量(考虑了生成方向):                xin=dx/steps                yin=dy/steps   6、设置初始象素坐标:x=x1,y=y1   7、用循环实现直线的绘制:     for(i=1;i=steps;i++)     { putpixel(x,y,color);/*在(x,y)处,以color色画点*/      x=x+xin;      y=y+yin;     }   五、直线DDA算法特点:   该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。 2.1.2 生成直线的Bresenham算法   从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的生成速度较慢。   在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。   一、直线Bresenham算法描述:   它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个象素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个象素。   我们首先讨论m=△y/△x,当0≤m≤1且x1x2时的Bresenham算法。从DDA直线算法可知这些条件成立时,公式(2-2)、(2-3)可写成: xi+1=xi+1 (2-6) yi+1=yi+m (2-7)   有两种Bresenham算法思想,它们各自从不同角度介绍了Bresenham算法思想,得出的误差判别式都是一样的。   二、直线Bresenham算法思想之一:   由于显示直线的象素点只能取整数值坐标,可以假设直线上第i个象素点坐标为(xi,yi),它是直线上点(xi,yi)的最佳近似,并且xi=xi(假设m1),如下图所示。那么,直线上下一个象素点的可能位置是(xi+1,yi)或(xi+1,yi+1)。   由图中可以知道,在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2: d1=y-yi=m(xi+1)+b-yi (2-8) d2=(yi+1)-y=(yi+1)-m(xi+1)-b (2-9)   这两个距离差是 d1-d2=2m(xi+1)-2yi+2b-1 (2-10)   我们来分析公式(2-10):   (1)当此值为正时,d1d2,说明直线上理论点离(xi+1,yi+1)象素较近,下一个象素点应取(xi+1,yi+1)。   (2)当此值为负时,d1d2,说明直线上理论点离(xi+1,yi)象素较近,则下一个象素点应取(xi+1,yi)。   (3)当此值为零时,说明直线上理论点离上、下两个象素点的距离相等,取哪个点都行,假设算法规定这种情况下取(xi+1,yi+1)作为下一个象素点。   因此只要利用(d1-d2)

文档评论(0)

zhuliyan1314 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档