Re: [問題] 最快的bitmap旋轉演算法?

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間18年前 (2006/06/04 21:13), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
※ 引述《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
文章代碼(AID): #14Wjo14S (C_and_CPP)
文章代碼(AID): #14Wjo14S (C_and_CPP)