2009-11-03 61 views
3

我需要相關DDA算法的幫助,我是通過我在網上發現DDA算法中的教程困惑,這裏是鏈接到該教程在DDA算法困惑,需要一些幫助

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,則單位y間隔Dy = 1時x任意y的作用並計算每個連續的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

還是我理解錯了,任何一個可以請教我它是如何做?

非常感謝)

+1

它看起來不像是一個C++問題。 – navigator 2009-11-03 15:44:45

+0

是的,它的C proggy,對不起,錯誤 – 2009-11-03 16:08:59

回答

1

這裏似乎有點混亂

首先,我們假設0 < =斜率< = 1.在這種情況下,您在X方向上每次前進一個像素。在每個X步驟中,都有一個當前的Y值。然後確定「理想」Y值是接近於當前的Y值,還是接近下一個較大的Y值。如果它接近較大的Y值,則增加當前的Y值。表達方式略有不同,您可以計算出使用當前Y值時的誤差是否大於半個像素,以及是否增加了Y值。

如果斜率> 1,那麼(如您的問題所述)您交換X和Y的角色。也就是說,您在Y方向上每次前進一個像素,並且在每個步驟確定是否應該增加您當前的X值。

負斜率的工作原理幾乎相同,只是遞減不是遞增。

+0

你似乎在教我bresenham的算法,如果你對DDA有所瞭解,可能會更困惑,可以更好地說出它的區別? 謝謝 – 2009-11-03 16:25:11

3

像素位置是整數值。理想線方程是實數。所以畫線算法將一個直線方程的實數轉換爲整數值。繪製直線的艱難而緩慢的方法是評估像素陣列上每個x值處的直線方程。數字差分分析儀以多種方式優化了這一過程。

首先,DDAs利用了至少一個像素是已知的事實,即行的開始。從該像素開始,DDAs計算該行中的下一個像素,直到它們到達該行的終點。其次,DDAs利用沿着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 = 0.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。

從這個例子中,你可以看到你的代碼的問題?