困惑于DDA算法,需要一些帮助

时间:2009-11-03 15:27:28

标签: algorithm graphics dda

我需要有关DDA算法的帮助,我对在DDA Algo上在线找到的教程感到困惑,这里是该教程的链接

  

http://i.thiyagaraaj.com/tutorials/computer-graphics/basic-drawing-techniques/1-dda-line-algorithm

示例:

xa,ya=>(2,2)
xb,yb=>(8,10)
dx=6
dy=8

xincrement=6/8=0.75
yincrement=8/8=1

1)     for(k=0;k<8;k++)
xincrement=0.75+0.75=1.50
yincrement=1+1=2
1=>(2,2)

2)     for(k=1;k<8;k++)
xincrement=1.50+0.75=2.25
yincrement=2+1=3
2=>(3,3)

现在我想问一下,这条线是怎么来的xincrement = 0.75 + 0.75 = 1.50,当理论上写的是

“如果斜率大于1,则x y y在单位y间隔Dy = 1的角色,并计算每个连续的y值。 的Dy = 1

m= Dy / Dx
m= 1/ (  x2-x1 )
m = 1 / ( xk+1 – xk  )

xk+1   =  xk   +  ( 1 / m )

应为xincrement=x1 (which is 2) + 0.75 = 2.75

或者我理解错了,任何人都可以告诉我它是如何完成的吗?

非常感谢)

2 个答案:

答案 0 :(得分:3)

像素位置是整数值。理想线方程是实数。因此,线绘制算法将线方程的实数转换为整数值。绘制直线的困难和缓慢方法是评估像素阵列上每个x值的线方程。数字差分分析仪以多种方式优化该过程。

首先,DDA利用至少一个像素已知的事实,即线的起点。从该像素开始,DDA计算线中的下一个像素,直到它们到达线的终点。

其次,DDA利用了这样的事实:沿着x或y轴,线中的下一个像素始终是朝向线末端的下一个整数值。 DDA通过评估斜率来确定哪个轴。 0到1之间的正斜率会使x值增加1.正斜率大于1会使y值增加1.负斜率介于-1和0之间会使x值增加-1,负斜率会小于-1将y值增加-1。

Thrid,DDA利用了这样的事实,即如果一个方向上的变化为1,则另一个方向上的变化是斜率的函数。现在,在一般性中解释变得更加困难。因此,我只考虑0和1之间的正斜率。在这种情况下,为了找到要绘制的下一个像素,x增加1,并计算y的变化。计算y变化的一种方法是将斜率加到前一个y,然后舍入到整数值。除非将y值保持为实数,否则这不起作用。大于1的斜率可以将y递增1,并计算x的变化。

第四,一些DDA通过避免浮点计算进一步优化算法。例如,Bresenham的线算法是经过优化以使用整数运算的DDA。

在该示例中,从(2,2)到(8,10)的线,斜率是8/6,其大于1.第一像素在(2,2)处。通过将y值递增1并将x的变化(dx / dy的倒数斜率= 6/8 = .75)与x相加来计算下一个像素。 x的值为2.75,其舍入为3,并绘制(3,3)。第三个像素将再次递增y,然后将x中的变化添加到x(2.75 + .75 = 3.5)。舍入将绘制第四个像素(4,4)。然后第四个像素将绘制(5,4),因为y将增加1,但x将增加0.75,并且等于4.25。

从这个例子中,你能看到代码的问题吗?

答案 1 :(得分:1)

这里似乎有些混乱。

首先,假设0 <= slope&lt; = 1.在这种情况下,您在X方向上一次前进一个像素。在每个X步骤,您都有一个当前的Y值。然后,您可以确定“理想”Y值是否更接近当前Y值,或更接近下一个更大的Y值。如果它更接近较大的Y值,则增加当前的Y值。稍微不同的是,你弄清楚使用当前Y值的误差是否大于半个像素,如果是,你增加你的Y值。

如果斜率&gt; 1,然后(如你的问题所述)交换X和Y的角色。也就是说,你在Y方向上一次前进一个像素,并在每一步确定是否应该增加当前的X值。

负斜率的工作方式几乎相同,除非你递减而不是递增。