此方法利用了直线方程的一般式
假设直线方程为:f(x,y)=ax+by+c;
(1) f(x,y)=0, 点在直线上面
(2) f(x,y)>0, 点在直线上方
(3) f(x,y)<0, 点在直线下方
构造判别式: d=f(m)=f(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c
由d来判断点在直线的上方还是下方。
当d<0, m在直线(Q点)下方,焦点Q 更靠近P2 取p2;
当d>0, m在直线(Q点)上方,焦点Q 更靠近P1 取p1;
当d=0, P1,p2都可以取;
(1)d>=0, p1(xp+1,py);
d1=f(xp+1+1,yp+0.5);
d1=a(xp+2)+b(yp+0.5)+c;
d1=axp+2a+byp+b+c;
d1=d+a;
(2)d<0, p2(xp+1,yp+1);
d2=f(xp+1+1,yp+1.5)
d2=a(xp+2)+b(yp+1.5)+c
d2=axp+2a+byp+b+c
d2=d+a+b
d的初始值 d0=f(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c
d0=f(x0,y0)+a+0.5b
d0=a+0.5b
由于有浮点出现,不满足高质量直线的要求
改进:将2d 代替d 来摆脱小数,提高效率。
即 d0=2a+b;
1.输入直线的两端点p0(x0,y0)和p1(x1,y1).
2.计算初始值a=y0-y1, b=x1-x0,d=2a+b; x=x0,y=y0,
d1=2a, d2=2(a+b)
代码
void line(int x0,int y0,int x1,int y1)
{
int x,y,d0,d1,d2,a,b;
y=y0;
a=y0-y1;
b=x1-x0;
d0=2*a+b; //初始增量
d1=2*a; //d>=0 的增量(2*d1-2*d0)
d2=2*(a+b);//d<0 的增量(2*d2-2*d0)
for(x=x0;x<=x1;x++)
{
pDC->(x,y,RGB());
if(d0<0){
y++;
}
else{
d0=d0+d1;
}
}
}