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

C DDA算法不是为所有坐标值绘制直线,c,algorithm,line-drawing,dda,C,Algorithm,Line Drawing,Dda,我的DDA(数字微分分析仪)算法实现代码适用于绘制坡度小于45度的直线,但在坡度大于45度的直线上失败。 对于大于45°的角度,它的行为就像一条折线 代码 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; yi

我的DDA(数字微分分析仪)算法实现代码适用于绘制坡度小于45度的直线,但在坡度大于45度的直线上失败。

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


代码

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);
    }
}
void dda(整数x1、整数y1、整数x2、整数y2)
{
浮点数x,y,xinc,yinc,dx,dy;
int k,步骤;
dx=x2-x1;
dy=y2-y1;
阶跃=abs(dx);
xinc=dx/步;
yinc=dy/step;
x=x1;
y=y1;
像素(x,y,63);

对于(k=1;k如果要绘制坡度大于1的直线,则必须迭代y值。这是很自然的,因为y方向的步数比x方向的步数多。

如下所示:

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

对于坡度大于1的直线,我们反转x和y的作用


所以,这就是你的答案。你需要有一个
if
,检查斜率并将
dx
dy
固定为1。有关更多详细信息,请参阅我上面的维基百科链接。

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

您只使用dx来计算算法的单位步长,因此它绘制角度<45o的直线。
在坡度>45o的程序代码中没有使用dy,这就是为什么您的行会断开。附加此代码,您的代码将正常工作

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