2016-02-19 74 views
1

我有需要在任何程度(0〜359)如何旋轉二維字節數組?

我的矩陣由一個16×16字節正方形組成像這樣旋轉在一個二維正方形字節矩陣中的數據:

[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00] 
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00] 
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00] 
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00] 
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00] 
[00][00][00][00][00][00][00][00][7F][7F][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 

該矩陣代表遊戲中物品的碰撞圖。矩陣中的數字表示遊戲世界中每個位置的高度,用於確定與遊戲中其他物體的碰撞。

我需要能夠旋轉這個碰撞圖(矩陣數據),因爲遊戲中的物體可以旋轉。

有沒有人有任何想法我可以做到這一點?

非常感謝!

+0

那麼,當你將其旋轉45度,也不會是16×16了,除非你切斷邊緣。可以嗎?另外,旋轉對象而不是地圖可能會更快嗎? – Norman

+0

你好諾曼,切斷邊緣完全沒問題。對於另一個問題:問題是具有這些碰撞圖的物體可以旋轉,但是一旦物體旋轉,我必須根據施加到物體的旋轉來更新碰撞圖。 – ptr0x

+1

旋轉90度的倍數是微不足道的;對於其他任何角度,插值都會發揮作用。說一些角度,你計算出原始矩陣中的指數是3.5和14.2。你需要什麼樣的插值呢?最近的鄰居是否足夠好,或者內插是否可以接受? – Norman

回答

2

您需要一個功能f(x,y),以角度theta角度旋轉碰撞圖中的座標x,y。 有了它,就可以

  1. 計算其中碰撞映射圖的要素將在由theta旋轉移動(例如(0,0)當順時針旋轉90度將移動到(15,0)),或
  2. 就可以計算出該元素將通過theta度的旋轉移動到某個位置。在這種情況下,您將翻轉theta的符號以反轉方向。

要創建一個旋轉的地圖,你會做#2。創建相同大小的第二張地圖,然後遍歷其所有元素,並將每個元素替換爲未旋轉地圖中的相應元素。通過將元素的座標提供給函數f(x,y),可以獲得相應元素的座標。

現在爲f(x,y):此功能可以通過組合3 affine transformations matrices來構建,這將旋轉關於碰撞圖中心的座標。
我應該在以後的時間解釋這個:-)

這些方程給你對應的座標(x,y)元素的(x',y')座標:

x' = c * x + s * y - a * (1 - c - s) 
y' = -s * x + c * y - a * (1 - c + s) 

其中

c = cos(-theta) 
s = sin(-theta) 
a = +0.5 - 0.5 * N 
N = side length of your square collision map (i.e. 16) 
theta = angle of clockwise rotation 
     (but effectively counter-clockwise for the way that you 
     usually visualize arrays, i.e. y-axis pointing downwards) 

所以f(x,y)是函數返回x'y'

經過這些浮點計算後,您需要將結果座標(x',y')正確地四捨五入爲最接近的整數值。當這些圓角座標位於數組外部時,則不存在相應的元素,並且應該使用0作爲該元素的值(或者任何值代表水平地形或無碰撞)。

將座標舍入爲整數給出nearest-neighbor interpolation
另一種選擇是bilinear interpolation,其中您將平均最接近小數座標的4個元素的值。 (示例:2.4, 5.7,你會在2,52,63,5,並且3,6平均元素的值。)

+0

非常感謝你。我花了一些時間來了解你寫的東西,但我終於得到了它的工作:) – ptr0x

+0

你可能總是要求澄清:-)在這種情況下,我無法推斷你的背景。當您添加「數學」標籤但沒有編程語言標籤時,我試圖給出解釋而不是代碼片段。 (雖然代碼片段的寫入和理解速度可能會更快......) – Norman

+0

是的,我應該寫一些關於編程的標籤,但我很容易使用您的alghoritm。我花了一些時間學習插值和東西,我不知道的東西。 – ptr0x