....資料來源, 名為 computer graphics 的書, chapter 2, Scan Conversion Techniques, 作者是 A.P. Godse (在 google 圖書內 online 查看), 書內採用 linear equation 數學方程式原理配合類似 BASIC 的電腦語言來講解運算方法, 不算太艱深, 自己亦睇得明 (其實還提供了 C 語言, 但自己睇唔明), 以下是將書內容 "消化" 後得出的見解.....
...對於繪畫直線條黎講, 點樣將 vector 線條顯示在一點點的 lcd 上呢? 可使用名為 Bresenham's Line Algorithm 的計算方法, 原理是取得頭尾兩個 pixels 的座標值之後(用 mouse 畫直線時所 click 選的兩個 points), 利用 "接近法" 遂一計算出第 2, 3, 4 ....的 pixels (頭 pixel 唔需要計算, 因為用 mouse 畫線時已被定出, 至於最尾的 pixel , 雖然亦已被定出, 但仍然會再用方程式計算一次 ), 所謂 "接近法", 是量度 pixel 中心點和 Vector 線之間的距離, 並選用距離較短的 pixel...
....例如頭尾兩個 pixels 分別為 (0,0) 及 (10,10), 這時第二個 pixel 便會是 (1,1), 因為 vector 直線會直接穿過這個 pixel 的中心點, 但若將尾 pixel 改為 (10,8) 的話, 這時 vector 直線便會位於 (1,1) 和 (1,0) 上下兩個 pixels 之間, 由於較接近上面的 pixel, 所以便選用了 (1,1), 其它行數計算方法相同....
.....咁駛唔駛計埋橫行呢? 答案是當 vector 直線斜度超過 45 度時便要改為採用橫行的 pixels, 否則便會出現錯誤, 例如頭尾兩個 pixel 是 (0,0) 及 (1,10) , 其直線斜度差不多有 90 度, 而且只有兩行打直, 若依然用打直的方法來計算的話, 每行取一個 pixel , 總數便只有兩個 pixels, 無法形成一條直線 (改用打橫 pixels 後, 第一直行會佔用 5 個 pixels, 第二直行亦佔用 5 個 pixels 而形成一條直線)....
...也可使用名為 DDA Algroithm 的計算方法, 但由於有弱點, 所以較小採用, 弱點包括 (1) 由於要用小數來運算, 計算速度較慢, 即是所謂的 floating point, 這是電腦的弱項(待查近年的 cpu 是否已不再存在這問題), 而前述計算方法則採用整數(integer)來運算, (2) end point 位置可能會出現偏差 , 即是經由方程式計算出來的 end point 並不能保証會等同 mouse-click 時的 point, 而前者的計算方法則完全準確...
沒有留言:
張貼留言