Как вычислить матрицу вращения в n измерениях, учитывая точку вращения, угол поворота и ось вращения (подпространство n-2) - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы вычислить матрицу вращения (nxn) в n-мерном пространстве, учитывая следующее:

  1. Точка для поворота.
  2. Угол поворота.
  3. Ось вращения (подпространство (n-2) , которое проходит через начало координат, заданное (n-2) единичными векторами, которые охватывают подпространство).
  4. конечная точка поворота.

Я думаю, что число 4 (конечная точка поворота) является избыточным, и можно вычислить матрицу вращения без нее. Но у меня есть все.

Есть ли функция matlab, которая уже реализует ее? Я знаю, что есть функция для n = 3 (vrrotvec2mat) . Но я не нашел никакой функции для общего n . Если такой функции нет, кто-нибудь здесь может показать мне, как ее вычислить, чтобы я мог написать функцию?

Я даже не уверен, существует ли уникальная матрица вращения для общего n . Если их больше одного, я не против, какую матрицу вращения использовать.

Буду признателен за любую помощь.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

, если у вас были ортонормированные векторы u и v, которые охватывают ортогональное дополнение вашего подпространства n-2, или, другими словами, если w (1) .. w (n-2) - векторы, которые охватывают n-2подпространство, если бы у вас были векторы u и v так, чтобы оба были ортогональны всем w и были ортогональны друг другу и длине 1, то создание требуемой матрицы M было бы прямым.

Определитематрица nx2 P должна иметь u в качестве первого столбца и v в качестве второго, и пусть R будет обычной матрицей вращения 2x2 на угол.Тогда

M = I + P*(R-i)*P'

(здесь я - тождество nxn, а я - 2x2)

(Если ты хочешь, я расширю этот ответ, чтобы аргументировать, почему это (уникальная) матрицавам нужно).

Сложно было бы заполучить векторы u и v, если у вас их нет.

Если у вас есть проекционная матрица Q на n-2dim подпространство, тогда вы можете найти u и v, найдя (ортонормированный) базис для нуль-пространства Q. Однако здесь есть раздражающая деталь.Если вы используете u, v, как указано выше, вы получите одну «матрицу вращения», тогда как, если вы поменяете их местами, вы получите другую.Я помещаю матрицу вращения в кавычки, потому что у одного из них будет определитель 1, и поэтому у него будет вращение, а у другого будет определитель -1.

Матрица выше всегда будет иметь тот же определитель, что и R, как можетможно увидеть, используя определитель Сильвестра и тот факт, что P '* P = i.

Однако, представляет ли оно вращение на заданный угол, довольно туманно.Предположим, кто-то выбрал другой базис для ортогонального дополнения, и поэтому использовал матрицу 2xn Q вместо P. Поскольку они представляют разные (ортогональные) базисы одного и того же пространства, существует ортогональная матрица 2x2 S, скажем, с Q = S * P.Таким образом, матрица, построенная с использованием Q, имеет вид

N = I + P*S'*(R-i)*S*P'

Если на самом деле S - это вращение, все в порядке, а N и M будут одинаковыми.Но если S имеет определитель -1, например,

S = ( 0 1 )
    ( 1 0 )

Тогда

S'*(R-i)*S = R'-i

, и поэтому мы изменили угол поворота!

0 голосов
/ 15 мая 2018

У меня есть частичный ответ для вас.Ответ на первый вопрос заключается в том, что в AFAIK нет встроенной функции MATLAB для построения n-мерной матрицы вращения.

Однако есть интересный подход, описанный в следующей статье:

Агилера, Антонио и Рикардо Перес-Агила.«Общие n-мерные повороты».(2004).

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

Я реализовал псевдокод, описанный в статье, слегка изменив его, чтобы удалитьнеобязательный компонент перевода и однородные координаты (в любом случае не уверен, почему это будет частью матрицы вращения!).Я также изменил его, чтобы построить матрицу предварительного умножения, а не матрицу постумножения.т.е. мы вращаем вектор-столбец x, используя y = R*x.Это соответствует соглашению, используемому vrrotvec2mat для трехмерного вращения.


  • Основа подпространства задается как v, что является n -by- n-2матрица.
  • Угол поворота относительно подпространства задается как theta в радианах.

% Implementation of the Aguilera-Perez Algorithm.
% Aguilera, Antonio, and Ricardo Pérez-Aguila. "General n-dimensional rotations." (2004).
function M = rotmnd(v,theta)
    n = size(v,1);
    M = eye(n);
    for c = 1:(n-2)
        for r = n:-1:(c+1)
            t = atan2(v(r,c),v(r-1,c));
            R = eye(n);
            R([r r-1],[r r-1]) = [cos(t) -sin(t); sin(t) cos(t)];
            v = R*v;
            M = R*M;
        end
    end
    R = eye(n);
    R([n-1 n],[n-1 n]) = [cos(theta) -sin(theta); sin(theta) cos(theta)];
    M = M\R*M;

Это не полностью отвечает на ваш вопрос, как я считаюЕсть два направления, чтобы вращаться вокруг подпространства (или, может быть, больше? Я даже не знаю, как думать о вращении в пространстве более высокого измерения).В вашем вопросе неясно, что направление базисных векторов описывает направление вращения.

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


Примеры использования

эквивалент vrrotvec2mat

>> R1 = rotmnd([1; 2; 3], pi/4)
R1 =
    0.7280   -0.5251    0.4407
    0.6088    0.7908   -0.0635
   -0.3152    0.3145    0.8954

>> R2 = vrrotvec2mat([1; 2; 3; pi/4])
R2 =
    0.7280   -0.5251    0.4407
    0.6088    0.7908   -0.0635
   -0.3152    0.3145    0.8954

4-й поворот

>> v = [1 0;
        0 1;
        1 0;
        0 1];
>> R = rotmnd(v, pi/4)
R =
    0.8536   -0.3536    0.1464    0.3536
    0.3536    0.8536   -0.3536    0.1464
    0.1464    0.3536    0.8536   -0.3536
   -0.3536    0.1464    0.3536    0.8536

>> x = [0; 0; 0; 1];
>> y = R*x
y =
    0.3536
    0.1464
   -0.3536
    0.8536

Интересное примечание Из статьи, по-видимому, допущена ошибка в определении общей матрицы для основных вращений (она транспонирована).Это можно наблюдать, сравнивая матрицу вращения в уравнении (которая R_ {1,2}) с определением общей матрицы вращения главной оси, которая транспонируется.Эта ошибка привела к некоторому «веселью» при реализации алгоритма.


PS Очень похожий подход, который может обеспечить понимание, описан в:

Хансон, Эндрю Дж. «4 вращения для N-мерной графики».Graphics Gems V. 1995. 55-64.

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

...