點陣圖點陣90度翻轉演算法
阿新 • • 發佈:2020-10-09
演算法說明
將原始點陣圖點陣分割成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