原理
以各行、各列像素中心构造虚拟网格线,求直线从起点到终点的直线与网格线的交点,然后确定该列像素中与此交点最近的像素点。
该算法的优点在于使用增量计算,使得只需要检查误差项的符号,就可以确定需要绘制的点。
代码
void BresenhamLine(int x0,int y0,int x1,int y1)
{
HWND myconsole = GetConsoleWindow();
HDC mydc = GetDC(myconsole);
COLORREF COLOR= RGB(255,0,0);
int dx,dy,e=0,k,q,p;
dx=x1-x0;
dy=y1-y0;
if(x0>x1) {int tmp; tmp=x0; x0=x1;x1=tmp;t=y0; y0=y1;y1=tmp;}
dx=x0;
dy=y0;
if(x0==x1)
{
if(y1>=y0){
for(int n=0;n<(y1-y0);n++)
{
SetPixel(mydc,x0,y0+n,COLOR);
}
}else for(int n=0;n<(y0-y1);n++)
{
SetPixel(mydc,x0,y1+n,COLOR);
}
}
else
{
k=(y1-y0)/(x1-x0);
p=k;
q=k-p;
if(k>=0)
{
SetPixel(mydc,x0,y0,COLOR);
for(int i=0;i<(x1-x0);i++)
{
dx=dx+1;
e=e+q;
if(e>=1) e=e-1;
if(e<=0.5) dy=dy+p;
if(e>0.5) {dy=dy+p+1;e=e-1;}
SetPixel(mydc,dx,dy,COLOR);
}
}
else if(k<0)
{
SetPixel(mydc,x0,y0,COLOR);
for(int i=0;i<(x1-x0);i++)
{
dx=dx+1;
e=e+q;
if(e<=-1) e=e+1;
if(e>=-0.5) dy=dy+p;
if(e<-0.5) {dy=dy+p-1;e=e+1;}
SetPixel(mydc,dx,dy,COLOR);
}
}
}
ReleaseDC(myconsole, mydc);
cin.ignore();
}