直线扫描转换算法DDA算法(数值微分算法)
生活随笔
收集整理的這篇文章主要介紹了
直线扫描转换算法DDA算法(数值微分算法)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
數(shù)值微分算法(Digital Differential Analyzer,簡稱DDA):一種直接從直線的微分方程生成直線的方法。
首先,我們通過給定直線的兩端點坐標P0(x0,y0){P_0}({x_0},{y_0})P0?(x0?,y0?)和P1(x1,y1){P_1}({x_1},{y_1})P1?(x1?,y1?),可以得到直線的微分方程:
dydx=y1?y0x1?x0=k\frac{d_y}{d_x}=\frac{{y_1}-{y_0}}{{x_1}-{x_0}}=kdx?dy??=x1??x0?y1??y0??=k
DDA算法的原理:直線的一階導數(shù)是連續(xù)的,而且Δy與Δx是成一定比例的 因此我們可以通過將當前位置的坐標在每個方向上增加一定的增量來確定下一個點的位置。
這就涉及到了增量算法:在一個迭代算法中,如果每一步的x,y值是前一步的值加上一個增量來獲得的,則稱為增量算法。
這里x,y方向的增量分別為:€Δx和€Δy
其中€的值是一個無窮小的數(shù)(int?float?),這里不太確定。當€無窮小時,可以獲得一個精度無限高的直線。因為設備的精度有限,我們常取€=1max(Δx,Δy)\frac{1}{max({Δ_x,Δ_y})}max(Δx?,Δy?)1?。
這樣呢,可以使得€Δx,€Δy{€Δ_x,€Δ_y}€Δx?,€Δy?有一個取值總為1,算法在最大位移方向上每次走一步(即增加一個像素,單位步長)。
最大位移方向(根據(jù)斜率k確定):
設一直線y=3x+1y=3x+1y=3x+1,斜率kkk大于1。我們比較一下xxx方向走1步和yyy方向走1步的不同
xxx方向:
x1=x0+1{x_1}={x_0}+1x1?=x0?+1
y1=y0+3?1{y_1}={y_0}+3*1y1?=y0?+3?1
也就是說xxx方向走了1個步長單位,而yyy方向走了3個單位步長
yyy方向:
x1=x0+1/3{x_1}={x_0}+1/3x1?=x0?+1/3
y1=y0+1{y_1}={y_0}+1y1?=y0?+1
即yyy方向走1個單位步長的時候,xxx方向只走了1/31/31/3個單位步長。
顯然當x方向走1個單位步長的時候,點和點之間的距離會比較大。因此,我們這里選擇的最大位移方向位y方向。
所以,我們在DDA算法中要考慮兩種情況:
- 情況一:
∣k∣>1|k|>1∣k∣>1,Δy>Δx{Δ_y}>{Δ_x}Δy?>Δx?,€=1/Δy1/{Δ_y}1/Δy?,此時yyy方向為最大位移方向
xi+1=xi+1/k{x_{i+1}}={x_i}+1/kxi+1?=xi?+1/k,這里要再對xi+1+0.5{x_{i+1}}+0.5xi+1?+0.5取整或者直接四舍五入取整。
yi+1=yi+1{y_{i+1}}={y_i}+1yi+1?=yi?+1 - 情況二:
∣k∣<1|k| < 1∣k∣<1,Δx>Δy{Δ_x}>{Δ_y}Δx?>Δy?,€=1/Δx1/{Δ_x}1/Δx?,此時xxx方向為最大位移方向
xi+1=xi+1{x_{i+1}}={x_i}+1xi+1?=xi?+1
yi+1=yi+k{y_{i+1}}={y_i}+kyi+1?=yi?+k,這里要再對yi+1+0.5{y_{i+1}} + 0.5yi+1?+0.5取整或者直接四舍五入取整。
DDA算法的特點:
DDA算法是一個增量算法,每一點的坐標都可由前一個點的坐標加上1個增量求得。
優(yōu)點:算法直觀,易實現(xiàn)
缺點:有浮點數(shù)和浮點運算,取整運算,效率并不高。
總結(jié)
以上是生活随笔為你收集整理的直线扫描转换算法DDA算法(数值微分算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帆软报表(finereport)点击事件
- 下一篇: 各种学习资源