Извлечь произвольно повернутую плоскость данных из трехмерного массива как двумерный массив - PullRequest
6 голосов
/ 31 января 2012

У меня есть 3D-матрица данных в Matlab, но я хочу извлечь произвольно повернутый фрагмент данных из этой матрицы и сохранить его в виде 2D-матрицы, к которой я могу получить доступ.Подобно тому, как функция slice () отображает данные, разрезанные под любым углом, за исключением того, что я также хотел бы иметь возможность просматривать и изменять данные, как если бы они были массивом.

У меня есть координаты оси вращения.точки плоскости, а также углы поворота (по осям x, y и z), я также рассчитал уравнение плоскости в виде:

Ax + By + Cz = D

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

Еще один способ сделать это - как-то повернуть матрицу источника в противоположном направлении.угол плоскости, чтобы выровнять плоскость данных с осью XY и просто извлечь эту часть матрицы, но я не знаю, возможно ли вращение такой матрицы.

Iнадеюсь, что это не было ответа в другом месте, я гуглил это весь день, но ни одна из проблем, кажется, точно не соответствует моей.

Спасибо

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Вы можете взглянуть на код здесь . Я думаю, что функция похожа на то, что вы пытаетесь решить.

Функция извлекает произвольную плоскость из объема , учитывая размер плоскости, центральную точку плоскости и нормаль к плоскости, т.е. [A, B, C]. Он также выводит объемный индекс и координаты каждого пикселя на плоскости.

0 голосов
/ 31 января 2012

Aha! Возможно, только что решил это сам.

Чтобы получить уравнение плоскости, я поворачиваю вектор нормали (0,0,1), используя матрицы вращения, а затем нахожу D. Если я также вращаю следующие векторы:

(1,0,0) //step in the x direction of our 2D array

и

(0,1,0) //step in the y direction of our 2D array

У меня будут градиенты, которые обозначают, насколько мои координаты в x, y, z должны измениться, прежде чем я перейду к следующему столбцу в моем массиве или к следующей строке.

Я макетирую это как можно скорее и отмечу это как ответ, если это работает

РЕДАКТИРОВАТЬ: Хорошо, небольшое изменение, когда я вращаю свои векторы, я должен также вращать точку в трехмерном пространстве, которая представляет координаты XYZ x = 0, y = 0, z = 0 (хотя я вращаюсь вокруг центр структуры, так что на самом деле это -sizex / 2, -sizey / 2, -sizez / 2, где size это размер данных, а затем я просто добавляю size / 2 к каждой координате после поворотов, чтобы перевести их обратно где это должно быть).

Теперь, когда у меня есть изменение градиента в 3D, когда я увеличиваю координату x моего 2D-массива, и изменение градиента, когда я увеличиваю координату y, я могу просто перебрать все возможные координаты x и y (результирующий массив будет 50x50 для массива 50x50x50, я не уверен, что это будет для нерегулярных размеров, которые мне, в конечном счете, нужно будет обработать) в моем 2D-массиве и вычислить результирующие трехмерные координаты на моей плоскости в данных. Мое значение угла поворота служит отправной точкой. Ура!

Просто нужно разработать хороший тест для этого, охватывающий все углы, и тогда я одобрю это как ответ

...