我试图在c,维基百科简化版中实现Bresenham的行算法。我的代码被一个无限循环卡住了,我不知道为什么!(虽然我很确定这与我的知识有关)
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;
}
}
}谢谢!
编辑:循环的条件是错误的,所以它没有绘制直线,而是将其更改为正确的直线。
发布于 2014-04-16 13:02:34
可能是dy是一个无符号值,所以-dy是正的(并且可能相当大)仍然是(而不是负的)。移除未登录的人应该修复它。
发布于 2014-04-16 14:59:02
在接受答案之后。
更改为有符号整数并不能解决一般情况下的问题,但可能在@OP的有限情况下解决了问题。
更改为int时,只要x、y点不在极限范围内就可以工作,显然,对于x0,x1的各种大值,如int或unsigned,下面的溢出(UB)都是有效的。
int dx = abs(x1-x0);我认为只要参数是|x| < INT_MAX/2,一切都好。
处理所有输入组合的通用解决方案需要仔细处理。
编辑
由于OP不需要完整的解决方案(而且有点懒),我将推迟挖掘和发布通用解决方案。
https://stackoverflow.com/questions/23110053
复制相似问题