我需要关于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间隔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
或者我理解错了,能不能请你教我怎么做?
非常感谢)
发布于 2009-11-03 16:16:19
这里似乎有点混乱。
首先,让我们假设0 <=斜率<= 1,在本例中,您在X方向上一次前进一个像素。在每一个X步骤中,都有一个当前的Y值。然后计算出“理想”Y值是否更接近当前的Y值,还是更接近下一个更大的Y值。如果它更接近较大的Y值,则增加当前的Y值。措辞略有不同,您会发现在使用当前Y值时的错误是否大于半像素,如果是,则会增加您的Y值。
如果斜率> 1,那么(在您的问题中已经提到)您交换了X和Y的角色。也就是说,您在Y方向上一次前进一个像素,并且在每一步确定是否应该增加当前的X值。
负斜率几乎是一样的,除了减少而不是递增。
发布于 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。
从这个例子中,您能看到代码的问题吗?
https://stackoverflow.com/questions/1668029
复制相似问题