直线算法

发布日期: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;

}