1. 程式人生 > >CG-光柵圖形學直線掃描轉換算法-學習筆記

CG-光柵圖形學直線掃描轉換算法-學習筆記

圖形 點畫 整數 mar bresenham bsp pla 位移 ali

一、直線掃描轉換算法——DDA畫線算法

備註:DDA(Digital Differential Analyzer) ---> 數值微分法

1. 引進圖形學中的一個很重要的思想——增量思想

2. 算法原理

采用直線的斜截式方程進行推理,坐標系為光柵像素坐標系,可用坐標僅為整數坐標點。

技術分享圖片

yi = kxi + b

yi+1 = kxi+1 + b = k (xi + 1) + b = kxi + k + b = kxi + b + k = yi + k

由以上兩式得: yi+1 = yi + k (當前步的Y值等於前一步的Y值加上斜率)

目的:將原來的乘法和加法變成了一個加法

3. 示例

用DDA掃描轉換連接兩點P0(0,0)和P1(5,3)的直線段技術分享圖片1° 計算斜率 k = 0.6 < 1

2° 根據公式 yi+1 = yi + k 計算趨近的像素坐標點: 技術分享圖片

【註意】此處Y加上0.5是做了四舍五入的處理,減少誤差!

二、直線掃描轉換算法——中點畫線算法

改進:將DDA中的浮點運算變成整數加法

1. 引入直線的一般式方程:

F(x,y)= 0 ----> Ax + By + C = 0

其中:A = -(?y);B = (?x);C = -B(?x);

2. 基本數學知識:

技術分享圖片

1° 對於直線上的點: F(x,y)= 0

2° 對於直線上方的點:F(x,y)> 0

3° 對於直線下方的點:F(x,y)< 0

3. 算法原理:每次在最大位移方向上走一步,而另一個方向是走還是不走步取決於中點誤差項的判斷。

技術分享圖片

將M點的坐標代入直線方程中:

di = F(xm, ym)= F(xi + 1, yi + 0.5)= A(xi + 1)+ B(yi + 0.5)+ C

分三種情況:

當 d < 0 時:M在Q下方,應取Pu

當 d > 0 時:M在Q上方,應取Pd

當 d = 0 時:M在直線上,選Pd或Pu均可;

4. 引入增量思想的改進

1° 情況1:

技術分享圖片

推導d值的遞推公式:

d0 = F(xm0, ym0)= F(xi + 1, yi + 0.5)= A(xi

+ 1)+ B(yi + 0.5)+ C

d1 = F(xm1, ym1)= F(xi + 2, yi + 1.5)= A(xi + 2)+ B(yi + 1.5)+ C

= A(xi + 1)+ B(yi + 0.5)+ C + A + B = d0 + A + B

2° 情況2:

技術分享圖片

同理推導得:

d1 = F(xi + 2, yi + 0.5)= A(xi + 2)+ B(yi + 0.5)+ C

= A (xi + 1)+ B(yi + 0.5)+ C + A = d0 + A

3° d的初始值的計算

技術分享圖片

d0 = F(x0 + 1, y0 + 0.5)= A(x0 + 1)+ B(y0 + 0.5)+ C

= Ax0 + By0 + C + A + 0.5B = A + 0.5B

4° 綜上:技術分享圖片

三、直線掃描轉換算法——Bresenham算法

1. 基本思想

技術分享圖片

該算法的思想是通過各行、各列像素中心構造一組虛擬網格線,按照直線起點到中點的順序,計算直線與各垂直網格線的交點,然後根據誤差項的符號確定該列像素中與此交點最近的像素;假設每次x+1,y的遞增(減)量為0或1,它取決於實際直線與最近光柵網格點的距離,這個距離的最大誤差為0.5;

2. 原理

技術分享圖片

誤差項d的初值d0 = 0, 每一步 d = d + k,一旦d ≥1,就把它減去1,保證d的相對性,且在0、1之間。

得到公式:技術分享圖片

1° 提高效率到整數加法:令 e = d - 0.5 得:技術分享圖片

2° 由於算法中只用到誤差項的符號,於是可以用 e*2*?x替換e;

3. 算法步驟:

1° 輸入直線的兩端點P0(x0, y0)和P1(x1, y1);

2° 計算初始值?x、?y、e = -?x, x = x0、y = y0;

3° 繪制點(x, y);

4° e更新為e + 2?y,判斷e的符號。若e>0,則(x,y)更新為(x+1,y+1),同時將e更新為e-2?x;否則(x, y)更新為(x+1, y);

5° 當直線沒有畫完時,重復步驟3和4。否則結束。

CG-光柵圖形學直線掃描轉換算法-學習筆記