4

我需要有关 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 any 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

或者我理解错了,谁能教我怎么做?

非常感谢)

4

2 回答 2

3

像素位置是整数值。理想线方程是实数。因此,画线算法将线方程的实数转换为整数值。绘制一条线的艰难而缓慢的方法是在像素数组上的每个 x 值处评估线方程。数字差分分析仪以多种方式优化该过程。

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

其次,DDA 利用沿 x 或 y 轴的事实,行中的下一个像素始终是接近行尾的下一个整数值。DDA 通过评估斜率来确定哪个轴。0 和 1 之间的正斜率将使 x 值增加 1。大于 1 的正斜率将使 y 值增加 1。-1 和 0 之间的负斜率将使 x 值增加 -1,小于 -1 的负斜率将 y 值增加 -1。

第三,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。

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

于 2009-11-11T15:06:28.210 回答
2

这里似乎有些混乱。

首先,我们假设 0 <= 坡度 <= 1。在这种情况下,您在 X 方向上一次推进一个像素。在每个 X 步,您都有一个当前 Y 值。然后,您可以确定“理想”Y 值是更接近您当前的 Y 值,还是更接近下一个更大的 Y 值。如果它更接近较大的 Y 值,则增加当前 Y 值。措辞略有不同,您可以确定使用当前 Y 值的误差是否大于半个像素,如果是,则增加您的 Y 值。

如果斜率 > 1,那么(如您的问题中所述)您交换 X 和 Y 的角色。也就是说,您在 Y 方向上一次推进一个像素,并在每一步确定是否应该增加当前 X 值.

负斜率的工作原理几乎相同,只是你减少而不是增加。

于 2009-11-03T16:16:19.383 回答