DDA数值微分法详解
生活随笔
收集整理的這篇文章主要介紹了
DDA数值微分法详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DDA算法,是根據直線的微分方程來計算△x和△y 生成直線的掃描轉換算法。
下面給出一道例題,來講解下DDA算法的計算步驟:
題目如下
解:我們按照題意畫好了直線:
看成直線y=mx+b?接下來就是使用DDA算法生成像素了
首先需要得到直線的斜率m,計算方法是利用直線方程中的點斜式??變形
成??計算得到。
接著從x的左端點x1開始,向右端點x2步進,步長為一個像素,計算相應的y坐標y=mx+b;取像素點?(x, round(y))?作為當前點的坐標(round表示四舍五入),即:當x每遞增1,y遞增m(即直線斜率):
提示:剛開始x=0,y=0.5,然后x增加1,y增加0.4(斜率),···以此類推
int(y+0.5)表示對y進行四舍五入?這樣,依次得到了坐標(0,0) (1,0) (2,1) (3,1) (4,2) (5,2)。
對坐標處添加像素,可得如下圖像:
?至此,通過DDA算法確定一組最佳逼近目標直線的像素已經完成。
????????注意本題的算法僅適用于|m| ≤1的情形。在這種情況下,x每增加1, y最多增加1。當 |m| >1時,必須把x,y地位互換,否則會導致畫出來的像素點之間跳躍幅度過大。互換即y=mx+b變成x=(1/m)(y-b),即y增加1,x增加1/m。
DDA算法偽代碼(C語言):
void DDALine(int x1,int y1,int x2,int y2,int color){int x; float dx, dy, y, m; dx = x2-x1, dy=y2-y1; m=dy/dx, y=y1; for (x=x1; x<=x2; x++) { SetPixel (x, int(y+0.5), color); y=y+m;} }DDA算法的優缺點:
- 優點是消除了算法中的乘法,簡單易懂。
- 缺點是有浮點數的計算,并伴隨浮點數相加累積誤差,對長線段而言容易引起像素點位置與理想位置的較大偏移。
- 四舍五入操作消耗時間
總結
以上是生活随笔為你收集整理的DDA数值微分法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java初始化变量n_java中预构造函
- 下一篇: 语法上的小trick