Re: [問題] 最快的bitmap旋轉演算法?
※ 引述《bobhsiao (㊣小臃腫㊣)》之銘言:
: 有一個 "將圖A旋轉N度, 再貼到圖B的函數", 原始碼如下(用allegro寫的):
: http://rafb.net/paste/results/ZmAFzl75.html
: 速度的瓶頸在22~35行.
: 試過下列最佳化:
: 1. 浮點改整數. (例:int sinT=sin(Thita)*1024, 後面要用時再除1024)
: 2. 先求srcX, 若滿足條件才算srcY. (可節省一些運算)
: 3. 一些固定值用變數存起來. (New_Height/2, New_Width/2...等)
: 結果還是無法像DirectX的API那樣快速.
: 我想DirectX應該是有用硬體加速吧.
: 用軟體做bitmap旋轉是否還有更快的方式呢?
以下完全是用想的,雖然我用類似的方法實作過三角形填色,
不過並沒有拿來實作過圖形的旋轉。
基本上旋轉只是座標乘上旋轉矩陣:
[ u ] [ cosθ sinθ ] [ x ]
[ ] = [ ] [ ]
[ v ] [ -sinθ cosθ ] [ y ]
如果你把 (x+1, y) 代進這個矩陣就會發現:
u' = (cosθ)(x+1) + (sinθ)y
= (cosθ)x + (sinθ)y + cosθ
= u + cosθ
v' = (-sinθ)(x+1) + (cosθ)y
= (-sinθ)x + (cosθ)y - sinθ
= v - sinθ
也就是說,當你的 x 座標前進一格時,你完全不用重做矩陣
乘法,只須要把上次算出來的座標各加上一個位移即可。這麼
一來就完全不須要乘法運算。
如果配合 Bresenham 畫線的方式,甚至可以把浮點數加法改
成整數加法。
當然再加上 SSE 可能會更快,但因為你還要 clipping,所以
應該沒辦法快多少,當然也不可能比顯示卡硬體加速還快。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.62.3.35
推
06/05 01:12, , 1F
06/05 01:12, 1F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章