基本思想:
按直线从起点到终点的顺序计算直线与和垂直网线格的交点,然会根据误差项的符号确定该列像素中与此点最近的像素。
误差项的计算:
- d0=0;
- 每走一步:d(i+1)=di+k(斜率);
- y方向+1时,d=d-1;
算法步骤:
4. 输入直线的两个端点p0(x0,y0)和p1(x1,y1).
5. 计算初始值🔺x,🔺y, d=0,x=x0,y=y0;
6.绘制点(x,y);
7.d 更新为d+k,判断d的符号。若d>0.5,则(x,y)更新为(x+1,y+1), 同时d更新为 d-1;否则(x,y)更新为(x+1,y)
8,当直线没有画完时,重复步骤6,7。
算法改进1:
令 e=d-0.5;
e初=-0.5;
每走一步有 e=e+k;
if(e>0) then e=e-1
判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-1; 否则(x,y)更新为(x+1,y);
由于 含有浮点运算(k=🔺x/🔺y)
再次改进:
2e🔺x 代替e
e初=-🔺x
每走一步 e=e+2🔺y;
if(e>0) then e=e-2🔺x;
void line(int x0,int y0,int x1,int y1)
{
int x,y,dx,dy,e;
y=y0;
dx=x1-x0;
dy=y1-y0;
e=-dx;
for(x=x0;x<=x1;x++)
{
pDC->Setpixel(x,y,RGB);
if(e<0){
e=e+2🔺y;
}
else{
y++;
e=e-2🔺x;
}
}
}