对DDA算法感到困惑,需要帮助

问题描述 投票:0回答:3

我需要有关 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间隔Dy=1处的作用并计算每个连续的y值。 镝=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

或者我理解错误,有人可以教我它是如何完成的吗?

非常感谢)

algorithm graphics dda
3个回答
3
投票

这里似乎有点混乱。

首先,我们假设 0 <= slope <= 1. In this case, you advance one pixel at a time in the X direction. At each X step, you have a current Y value. You then figure out whether the "ideal" Y value is closer to your current Y value, or to the next larger Y value. If it's closer to the larger Y value, you increment your current Y value. Phrased slightly differently, you figure out whether the error in using the current Y value is greater than half a pixel, and if it is you increment your Y value.

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

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


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。

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


0
投票

我想知道这个算法对于负坐标值是否正确。我在 (-5, -2) 处设置起点,在 (-2, -6) 处设置终点,但使用基于斜率 𝑚 递增 𝑥 或 𝑦 的相同方法,得到了一条似乎永远不会真正收敛的线到终点。有人请证明我错了。

我知道你可能会说物理图形通常在笛卡尔坐标系的第一象限中运行。

© www.soinside.com 2019 - 2024. All rights reserved.