Bresenham算法:
过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。
注:注意水平线,垂直线
struct Point
{
float x;
float y;
};
float C计算机图形学View::Check(float x1,float y1,float x2,float y2,float k)
{
float temp=0;
temp=(y2-y1)-(x2-x1)*k;
return temp;
}
Point pointA,pointB; //Bresenham
pointA.x=10;
pointA.y=20;
pointB.x=100;
pointB.y=200;
float x1,y1,x2,y2;
float num=0;
float temp=0;
float A=pointB.x-pointA.x;
float B=pointB.y-pointA.y;
float k=B/A;
HDC hDC;
hDC=::GetDC(m_hWnd);//通过窗口句柄得到该窗口的设备场境句柄
x1=pointA.x;
y1=pointA.y;
x2=pointA.x;
y2=pointA.y;
if(fabs(k)>=1)
{
num=pointB.y;
if(A>=0&&B>=0)
while(y2<=num)
{
if(Check(x1,y1,x2+0.5,y2+1,k)>=0)
{
x2++;y2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
y2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
else
if(A<0&&B<0)
while(y2>=num)
{
if(Check(x1,y1,x2-0.5,y2-1,k)>=0)
{
y2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
y2--;x2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
else
if(A>=0&&B<=0)
while(y2>=num)
{
if(Check(x1,y1,x2+0.5,y2-1,k)>=0)
{
y2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
y2--;x2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
else
while(y2<=num)
{
if(Check(x1,y1,x2-0.5,y2+1,k)>=0)
{
y2++;x2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
y2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
}
else
{
num=pointB.x;
if(A>=0&&B>=0)
while(x2<=num)
{
if(Check(x1,y1,x2+1,y2+0.5,k)>=0)
{
x2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
y2++;x2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
else
if(A<0&&B<0)
while(x2>=num)
{
if(Check(x1,y1,x2-1,y2-0.5,k)>=0)
{
y2--;x2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
x2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
else
if(A>=0&&B<=0)
while(x2<=num)
{
if(Check(x1,y1,x2+1,y2-0.5,k)>=0)
{
y2--;x2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
x2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
else
while(x2>=num)
{
if(Check(x1,y1,x2-1,y2+0.5,k)>=0)
{
x2--;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
else
{
x2--;
y2++;
SetPixel(hDC,x2,y2,RGB(0,0,255));
}
}
}