繁体   English   中英

布雷森汉姆的线函数C

[英]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可以工作,因为显然,对于各种intunsignedx0,x1的大数值,下面的溢出(UB)。

int dx = abs(x1-x0);

我认为只要参数是|x| < INT_MAX/2 |x| < INT_MAX/2 ,一切正常。


处理所有输入组合的通用解决方案需要仔细处理。

[编辑]

由于OP不需要全方位的解决方案(并且有点懒),因此我将推迟进行挖掘并发布一般的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM