|
发表于 2009-5-18 12:12:30
|
显示全部楼层
void LCD_BufferDrawLine(u8 x1, u8 y1, u8 x2, u8 y2, DrawMode mode)
{
u8 x, y, t;
int dx, dy, d, incrE, incrNE;
if( y1 > y2)
{
t = x1, x1 = x2, x2 = t;
t = y1, y1 = y2, y2 = t;
}
dx = x2 - x1;
dy = y2 - y1;
x = x1, y = y1;
if( 0 == dx )
{
LCD_BufferDrawYLine(x1, y1, dy, mode);
}
else if( 0 == dy )
{
if( x1 > x2 )
LCD_BufferDrawXLine(x2, y2, dx, mode);
else
LCD_BufferDrawXLine(x1, y1, dx, mode);
}
else
{
// Bresenham Midpoint Line
if( abs(dx) > abs(dy) )
{
if( x2 > x1)
{
// 0 < k < 1
d = 2 * dy - dx;
incrE = 2 * dy;
incrNE = 2 * (dy - dx);
while( x < x2 )
{
LCD_BufferDrawPixel(x, y, mode);
x++;
if( d > 0 )
{
y++;
d += incrNE;
}
else
d += incrE;
}
LCD_BufferDrawPixel(x, y, mode);
}
else
{
// -1 < k < 0
d = -2 * dy - dx;
incrE = -2 * dy;
incrNE = -2 * (dy + dx);
while( x > x2)
{
LCD_BufferDrawPixel(x, y, mode);
x--;
if( d < 0 )
{
y++;
d += incrNE;
}
else
d += incrE;
}
LCD_BufferDrawPixel(x, y, mode);
}
}
else
{
if( x2 > x1)
{
// k > 1
d = dy - 2 * dx;
incrE = -2 * dx;
incrNE = 2 * (dy - dx);
while( y < y2 )
{
LCD_BufferDrawPixel(x, y, mode);
y++;
if( d < 0 )
{
x++;
d += incrNE;
}
else
d += incrE;
}
LCD_BufferDrawPixel(x, y, mode);
}
else
{
// k < -1
d = -dy - 2 * dx;
incrE = -2 * dx;
incrNE = -2 * (dy + dx);
while( y < y2 )
{
LCD_BufferDrawPixel(x, y, mode);
y++;
if( d > 0 )
{
x--;
d += incrNE;
}
else
d += incrE;
}
LCD_BufferDrawPixel(x, y, mode);
}
}
}
dirty = 1;
} |
|