已知过端点P0(x0, y0), P1 (x1, y1)的直线段; 直线斜率k = (y1-y0) / (x1-x0) .
画线过程为: 从x的左端点x0开始,向x右端点 步进,步长=1(像素),按y=k x + b 计算相应的y坐标,并去像素点(x, round (y) )作为当前点的坐标。
可以提高效率:
设步长为Δx, 有x i+1 = xi +Δx, 于是: yi+1=kxi+1 +b = kxi + kΔx +b= yi +kΔx
当Δx=1时, 有yi+1 = yi +k 。 这样计算每一点,只需做一次加法运算。
note:
round (y) = int (y+0.5), 当K>1时,必须把x, y的地位互换:y增加1,x相应增加1/k。
缺点:由于y与k须用浮点数表示,每一步都要对y进行四舍五入后取整,使得该算法不利于硬件实现。
改进
目标:进一步将一个加法改为一个整数法加。
中点画线法:
通过观察发现,在画线段的过程中,当前像素点为(xp, yp),下一个像素点有两种选择P1(xp+1, yp)和P2(xp+1, yp+1)。若M=(xp+1, yp+0.5)为P1和P2之间中点。Q为理想直线与x = xp +1垂线的交点。 则当M在Q的下方时,P2为下一个像素点;当M在Q的上方时,应取P1为下一点。(如下图)
对直线段L(p0(x0, y0), p1(x1, y1) ),采用方程
F (x, y ) = ax+by+c = 0 表示,其中 a = y0 – y1,
b = x1 - x0 , c = x0y1 – x1y0