基本原理
在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1)。若M=(xp +1,yp +0.5)为P1与P2之中点,Q为P理想直线与x=xp +1垂线的交点。当M在Q的下方,则P2应为下一个像素点;M在Q的上方,应取P1为下一个像素点。
在斜率0<=k<=1的时候,实现代码如下(书本代码):
void MidpointLine( int x0, int y0, int x1, int y1, int color)
{
int a,b,d1,d2,d,x,y;
a=y0-y1,b=x1-x0,d=2*a+b;
d1=2*a,d2=2*(a+b);
x=x0,y=y0;
Drawpixel(x,y,color);
while (x<x1)
{
if (d<0)
{ x++,y++,d+=d2;}
else
{ x++,d+=d1; }
Drawpixel(x,y,color);
}
}
对于其他斜率,我们可以推出如下关系:
实现代码如下:
void MidpointLine(int x0,int y0,int x1,int y1,int color) { int a,b,d1,d2,d,x,y;float m;if (x1<x0){d=x0,x0=x1,x1=d;d=y0,y0=y1,y1=d;} a=y0-y1,b=x1-x0;if (b==0) m=-1*a*100; else m=(float)a/(x0-x1);x=x0,y=y0; Drawpixel(x,y,color); if (m>=0 && m<=1) {d=2*a+b;d1=2*a,d2=2*(a+b); while (x<x1) { if (d<=0) { x++,y++,d+=d2;} else { x++,d+=d1; } Drawpixel(x,y,color); }} else if (m<=0 && m>=-1) {d=2*a-b;d1=2*a-2*b,d2=2*a; while (x<x1) { if (d>0) { x++,y--,d+=d1;} else { x++,d+=d2; } Drawpixel(x,y,color); } } else if (m>1) {d=a+2*b;d1=2*(a+b),d2=2*b; while (y<y1) { if (d>0) { x++,y++,d+=d1;} else { y++,d+=d2; } Drawpixel(x,y,color); } } else {d=a-2*b;d1=-2*b,d2=2*(a-b); while (y>y1) { if (d<=0) { x++,y--,d+=d2;} else { y--,d+=d1; } Drawpixel(x,y,color); }} }
备注:Drawpixel(x,y,color);是pDC->SetPixel(x,y,crColor);的意思