📜  计算机图形学中的DDA线生成算法

📅  最后修改于: 2021-05-04 09:00:22             🧑  作者: Mango

在任何二维平面中,如果我们连接两个点(x0,y0)和(x1,y1),我们将得到一条线段。但是对于计算机图形学,我们不能直接连接任何两个坐标点,因为我们应该计算中间点的坐标并为每个中间点放置一个像素,并借助putpixel(x,y C),其中(x,y)是我们的坐标,K表示某种颜色。
例子:

Input: For line segment between (2, 2) and (6, 6) :
we need (3, 3) (4, 4) and (5, 5) as our intermediate
points.

Input: For line segment between (0, 2) and (0, 6) :
we need (0, 3) (0, 4) and (0, 5) as our intermediate
points.

对于使用图形功能,我们的系统输出屏幕被视为一个坐标系,其中左上角的坐标为(0,0),并且当我们向下移动y轴时增加,而当我们向右移动我们的x轴时增加对于任何一点(x,y)。
现在,为了生成任何线段,我们需要中间点并进行计算,我们可以使用一种称为DDA(数字差分分析仪)线生成算法的基本算法。

DDA算法:
将线的一个点视为(X0,Y0),将线的第二点视为(X1,Y1)。

// calculate dx , dy
dx = X1 - X0;
dy = Y1 - Y0;

// Depending upon absolute value of dx & dy
// choose number of steps to put pixel as
// steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy)
steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);

// calculate increment in x & y for each steps
Xinc = dx / (float) steps;
Yinc = dy / (float) steps;

// Put pixel for each step
X = X0;
Y = Y0;
for (int i = 0; i <= steps; i++)
{
    putpixel (round(X),round(Y),WHITE);
    X += Xinc;
    Y += Yinc;
}
C
// C program for DDA line generation
#include
#include
#include
//Function for finding absolute value
int abs (int n)
{
    return ( (n>0) ? n : ( n * (-1)));
}
 
//DDA Function for line generation
void DDA(int X0, int Y0, int X1, int Y1)
{
    // calculate dx & dy
    int dx = X1 - X0;
    int dy = Y1 - Y0;
 
    // calculate steps required for generating pixels
    int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);
 
    // calculate increment in x & y for each steps
    float Xinc = dx / (float) steps;
    float Yinc = dy / (float) steps;
 
    // Put pixel for each step
    float X = X0;
    float Y = Y0;
    for (int i = 0; i <= steps; i++)
    {
        putpixel (round(X),round(Y),RED);  // put pixel at (X,Y)
        X += Xinc;           // increment in x at each step
        Y += Yinc;           // increment in y at each step
        delay(100);          // for visualization of line-
                             // generation step by step
    }
}
 
// Driver program
int main()
{
    int gd = DETECT, gm;
 
    // Initialize graphics function
    initgraph (&gd, &gm, "");  
 
    int X0 = 2, Y0 = 2, X1 = 14, Y1 = 16;
    DDA(2, 2, 14, 16);
    return 0;
}


输出:

好处 :

  • 算法简单易行。
  • 它避免了使用时间复杂度高的多个操作。
  • 它比直接使用线方程更快,因为它不使用任何浮点乘法,并且可以计算线上的点。

缺点:

  • 它处理舍入运算和浮点运算,因此具有很高的时间复杂度。
  • 由于它与方向有关,因此端点精度较差。
  • 由于浮点表示的精度有限,因此会产生累积误差。