45度地图之整体旋转
假設有如下一幅地圖(左邊為數組地圖,右邊為對應的位圖地圖),這幅地圖對應的是一個一維數組int map[16],且我們知道總共有4行,4列,對于數組中的元素我們可以通過下面的公式求出它所在的行列, 第n個元素的行值為n/py,其中py為總列數(4),而列值為n%py.
?
經過45度的旋轉后,我們想要得到的地圖將變為(左邊為數組地圖,右邊為將黑色背景作透明處理后對應的位圖地圖)
?
?
我們將45度地圖中與原來位圖的對應行列用紅色標記起來,這里我們只標記一部分點,因為用這幾個點就可以解釋整個地圖的旋轉
?
假設數組中第一個元素,既1的位置在(x,y),我們可以發現原來的90度數組中,行列值相同,既6,11,16這幾個點在旋轉后,相對與點1的位置,橫坐標沒有發生改變,而知識縱坐標改變,而差值恰好是位圖高度,然后我們觀察,6這個點的縱坐標為y+1*32,且6在原數組中的行列值是(1,1),11這個點的縱坐標為y+2*32,且11在原數組中的行列值是(2,2),16這個點的縱坐標為y+3*32,且16在原數組中的行列值是(3,3),由此我們可以推斷出,在原數組中行值與列值相同的元素,他的坐標為(x,y+n*32),其中n為行值或者列值,在這里他們是相等的,好了,現在我們解決了一種情況,還剩下兩種,一個是行值大于列值,一個是列值大于行值,現在我們來看看下面這幅圖
?
?
?
上面的圖片我們給出了幾張位圖所粘貼的坐標,我們可以發現一個規律,凡是在原數組中行數大于列數的,如5,9,10,他們的橫坐標都存在一個n*32和一個m*16,歸納一下可以得出,n是列數-行數的結果列數-行數的結果,例如元素5,他的n就為0-1 = -1,而m是列數+行數的結果,例如元素5,他的m就為0+1 = 1,而對于原數組中列數大于行數的,如2,3,7,他們的橫坐標也都存在一個n*32和一個m*16,歸納一下可以得出,n是列數-行數的結果列數-行數的結果,例如元素2,他的n就為1-0 = 1,而m是列數+行數的結果,例如元素2,他的m就為0+1 = 1
下面是整個算法的代碼(以上所有的第1個元素其實就是數組中下標為1的元素):
?
?
?
總結
以上是生活随笔為你收集整理的45度地图之整体旋转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fluorinefx (AMF3 for
- 下一篇: ActionScript 3.0 优化