📜  计算机图形DDA算法

📅  最后修改于: 2020-12-20 03:55:54             🧑  作者: Mango

DDA算法

DDA代表数字差分分析仪。它是行扫描转换的增量方法。在这种方法中,计算是在每个步骤中执行的,但要使用先前步骤的结果。

假设在步骤i,像素为(x i ,y i )

步骤i的方程线
y i = mx i + b ………………….方程1

下一个值将是
y i + 1 = m xi + 1 + b …….方程2
m = DDA算法
y i + 1 -y i = ∆y ………………….方程3
y i + 1 -x i = ∆x …………………. 4
y i + 1 = y i + ∆y
Δy=mΔx
y i + 1 = y i + m∆x
Δx=Δy/ m
x i + 1 = x i + ∆x
x i + 1 = x i + ∆y / m

情况1:当| M | <1时(假设x 1 2)
x = x 1 ,y = y 1设置∆x = 1
y i + 1 = y 1 + m ,x = x + 1
直到x = x 2

情况2:当| M | <1时(假设y 1 2)
x = x 1 ,y = y 1组Δy= 1
x i + 1 = DDA算法 ,y = y + 1
直到y→y 2

优点:

  • 比直接使用线方程的方法要快。
  • 此方法不使用乘法定理。
  • 它使我们能够检测到x和y值的变化,因此不可能两次绘制相同的点。
  • 重新定位点时,此方法会给出溢出指示。
  • 这是一种简单的方法,因为每个步骤仅涉及两个附加步骤。

坏处:

  • 它涉及浮点加法四舍五入。舍入误差的累积导致误差的累积。
  • 四舍五入操作和浮点操作会消耗大量时间。
  • 更适合使用该软件生成线。但是它不太适合硬件实现。

DDA算法:

步骤1:开始算法

步骤2:将x 1 ,y 1 ,x 2 ,y 2 ,dx,dy,x,y声明为整数变量。

步骤3:输入x 1 ,y 1 ,x 2 ,y 2的值

步骤4:计算dx = x 2 -x 1

步骤5:计算dy = y 2 -y 1

步骤6:如果ABS(dx)> ABS(dy)
然后step = abs(dx)
其他

步骤7: x inc = dx / step
y inc = dy / step
分配x = x 1
分配y = y 1

步骤8:设定像素(x,y)

步骤9: x = x + x inc
y = y + y inc
设置像素(圆形(x),圆形(y))

步骤10:重复步骤9,直到x = x 2

步骤11:结束算法

示例:如果使用DDA从(2,3)到(6,15)画了一条线。生成该线需要多少点?

解决方案: P 1 (2,3)P 11 (6,15)

x 1 = 2
y 1 = 3
x 2 = 6
y 2 = 15
dx = 6-2 = 4
dy = 15-3 = 12
m = DDA算法

为了计算x的下一个值,需要x = x + ”DDA算法”

”DDA算法”

实现DDA线描算法的程序:

#include
#include
#include
void main()
{
    intgd = DETECT ,gm, i;
    float x, y,dx,dy,steps;
    int x0, x1, y0, y1;
    initgraph(&gd, &gm, "C:\\TC\\BGI");
    setbkcolor(WHITE);
    x0 = 100 , y0 = 200, x1 = 500, y1 = 300;
    dx = (float)(x1 - x0);
    dy = (float)(y1 - y0);
    if(dx>=dy)
           {
        steps = dx;
    }
    else
           {
        steps = dy;
    }
    dx = dx/steps;
    dy = dy/steps;
    x = x0;
    y = y0;
    i = 1;
    while(i<= steps)
    {
        putpixel(x, y, RED);
        x += dx;
        y += dy;
        i=i+1;
    }
    getch();
    closegraph();
}

输出:

对称DDA:

数字差分分析仪(DDA)根据其微分方程生成线。直线方程为

DDA的工作原理是,我们以与x和y的一阶导数成比例的小步长同时增加x和y。在直线的情况下,一阶导数是常数,并且与∆x和∆y成比例。因此,我们可以通过将x和y分别增加ϵ ∆x和ϵ ∆y来生成一条线,其中ϵ很小。有两种生成点的方法

1.通过在每个增量步骤后四舍五入到最接近的整数,四舍五入后,我们在所得的x和y处显示点。

2.四舍五入使用算术溢出的一种替代方法:x和y保留在具有整数和分数两部分的寄存器中。都小于一的递增值被重复加到小数部分,并且每当结果溢出时,相应的整数部分就会递增。 x和y寄存器的整数部分用于绘制线。在对称DDA的情况下,我们选择ε= 2 -n,其中2 n-1个≤max(|ΔX|,|ΔY|)<2π

用对称DDA绘制的线如图所示:

示例:如果使用对称DDA从(0,0)到(10,5)画了一条线

1.执行多少次迭代?

2.将产生多少个不同的点?

解决方案:给定:P 1 (0,0)P 2 (10,5)
x 1 = 0
y 1 = 0
x 2 = 10
y 2 = 5
dx = 10-0 = 10
dy = 5-0 = 0
DDA算法

P 1 (0,0)将被视为起点
P 3 (1,0.5)点未绘制
P 4 (2,1)点绘制
P 5 (3,1.5)点未绘制
P 6 (4,2)点绘制
P 7 (5,2.5)点未绘制
P 8 (6,3)点绘制
P 9 (7,3.5)点未绘制
P 10 (8,4)点绘制
P 11 (9,4.5)点未绘制
P 12 (10,5)点绘制

下图显示了使用这些点绘制的线。