Найдите матрицу вращения, чтобы повернуть оси и переместить координаты точки от P0 до P1.

у меня есть точка зрения п 0 "=" [ Икс 0 , у 0 , г 0 ] . Я хочу повернуть оси так, чтобы новые координаты были п 1 "=" [ Икс 1 , у 1 , г 1 ] . Задайте следующие матрицы вращения:

р Икс "=" [ 1 0 0 0 потому что α грех α 0 грех α потому что α ] , р у "=" [ потому что β 0 грех β 0 1 0 грех β 0 потому что β ] , р г "=" [ потому что γ грех γ 0 грех γ потому что γ 0 0 0 1 ] и р Икс у г "=" р Икс р у р г .

Я хочу п 1 "=" р Икс у г п 0 и [ α , β , γ ] быть таким, что α , β , γ "=" 0 если п 1 "=" п 0 ; α , β "=" 0 если вращение можно получить, установив только γ ; α "=" 0 если вращение можно получить, установив только β и γ . Любой намек?

РЕДАКТИРОВАТЬ : После ответа JordiC: да, расстояние до начала координат одинаково для п 0 и п 1 ; я могу установить α "=" 0 и матрица вращения будет упрощена:

р "=" [ потому что β потому что γ потому что β грех γ грех β грех γ потому что γ 0 потому что γ грех β грех β грех γ потому что β ] .

Я нашел это: найти вращение, которое сопоставляет точку с ее целью , что кажется тем же вопросом.

Ответы (2)

Если вы используете только вращения для преобразования координат из P0 в P1, вам потребуется только 2 вращения для преобразования. Также расстояние до начала координат P0 и P1 должно быть одинаковым. В этом случае вы всегда можете учесть, что:

а = 0.

Так что вам нужно думать только в β и γ.

И β всегда будет 0, если z0 = z1.

Хорошо, я уточнил свой вопрос. Теперь у меня есть три тригонометрических уравнения с двумя неизвестными углами. Есть ли простой способ решить для β и γ ?

Хорошо, я нашел быстрое решение. Короткий пример с комментариями в Matlab.

% P0 and P1 are two vectors on a unit sphere:
P0 = randn(3, 1); P0 = P0 / norm(P0);
P1 = randn(3, 1); P1 = P1 / norm(P1);

% theta and phi are the respective spherical coordinates:
phi_0 = acos(P0(3));
theta_0 = atan2(P0(2), P0(1));
phi_1 = acos(P1(3));
theta_1 = atan2(P1(2), P1(1));

% Show that the coordinates are equivalent:
P0b = zeros(3, 1);
P0b(1) = sin(phi_0) .* cos(theta_0);
P0b(2) = sin(phi_0) .* sin(theta_0);
P0b(3) = cos(phi_0);
all(fix(1e12 * (P0 - P0b)) == 0)

% R1: Rotation matrix to move P0 to the north pole:
P0_y = -phi_0; P0_z = -theta_0;
R1 = [cos(P0_y) * cos(P0_z) -cos(P0_y) * sin(P0_z) sin(P0_y);
      sin(P0_z) cos(P0_z) 0;
     -sin(P0_y) * cos(P0_z) sin(P0_y) * sin(P0_z) cos(P0_y)];

% R2: Rotation matrix to move P1 to the north pole ...
P1_y = -phi_1; P1_z = -theta_1;
R2 = [cos(P1_y) * cos(P1_z) -cos(P1_y) * sin(P1_z) sin(P1_y);
      sin(P1_z) cos(P1_z) 0;
     -sin(P1_y) * cos(P1_z) sin(P1_y) * sin(P1_z) cos(P1_y)];
% ... and back to its original position:
R2 = R2 ^ (-1);

% Rotation matrix to move P0 to the north pole and from the north pole to P1
R = R2 * R1;

% New coordinates of P0 after rotation:
P0_rot = R * P0;

% Check that the new coordinates of P0 are the same as P1
all(fix(1e12 * (P0_rot - P1)) == 0)

% Rotation matrix to move back the rotated point P0 to its original coordinates
R_back = R^(-1);
% Coordinates rotated back
P0_rot_back = R_back * P0_rot;
% Check the new coordinates of P0, once rotated back:
all(fix(1e12 * (P0_rot_back - P0)) == 0)

Я надеюсь, что есть более очевидный способ сделать это, но на данный момент это решение работает нормально.