直线扫描转换算法

数学上,直线的点有无穷多个,但是在计算机光栅显示器屏幕上表示直线时需要做一些处理。
用有限的像素去逼近直线上无限的点。

这里写图片描述
为了在光栅显示器上用有限的离散的像素点去逼近这条直线,我们需要知道像素点的x、y坐标。
求出过p0、p1的直线段方程:(斜截式)
y=kx+b
k=(y1-y0)/(x1-x0) (x1≠x0)
假设x一直,即从x的起点x0开始,沿x方向向前前进一个像素(步长=1)可以计算出相应的y。
因为像素的坐标是整数,所以y需要进行取整处理。
这里写图片描述
为了减小误差,我们对y+0.5处理,再进行取整。
直线是最基本的图形,一个动画或者真实感图形往往需要调用成千上万次画线程序,因此直线算法的好坏与效率直接影响图形的质量和显示速度。
为了提高效率,把计算量减下来,关键是如何将y=kx+b中的乘法取消

直线绘制的三个常用算法
1.数值微分法 DDA算法
2.中点画线法
3.Bresenham算法

1、数值微分法(Digital Differential Analyzer)
这里写图片描述

数值微分法(DDA算法)采用增量思想,直观、易实现,每计算一个像素坐标,只需要计算几个加法。
y(i+1)=y(i)+k

如何改进?
改进效率:一般情况下k与y都是小数,而且每一步运算都要对y进行四舍五入后取整。
1.改进途径是将浮点运算变成整数加法。
2.直线方程有很多类型,如两点式、斜截式、一般式等。

中点画线法——直线的一般式方程

F(x,y)=0
Ax+By+C=0
这里写图片描述

每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于中点误差项的判断。
这里写图片描述

如何判断Q在M上方还是下方?
将M带入理想方程F(xm,ym)=Axm+Bym+C
d=F(xm,ym)
当d<0,M在Q的下方选pu
当d>0,M在Q的上方选pd
当d=0,M在直线上,选pd或pu都可以

中点画线算法计算量:
这里写图片描述
为求出d值,需要两个乘法,四个加法。

但是d是x,y的线性函数,采用增量计算是可行的。
如何推导出d值的递推函数?
这里写图片描述
可知d0=A(xi+1)+B(yi+0.5)+C
根据中点画线算法,d1有两种可能:
y:= |y+1 (d<0)
|y (d≥0)
这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述
至此,中点算法至少可以和DDA算法一样好。
另外可以用2d代替d来摆脱浮点运算,写出仅包括整数运算的算法。

DDA把算法效率提高到每步只做一个加法
中点画线算法进一步将效率提高到每一步只做一个整数加法

Bresenham提供了一个更一般的算法,该算法不仅有好的效率而且还有更广泛的适用范围。
基本思想:
这里写图片描述
该算法思想是通过各行、各列像素中心构造一组虚拟网格线,按照直线起点到终点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列像素点中与此交点最近的元素。
这里写图片描述

这里写图片描述

这里写图片描述
关键是把这个算法的效率也搞到整数加法,否则就是失败。

改进1:令e=d-0.5
这里写图片描述
这里写图片描述
这里写图片描述

Bresenham算法很像DDA算法,都是加斜率
但是DDA算法是每次求出一个新的y以后取整画而Bresenham算法是判别符号来决定上下两点,而且应用范围不拘束于直线的方程形式。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值