2016-01-28 89 views
0

因此,我有一個系統,其中包含位置的項目羣集。簇按如下方式存儲在一個陣列中:旋轉位置的動態3D陣列

int[,,] = int[length, width, height]; 

根據羣集的長度,寬度和高度都可能不同。如果我想用一組度(取值範圍爲0〜360)旋轉整個集羣:

double rX, double rZ, double rY 

如何確定每個項目和出口的新數組中的新位置?


我破獲的企圖都開始像這樣:

int iX = Math.Abs(rX/90), iZ = Math.Abs(rZ/90), iY = Math.Abs(rY/90); 
if (iY == 1) // 90 or -90 degrees 
{ 
    group.Length = (rY/90) * back.Width; 
    group.Width = (rY/90) * back.Length; 
} 
else if (iY == 2) // 180 degrees 
{ 
    group.Length *= -1; 
    group.Width *= -1; 
} 
if (iZ == 1) // 90 or -90 degrees 
{ 
    group.Length = (rZ/90) * back.Height; 
    group.Height = (rZ/90) * back.Length; 
} 
else if (iZ == 2) // 180 degrees 
{ 
    group.Length *= -1; 
    group.Height *= -1; 
} 
if (iX == 1) // 90 or -90 degrees 
{ 
    group.Width = (rX/90) * back.Height; 
    group.Height = (rX/90) * back.Width; 
} 
else if (iX == 2) // 180 degrees 
{ 
    group.Width *= -1; 
    group.Height *= -1; 
} 
for(int gX = 0; gX < group.Length; gX++) 
{ 
    for (int gZ = 0; gZ < group.Width; gZ++) 
    { 
     for (int gY = 0; gY < group.Height; gY++) 
     { 
      //I lose track here. 
     } 
    } 
} 

從那裏,我不知道哪裏去了。 group是我嘗試旋轉的羣集,而back是這些操作之前的group的副本。此組中的數組是這樣的:

Cluster.Items[,,] 

而且它的大小設置爲group的尺寸。該陣列基於X(長度)Z(寬度)Y(高度)軸。

我猜測答案與矩陣和翻轉某些軸有關。

+0

我想說的最好的方法是使用[旋轉矩陣](https://en.wikipedia.org/wiki/Rotation_matrix)(你已經標記了但可能不明白) – AntiHeadshot

+0

「但可能不會理解」 t理解「正確 –

+0

我不明白你的數據結構。 3d陣列擁有什麼?你要旋轉分離項目(在哪裏座標?)或集羣的邊框(應其結果永遠軸對齊?) –

回答

0

您將需要一個旋轉矩陣。

旋轉矩陣是一個矩陣,當與矢量相乘時,將導致該矢量的旋轉。

有三種類型的旋轉矩陣周圍

旋轉的X軸

Rx(a) = [ 1 0  0  0, 
      0 cos(a) -sin(a) 0, 
      0 sin(a) cos(a) 0, 
      0 0  0  1] 

圍繞y軸

Ry(a) = [ cos(a) 0 sin(a) 0, 
      0  1 0  0, 
      -sin(a) 0 cos(a) 0, 
      0  0 0  1] 

圍繞ANS旋轉Z軸

Rz(a) = [ cos(a) -sin(a) 0 0, 
      sin(a) cos(y) 0 0, 
      0  0  1 0, 
      0  0  0 0] 

更多墊子hs關於旋轉矩陣你會發現here

0

我還沒有確信你的數據結構。但讓我回答你的問題。

首先,指定旋轉的順序。在下面,我假設x,z,y的順序。然後,找到相應的旋轉矩陣(例如從here)。然後,將位置矢量與矩陣相乘以得到新的矢量。

如果舊矢量座標爲x, y, z,那麼新的矢量的x座標是(矩陣的第一行):

newX = x * cos(rZ) * cos(rY) - y * sin(rZ) + z * cos(rZ) * sin(rY) 

所以該行中的第一項乘以x,第二與y等。無論你做什麼,插入正確的角度。

由於餘弦和正弦總是-1,0或1是90°的倍數度,根據計算可以提高到不使用實際的正弦和餘弦函數。