简化策略
可以通过判断Dx、Dy的值是>0、=0、<0来将整个平面分成四个象限和四个轴向,轴向能被包含进象限。
又可以通过比较|Dx|、|Dy|,将一个象限分成两部分。
简化策略选取第一象限且|Dx|>=|Dy|的部分,考虑直线的绘制方法。

绘制流程
直线倒向x轴,因此可以认为x到y为单射,取绘制顺序x从x1到x2。
由于是光栅,点(x1,y1)代表了整个格子而非格点,同时建系认为(x1,y1)是格点中心。
于是光栅上(x1,y1)已经涂色,而x1+1可能对应涂黑y1或y1+1。
直线上x1+k对应y1+kDy/Dx,对于k=1,可能的判据就是Dy/Dx>=1/2;对于k=2,则判据可能为2Dy/Dx>=1/2或2Dy/Dx>=3/2;……
很明显的,判据具有a*Dy/Dx>=(2b-1)/2的形式,且判定成功一次则b+=1,而a=k。

初始化判据,绘制第一个像素
k从1开始,直到x1+k=x2
如果判据得到真
修改判据右侧(即b),绘制右上
如果判据得到假
绘制右侧
k+=1,由于a=k,也修改了判据
算法实际进行的改进
判据a*Dy/Dx>=(2b-1)/2实际上就是a*2Dy-(2b-1)Dx>=0,在k=1时判据为2Dy-Dx>=0,若判定成功则判据变为4Dy-3Dx>=0,否则变为4Dy-Dx>=0。
判据为e>=0,实际上就是判定成功则e+2(Dy-Dx),否则e+2Dy。
解释那张图

是第四象限,且|Dx|>=|Dy|。m=Dy/Dx,是增量。

x从x1到x2,而y初始化为y1,实际上设置的是下一次(即循环第一次)的绘制点,可以看成是在循环前做了初始化
绘制(x,y)
如果增量e+m超过了判据,即-0.5的位置
绘制目标往下挪一格,y <- y-1
修改判断条件往下一格,判据e+2m>=-1.5其实就是(e+m+1)+m>=-0.5,也满足了判据右边不变
如果增量没有超过判据
绘制目标不动,还在y
判断条件没改所以用的是(e+m)+m>=-0.5
comment 评论区
star_outline 咱快来抢个沙发吧!