2

我的 DDA(数字差分分析仪)算法实现代码在绘制斜率小于 45 o的线时效果很好,但在斜率大于 45 o时失败。

对于角度 > 45 o,它的行为就像一条折线


代码

void dda(int x1,int y1,int x2,int y2)
{
    float x,y,xinc,yinc,dx,dy;
    int k,step;
    dx = x2 - x1;
    dy = y2 - y1;
    step = abs(dx);
    xinc = dx / step;
    yinc = dy / step;
    x = x1;
    y = y1;
    putpixel(x,y,63);
    for(k=1;k<=step;k++)
    {
        x = x + xinc;
        y = y + yinc;
        putpixel(x,y,63);
    }
}

这是DDA算法的缺点还是我的代码有任何错误,请帮助我找出导致我的程序效率低下的原因。
谢谢

4

3 回答 3

2

如果要绘制斜率 > 1 的线,则必须遍历 y 值。这是很自然的,因为 y 方向的步数比 x 方向的步数多。

于 2013-06-03T10:29:21.803 回答
2

正如维基百科所说

考虑具有正斜率的线,如果斜率小于或等于 1,我们以单位 x 间隔采样...

...

对于斜率大于 1 的线,我们颠倒 x 和 y 的作用...

所以,这就是你的答案。你需要有一个if,检查坡度并固定dx或固定dy到 1。有关更多详细信息,请参阅我在上面放置的 Wikipedia 链接。

于 2013-06-03T10:29:24.217 回答
1

不, DDA算法没有这样的缺点,你应该使用下面的代码,它肯定会工作。
如果你使用Bresenham 的线条绘制算法会更好。

仅使用 dx来计算算法的单位步长,因此它会绘制角度 < 45 o的线。
您没有在程序代码中使用 dy 来表示斜率 > 45 o,这就是您的线条断开的原因。附加此代码,您的代码将正常工作。

   if(abs(dx)>abs(dy))
       step=abs(dx);
   else
       step=abs(dy);
于 2013-06-03T10:30:25.223 回答