首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DDA算法中困惑,需要一些帮助

在DDA算法中困惑,需要一些帮助
EN

Stack Overflow用户
提问于 2009-11-03 15:27:27
回答 2查看 17K关注 0票数 4

我需要关于DDA算法的帮助,我对我在DDA Algo网上找到的教程感到困惑,下面是该教程的链接

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

示例:

代码语言:javascript
复制
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间隔Dy=1上的作用,并计算每个连续的y值. Dy=1。

代码语言:javascript
复制
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

或者我理解错了,能不能请你教我怎么做?

非常感谢)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-03 16:16:19

这里似乎有点混乱。

首先,让我们假设0 <=斜率<= 1,在本例中,您在X方向上一次前进一个像素。在每一个X步骤中,都有一个当前的Y值。然后计算出“理想”Y值是否更接近当前的Y值,还是更接近下一个更大的Y值。如果它更接近较大的Y值,则增加当前的Y值。措辞略有不同,您会发现在使用当前Y值时的错误是否大于半像素,如果是,则会增加您的Y值。

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

负斜率几乎是一样的,除了减少而不是递增。

票数 3
EN

Stack Overflow用户

发布于 2009-11-11 15:06:28

像素位置是整数值。理想线方程以实数表示。因此,直线绘制算法将直线方程的实数转换为整数值。绘制直线的困难和缓慢的方法是在像素数组上的每个x值处计算直线方程。数字差分分析仪以多种方式优化了这一过程。

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

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

因此,DDAs利用了这样一个事实:如果一个方向上的变化是1,则另一个方向上的变化是斜率的函数。现在更难用概括性来解释了。因此,我只考虑0到1之间的正斜率。在这个例子中,为了找到下一个要绘制的像素,x被增加1,并且计算y的变化。计算y中的变化的一种方法是将斜率加到前一个y中,然后将其舍入整数值。除非您将y值保持为实数,否则这是行不通的。大于1的斜率只需增加y 1,并计算x中的变化。

第四,一些DDAs通过避免浮点计算来进一步优化算法。例如,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将由.75递增,等于4.25。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1668029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档