2016-01-28 2 views
0

Итак, у меня есть система, которая содержит кластер позиций в позициях. Кластера хранится в массиве следующим образом:Вращение динамического трехмерного массива позиций

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

Вам понадобится матрица вращения.

Матрица вращения - это матрица, которая при умножении на вектор приводит к вращению этого вектора.

существует три типа матриц вращения

вращение вокруг оси х

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, то нового вектора х-координата будет (первая строка матрицы):

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

Так первая запись в строке умножается x, то второй с y и так далее. Вставьте правильные углы, все, что вы сделали.

Поскольку косинус и синус всегда равны -1, 0 или 1 для степеней, кратных 90 °, соответствующий расчет может быть улучшен, чтобы не использовать фактические синусоидальные и косинусные функции.

 Смежные вопросы

  • Нет связанных вопросов^_^