3.1 直线段的扫描转换算法:
3.1.1 概述
直线段的扫描转换:
确定最佳逼近于该直线的一组像素,并且按扫描线顺序,对这些像素进行写操作。
3.1.2 数字微分分析法(Digital Differential Analyzer):
基本方法:
解直线的微分方程,求解出一个斜率k = dy/dx。
其有限差分近似解:
y下标i+1 = y下标i + y的增量;
y的增量 = k*x的增量。
基本步骤:
1、计算斜率k。
2、计算y(i+1) = y(i) + k*x的增量。
当x的增量 = 1;y(i+1) = y(i) + k。
即:当x每递增1,y递增k。
注:上述算法仅适用于abs(k)的值小于1的情形;当abs(k)>1必须把x,y地位互换。
算法描述(伪代码):
if abs(x2-x1) >= abs(y2-y1) then
Length = abs(x2 - x1)
Else
Length = abs(y2 - y1)
End if
x的增量为 = (x2 - x1)/Length
y的增量为 = (y2 - y1)/Length
x = x1 + 0.5
y = y1 + 0.5
i = 1
While(i <= Length)
Setpixel(int(x), int(y))
x = x + x的增量
y = y + y的增量
i = i+1
End while
Finsh
解释:
Length为x2-x1与y2-y1中最大的那个值,为什么x的增量要写成(x2-x1)/Length,当Length = (x2 - x1)时,x每次增一,反之,每次增k。这样便实现了一个算法对两种情况的处理。
x = x1 + 0.5,与int(x)结合实现取整。
i——循环控制条件。
缺点:
1、取整运算;
2、浮点计算。
3.1.3 中点画线法:
基本思想:
当前像素点为(xp,yp)。下一像素点为P1或P2。设M = (xp+1,yp+0.5),为p1与p2之中点,Q为理想直线与x = xp+1垂线的交点。将Q与M的y坐标进行比较。
当M在Q下方时,P2为下一个像素点;M在Q的上方,应取P1为下一点。
基本步骤:
对于直线段L,其起点Ps(x0,y0),终点Pe(x1,y1)
构造判别式:d = F(M) = F(xp+1,yp+0.5) = a(xp+1) + b(yp+0.5) + c;
a = y0 - y1;b = x1 - x0; c = x0y1 - x1y0.
d<0时:M在下方,则P2为下一像素点;
否则,P1为下一像素点。
d是xp,yp的线性函数,因此可采用增量计算,提高计算效率。
当d>=0时,d1 = d+a,增量为a;
当d<0时,d2 = d+a+b,增量为a+b。
d的初值为 a+0.5b。
可乘2来摆脱小数。