【问题标题】:Bresenham's line function CBresenham 的线函数 C
【发布时间】:2014-04-16 12:53:08
【问题描述】:

我正在尝试在维基百科简化版 c 中实现 Bresenham 的线算法。 我的代码陷入了无限循环,我不知道为什么! (虽然我很确定这与我的 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;
        }
    }
}

谢谢!

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

【问题讨论】:

  • 当您不知道任何其他技术时,调试代码的最佳方法是添加 printf 语句。
  • 如果您始终使用有符号整数,您的代码应该可以工作。
  • 启用来自编译器的所有警告(例如,-Wall -Wextra,如果您使用的是 gcc)。然后修复编译器警告的代码中的所有潜在问题。
  • 谢谢大家的解决方案,确实是有符号整数。我在嵌入式平台上编码,这就是为什么我无法正确调试它

标签: c line keil


【解决方案1】:

难道dy 是一个无符号值,所以-dy 仍然是正数(并且可能相当大)(不是负数)。删除无符号应该可以解决它。

【讨论】:

    【解决方案2】:

    接受回答后。

    更改为有符号整数不能解决一般情况下的问题,但在@OP的有限情况下可能已经解决了。

    只要 x,y 点不在极端范围内,更改为 int 就可以工作,因为对于 x0,x1 的各种大值,intunsigned 显然会出现以下溢出 (UB)。

    int dx = abs(x1-x0);
    

    我觉得只要参数是|x| &lt; INT_MAX/2就可以了。


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

    [编辑]

    由于 OP 不需要完整的解决方案(并且有点懒惰),我将推迟挖掘并发布通用解决方案。

    【讨论】:

    • 你说得对,我的屏幕是 320x240,所以我没有考虑到这一点。感谢您的意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多