DDA算法不是为所有坐标值绘制直线

时间:2013-06-03 10:25:02

标签: c algorithm line-drawing dda

我实施DDA(数字微分分析仪)算法的代码适用于绘制斜率小于45 o 的线条,但线条斜率超过45 < SUP> 0 。

它的行为类似于角度的虚线&gt; 45 0


代码

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算法的缺点还是我的代码中有任何错误,请帮助我找出导致我的程序效率低下的原因。 感谢

3 个答案:

答案 0 :(得分:2)

如果要绘制斜率为&gt;的行; 1,你必须迭代y值。这很自然,因为y方向上的步数多于x方向上的步数。

答案 1 :(得分:2)

作为Wikipedia says

  

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

     

...

     

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

所以,有你的答案。您需要有if,检查斜率并将dxdy修复为1.有关详细信息,请参阅上面的Wikipedia链接。

答案 2 :(得分:1)

不, DDA算法中没有这样的缺点,您应该使用以下代码,它一定会有效。
如果你使用 Bresenham的绘图算法会更好。

仅使用dx 来计算算法的单位步长,因此它会绘制角度为&lt; 45 0
您没有在程序代码中使用dy作为斜率&gt; 45 o 这就是你的线路破裂的原因。附加此代码,您的代码将正常工作。

   if(abs(dx)>abs(dy))
       step=abs(dx);
   else
       step=abs(dy);