[英]Bresenham's line function C
我正在尝试在Wikipedia简化版c中实现Bresenham的line算法。 我的代码陷入了无限循环,我不知道为什么! (虽然我很确定这与我的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;
}
}
}
谢谢!
编辑:循环的条件是错误的,因此它没有绘制直线,而是将其更改为正确的直线。
可能是dy
是一个无符号值,所以-dy
是正数(并且可能很大),仍然是负数(不是负数)。 删除未签名的应该修复它。
接受答案后。
更改为符号整数不能解决在一般情况下的问题,但在@ OP有限的情况下,可能已经解决了它。
只要x,y点不在极限范围内,更改为int
可以工作,因为显然,对于各种int
或unsigned
的x0,x1
的大数值,下面的溢出(UB)。
int dx = abs(x1-x0);
我认为只要参数是|x| < INT_MAX/2
|x| < INT_MAX/2
,一切正常。
处理所有输入组合的通用解决方案需要仔细处理。
[编辑]
由于OP不需要全方位的解决方案(并且有点懒),因此我将推迟进行挖掘并发布一般的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.