我正在尝试在维基百科简化版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;
}
}
}
谢谢!
编辑:循环的条件错误,因此它没有绘制直线,将其更改为正确的。答案 0 :(得分:1)
可能是dy
是无符号值,因此-dy
是正的(可能非常大)仍然(不是负数)。删除unsigneds应该修复它。
答案 1 :(得分:1)
接受回答后。
更改为有符号整数不解决一般案例中的问题,但可能已在@OP的有限情况下解决了这个问题。
只要x,y点不在极端范围内,就会更改为int
,因为x0,x1
的所有类型的int
显然会溢出(UB)unsigned
}或int dx = abs(x1-x0);
。
|x| < INT_MAX/2
我认为只要参数为{{1}},一切都可以。
处理所有输入组合的通用解决方案需要谨慎处理。
[编辑]
由于OP不需要全方位解决方案(并且有点懒惰),我会推迟挖掘并发布一般解决方案。