直线扫描转换算法
来源:互联网 发布:f.lux for mac 编辑:程序博客网 时间:2024/06/05 06:25
数学上,直线的点有无穷多个,但是在计算机光栅显示器屏幕上表示直线时需要做一些处理。
用有限的像素去逼近直线上无限的点。
为了在光栅显示器上用有限的离散的像素点去逼近这条直线,我们需要知道像素点的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算法是判别符号来决定上下两点,而且应用范围不拘束于直线的方程形式。
- 直线扫描转换算法
- 直线段扫描转换算法
- 直线段扫描转换算法-Bresenham算法
- 扫描转换直线段--DDA算法
- 直线扫描转换(DDA画线算法)
- 直线段的扫描转换算法
- 直线扫描转换算法-中点画线法
- 直线的扫描转换
- 直线扫描算法
- 直线扫描---Bresenham算法
- 图形学笔记1——直线段扫描转换算法
- 光栅图形学——直线段的扫描转换算法
- 直线的扫描转换-中点线算法推导
- 直线段扫描转换算法-数值微分法(DDA)
- 计算机扫描直线Bresenham算法
- 计算机图形学基础 : 基本图形生成算法之直线的扫描转换
- 计算机图形学——直线的三种扫描转换算法
- 直线生成算法的实现:分别利用DDA算法、中点Bresenham算法和改进的Bresenham算法扫描转换直线段P1P2
- STL-transform算法
- JackSon学习笔记(一)
- 复数类
- 软件质量模型
- C语言,C++所忽视掉的一般数据的类型
- 直线扫描转换算法
- ubuntu14.04-Ros-indigo下配置Eigen库,亲测好用!!!
- CodeForces 600C
- 解决VS2005 VS2008 vs2010断点无效-源代码与原始版本不同
- 欢迎使用CSDN-markdown编辑器
- Web前端性能优化策略
- mac上mysql中文乱码问题
- 职称论文发表途径
- HDU 1045 Fire Net