首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bresenham线函数C

Bresenham线函数C
EN

Stack Overflow用户
提问于 2014-04-16 12:53:08
回答 2查看 469关注 0票数 0

我试图在c,维基百科简化版中实现Bresenham的行算法。我的代码被一个无限循环卡住了,我不知道为什么!(虽然我很确定这与我的知识有关)

代码语言:javascript
复制
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;
        }
    }
}

谢谢!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-16 13:02:34

可能是dy是一个无符号值,所以-dy是正的(并且可能相当大)仍然是(而不是负的)。移除未登录的人应该修复它。

票数 1
EN

Stack Overflow用户

发布于 2014-04-16 14:59:02

在接受答案之后。

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

更改为int时,只要x、y点不在极限范围内就可以工作,显然,对于x0,x1的各种大值,如intunsigned,下面的溢出(UB)都是有效的。

代码语言:javascript
复制
int dx = abs(x1-x0);

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

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

编辑

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23110053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档