Bresenham的线函数C

时间:2014-04-16 12:53:09

标签: c line keil

我正在尝试在维基百科简化版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;
        }
    }
}

谢谢!

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

2 个答案:

答案 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不需要全方位解决方案(并且有点懒惰),我会推迟挖掘并发布一般解决方案。