位圖點陣90度翻轉算法

算法說明

    將原始位圖點陣分割成8*8的小塊,則該小塊各類組合值剛好能夠使用64位徹底表示,即橫向8個點能夠使用一個字節表示,縱向8行則即8字節。c++

  • 對於逆時針旋轉90°,源點陣第一行旋轉後(一個字節),對應目標點陣的第一列(8個字節的第一位同時賦值),參見下圖
  • 由此能夠得出,對於每一行(1字節)均可以有一個64位的整型與之一一對應,對於不一樣行的點陣數據,只要在目標點陣數據作移位操做,就能夠獲得相應的翻轉效果。
  • 逆時針旋轉的表佔用空間大小爲:8 * 2^8 = 4096字節,同理順時針旋轉的表佔用空間的大小爲4096字節

        

    對於32位的CPU彷佛直接使用64位的整型的話應該也是要拆分兩次計算吧(我的猜想)。這裏果斷將原來的8*8點陣,拆分爲兩個4*8點陣(橫向4點,縱向8點, 32位),分兩次計算,將最後獲得的值分別拼接到目標的8*8點陣中。git

    逆時針旋轉90°效果以下圖算法

  • 每次取出源點陣的一行,分別取出高4位與低4位,再將高低4位分別查找32位映射表,最後的值再拼接至目標點陣
  • 拆分後逆時針旋轉的表佔用空間大小爲:4* 2^4 = 64字節,同理順時針旋轉的表佔用空間的大小爲64字節

    

查表法比普通的直接位操做理論上有8倍左右的差距

源碼:https://git.oschina.net/ccyuan/RotateBitmap90.git windows

算法測試

    測試環境

  •  操做系統: win7 64位
  • 編譯器:TDM-GCC 4.9.2 32-bit
  • IDE:Dev-C++ 5.11
  • 點陣位圖存儲方式LSB-MSB(即點陣的最左上角的點存儲在第一個字節的第一位,區分單色圖,單色圖爲存儲在一個字節的第八位)

    測試內容

  • 對於同一源點陣,統計使用位操做法與查表法翻轉源點陣所須要的時間
  • 源點陣大小由12*24遞增至640*640,遞增單位4點
  • 源點陣內容:全白圖,隨機圖(使用c標準庫的rand生成的數據),全黑圖

    測試結果

 

        取位操做法花費時間與查表法花費的時間比值。測試

            預計結果spa

 

位操做時間/查表時間操作系統

備註.net

全白圖code

< 1blog

空白字節不作操做,所以時間要比查表時間短

隨機圖

4~8

存在空白字節,所以時間<8

全黑圖

8左右

每位都須要進行操做,所以時間最長

 

        實際結果

        全程數據讀取

 

位操做時間/查表時間

備註

全白圖

0.37~0.55

這時間比,不科學呀

隨機圖

5.6~8.2

符合預期

全黑圖

3.3~3.6

徹底不科學呀

    小點陣64*64之內

 

 

位操做時間/查表時間

備註

全白圖

0.5~0.65

 

隨機圖

2.6~3.5

符合預期,

全黑圖

2.6~3.4

徹底不科學呀

 

    統計結果對比圖

         整個流程數據統計

         局部放大圖

        小點陣

 

參考資料

    c/c++在windows下獲取時間和計算時間差的幾種方法總結

相關文章
相關標籤/搜索