直线算法
发布日期:2011-11-6 13:23:56
直线算法
/*!
\brief 使用改进Bresenham算法-对称直线算法绘画直线/斜线
\param x0,y0 直线起点坐标
\param x1,y1 直线终点坐标
*/
Err gdiDrawSurface::DrawLine(int x0, int y0, int x1, int y1, gdiColor c)
{
/* all not in screen, user can't see it*/
if( (x0 < 0 && x1 < 0)||(x0 > pvSize.Width - 1 && x1 > pvSize.Width - 1) ||
(y0 < 0 && y1 < 0)||(y0 >= pvSize.Height -1 && y1 >= pvSize.Height - 1))
return errSurfacePostionOverflow;
int sx,sy; // 起点
int ex,ey; // 终点
int dx,dy;
int dx2,dy2;
int e, half;
//设置起点终点
if(x0 < x1){
sx = x0; sy = y0;
ex = x1; ey = y1;
}else{
sx = x1; sy = y1;
ex = x0; ey = y0;
}
dx = ex - sx; dy = ey - sy;
dx2 = (dx << 1); dy2 = dy << 1;
e = dy2 - dx; // 决策量
half = ((dx+2) >> 1);
if(dy2 < 0){ //反斜线的情况
for (int i=0; i <= half; i++)
{
DrawPixel(sx, sy, c);
DrawPixel(ex, ey, c);
if (e > 0) // 当e>0时,始端y向-1,末端y向+1
{
sy--; ey++;
e -= dx2;
}
//始端x向+1,末端x向-1
sx++; ex--;
e -= dy2;
}
}else{
for (int i=0; i<half; i++)
{
DrawPixel(sx, sy, c);
DrawPixel(ex, ey, c);
if (e > 0) // 当e>0时,始端y向+1,末端y向-1
{
sy++; ey--;
e -= dx2;
}
//始端x向+1,末端x向-1
sx++; ex--;
e += dy2;
}
}
return errNone;
}