2014-04-16 17 views
0

我想在c,wikipedia简化版本中实现Bresenham的行算法。 我的代码被卡住到一个无限循环,我不明白为什么! (虽然我很确定它与我的知识有关)Bresenham的行功能C

void Draw_line (unsigned int x0, unsigned int y0,unsigned int x1, unsigned int y1) 
{ 
    unsigned int dx = abs(x1-x0); 
    unsigned int dy = abs(y1-y0); 
    signed short sx,sy; 
    signed int err,e2; 

    if (x0 < x1) {sx = 1;} else {sx = -1;} 
    if (y0 < y1) {sy = 1;} else {sy = -1;} 
    err = dx-dy; 

    while (!(x0==x1 && y0==y1)) 
    { 
     GLCD_PutPixel(x0, y0); 
     e2 = 2*err; 
     if (e2 > -dy) 
     { 
      err = err - dy; 
      x0 += sx; 
     } 
     if (e2 < dx) 
     { 
      err = err + dx; 
      y0 += sy; 
     } 
    } 
} 

谢谢!

编辑:有条件的循环是错误的,所以它没有绘制直线,将其改为正确的。

+0

http://www.roguebasin.com/index.php?title=Bresenham%27s_Line_Algorithm – user1095108

+0

当您不知道任何其他技术时,调试代码的最佳方式是添加printf语句。 –

+1

如果您始终使用带符号整数,则您的代码应该可以工作。 –

回答

1

是不是dy是一个无符号值,所以-dy是正数(可能相当大)仍然(不是负数)。删除未签名应修复它。

1

接受答案后。

更改为符号整数确实解决在一般情况下的问题,但在@ OP有限的情况下,可能已经解决了它。

更改为int只要作品为X,Y点是不是在极端的范围内显然下面的溢出(UB)为各种x0,x1大的值作为intunsigned

int dx = abs(x1-x0); 

我想只要参数是|x| < INT_MAX/2,一切都可以。


一个一般解决方案,它处理的所有输入的组合,需要谨慎处理。

[编辑]

由于OP并不需要一个全方位的解决方案(并且是有点懒),我会推迟挖掘和张贴的通用解决方案。

+0

你说得对,我的屏幕是320x240,这就是为什么我没有考虑到这一点。谢谢您的意见 – user3541254