2016-01-28 58 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°的倍数度,根据计算可以提高到不使用实际的正弦和余弦函数。