У меня есть некоторые точки в координатной системе координат ECEF , и я хотел бы повернуть их на заданную широту и долготу.Основная идея того, что я пытаюсь сделать, это
rotated_vector = Rz(longitude_in_radians) * Rx(latitude_in_radians) * vector
, где vector
- это позиция 3x1 ECEF, а Rz и Rx - это матрицы 3x3, определенные здесь .
Основная проблема, которую я получаю, заключается в том, что вращение вокруг оси Z соответствует ожидаемому, но вектор, кажется, не вращается вокруг оси X.
Я пытался сделать это как в Python, так и в Matlab, и я получаю одинаковый результат в обоих случаях.
Мой код Matlab выглядит следующим образом, так как он немного короче, чем мой код Python
close; clc; clear;
R = 6378; %earth radius
r = 500;
alt = 200; %altitude of point
d = R + alt; %offset of small sphere along x axis
alpha = 1/(2*d)*sqrt(4*d^2*R^2-(d^2-r^2+R^2)^2); %radius of circle intersection of two spheres
%% plotting spheres
[x,y,z] = sphere; %data for sphere of radius 1 at 0,0,0
figure
surf(R*x,R*y,R*z) %plot earth
hold on
%% plot the circle of intersection
theta = 0 : 0.01 : 2*pi;
yc = alpha*cos(theta);
zc = alpha*sin(theta);
xc = theta*0 + sqrt(R^2 - alpha^2);
plot3(xc,yc,zc,'r', 'LineWidth',6)
axis equal
%% carry out the rotation
theta_z = 90 * pi/180;
theta_x = 45 * pi/180; % no matter what I enter here, the vector never leaves the x-y plane
theta_y = theta_x;
Rx = [1, 0, 0 ;
0, cos(theta_x), -sin(theta_x) ;
0, sin(theta_x), cos(theta_x)];
Ry = [cos(theta_y), 0, sin(theta_y);
0 , 1, 0 ;
-sin(theta_y), 0, cos(theta_y)];
Rz = [cos(theta_z), -sin(theta_z), 0;
sin(theta_z), cos(theta_z), 0;
0 , 0, 1];
rotated = Rz * Rx * [xc; yc; zc];
plot3(rotated(1,:), rotated(2,:), rotated(3,:), 'r', 'LineWidth',6)