}
//畫線函數,使用Bresenham 畫線算法
void Gui_DrawLine(u16 x0, u16 y0,u16 x1, u16 y1,u16 Color)
{
int dx, // difference in x's
dy, // difference in y's
dx2, // dx,dy * 2
dy2,
x_inc, // amount in pixel space to move during drawing
y_inc, // amount in pixel space to move during drawing
error, // the discriminant i.e. error i.e. decision variable
index; // used for looping
Lcd_SetXY(x0,y0);
dx = x1-x0;//計算x距離
dy = y1-y0;//計算y距離
if (dy>=0)
{
y_inc = 1;
}
else
{
y_inc = -1;
dy = -dy;
}
dx2 = dx << 1;
dy2 = dy << 1;
if (dx > dy)//x距離大于y距離,那么每個x軸上只有一個點,每個y軸上有若干個點
{//且線的點數等于x距離,以x軸遞增畫點
// initialize error term
error = dy2 - dx;
// draw the line
for (index=0; index <= dx; index++)//要畫的點數不會超過x距離
{
//畫點
Gui_DrawPoint(x0,y0,Color);
// test if error has overflowed
if (error >= 0) //是否需要增加y坐標值
{
error-=dx2;
// move to next line
y0+=y_inc;//增加y坐標值
} // end if error overflowed
// adjust the error term
error+=dy2;
// move to the next pixel
x0+=x_inc;//x坐標值每次畫點后都遞增1
} // end for
} // end if |slope| <= 1
else//y軸大于x軸,則每個y軸上只有一個點,x軸若干個點
{//以y軸為遞增畫點
// initialize error term
error = dx2 - dy;
// draw the line
for (index=0; index <= dy; index++)
{
// set the pixel
Gui_DrawPoint(x0,y0,Color);
// test if error overflowed
if (error >= 0)
{
error-=dy2;
// move to next line
x0+=x_inc;
} // end if error overflowed
// adjust the error term
error+=dx2;
// move to the next pixel
y0+=y_inc;
} // end for
} // end else |slope| > 1
}