1. 程式人生 > 實用技巧 >點陣圖點陣90度翻轉演算法

點陣圖點陣90度翻轉演算法

>>> hot3.png

演算法說明

將原始點陣圖點陣分割成8*8的小塊,則該小塊各種組合值恰好可以使用64位完全表示,即橫向8個點可以使用一個位元組表示,縱向8行則即8位元組。

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

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

逆時針旋轉90°效果如下圖

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

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

原始碼:https://git.oschina.net/ccyuan/RotateBitmap90.git

演算法測試

測試環境

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

測試內容

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

測試結果

取位操作法花費時間與查表法花費的時間比值。

預計結果

位操作時間/查表時間

備註

全白圖

< 1

空白位元組不做操作,因此時間要比查表時間短

隨機圖

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下獲取時間和計算時間差的幾種方法總結

轉載於:https://my.oschina.net/ccyuan/blog/738901