画线算法
1. 计算机画线
真实的直线应该是连续的,但是计算机不可能显示出完全连续平滑的直线,于是计算机用一系列 离散化的像素点 来表示直线
(《计算机图形学的概念与方法》柳朝阳)
2. 常用画线算法
2.1 DDA算法
DDA是一种基于直线的 微分方程 来生成直线的方法
基本的直线微分:
dydx=k 跟据步长(也即像素数目)即可计算出
x,y 坐标:
步长取Stepx:yi+1=yi+k
OR
步长取Stepy:xi+1=xi+1k 其中步长取
Stepx 还是Stepy
考虑两端点之间水平距离|Δx|=|x2−x1| 与竖直距离|Δy|=|y2−y1|
绝对值大 的确定步长从起始位置
(x1,y1) 开始, 按照步长,沿线段路径计算每一步下一个像素的位置调整每一步的
x 和y ,逐一绘制余下像素。
DDA算法 比起根据 直线方程计算离散取样 的方法省去了乘法,加快了计算。
但是 取整操作 与 浮点运算 仍然十分费时。
2.2 Bresenham算法
该算法仅使用增量整数计算
Bresenham通过计算两像素与实际线段的偏移比值的整型参数的符号比较来确定所取像素
当斜率K大于1时,在Y方向上以单位步长移动,计算x值,
当斜率在0到1 之间时,在X方向上以单位步长移动。其中步长取
Stepx 还是Stepy
考虑两端点之间水平距离|Δx|=|x2−x1| 与竖直距离|Δy|=|y2−y1|
绝对值大 的确定步长设 |k|<1 ,第k步时,
(xk,yk) 开始,判断下一位置取(xk+1,yk) 还是(xk+1,yk+1) ,假设dlower 和dupper 来表示两个像素与数学上线段路径的垂直偏移
且
要确定两像素中哪一个更接近线路经,作差
可以继续推导出:
由
|k|<1时,Bresenham画线算法具体步骤如下:
- 输入线段的两个端点,存储左端点在
(x0,y0) 中; - 将
(x0,y0) 装入帧缓存,画出第一个点; - 计算常量
Δx,Δy,2Δy,2Δy−2Δx , 得到第一个决策参数
p0=2Δy−Δx - 从
i=0 开始,在沿线段路径的每个xi 处进行下列检测:
如果pk<0 ,下一个要绘制的点为(xi+1,yi) , 并且pi+1=pi+2Δy
否则,下一个要绘制的点为(xi+1,yi+1) , 并且pi+1=pi+2Δy−2Δx - 重复步骤4, 共
Δx−1 次。