北太天元科普: 测地线
北太天元卢朓
2024年07月21日 12:31
收录于文集
共74篇

飞机航线不是沿着地图上的直线

在地球上飞行时,飞机通常会选择一条特定的路径来确保飞行距离最短。这条路径在地球表面上看起来可能是一条曲线,但实际上,它是球面上的“测地线”,也称为大圆弧。那么,什么是测地线?为什么飞机会选择沿着这条路径飞行呢?

测地线的定义

在球面上,两点之间的最短距离并不是我们通常所想的直线段,因为直线段在球面上实际上是一段圆弧。这段圆弧就是测地线,它是球面上两点间距离最短的路径。

如何计算测地线的长度?

要计算球面上两点A和B之间的测地线长度,我们可以按照以下步骤进行:

要将球面上的两点A和B之间的大圆弧长计算出来,我们可以按照以下步骤进行:

1. 将球坐标转换为直角坐标

   设球心为O,半径为R。点A和B的球坐标分别为$A(R, \theta_1, \phi_1)$和$B(R, \theta_2, \phi_2)$,其中$\theta$是经度,$\phi$是纬度。转换为直角坐标:

   %20%20%20A%20%3D%20(R%5Ccos%5Cphi_1%5Ccos%5Ctheta_1%2C%20R%5Ccos%5Cphi_1%5Csin%5Ctheta_1%2C%20R%5Csin%5Cphi_1)

   B%20%3D%20(R%5Ccos%5Cphi_2%5Ccos%5Ctheta_2%2C%20R%5Ccos%5Cphi_2%5Csin%5Ctheta_2%2C%20R%5Csin%5Cphi_2)

   

2. 计算向量OA和OB:

   向量$\vec{OA} = A - O = A$,向量$\vec{OB} = B - O = B$。

3. 计算角AOB的余弦值:

   使用点积公式计算$\cos\angle AOB$:

   %20%20%20%5Ccos%5Cangle%20AOB%20%3D%20%5Cfrac%7B%5Cvec%7BOA%7D%20%5Ccdot%20%5Cvec%7BOB%7D%7D%7B%7C%5Cvec%7BOA%7D%7C%20%7C%5Cvec%7BOB%7D%7C%7D%20%3D%20%5Cfrac%7BA%20%5Ccdot%20B%7D%7BR%5E2%7D

      其中点积  A%20%5Ccdot%20B%20%3D%20R%5E2(%5Ccos%5Cphi_1%5Ccos%5Cphi_2%5Ccos(%5Ctheta_1%20-%20%5Ctheta_2)%20%2B%20%5Csin%5Cphi_1%5Csin%5Cphi_2) 。

4. 计算角AOB:

   通过 $\cos\angle AOB$计算$\angle AOB$:

%20%20%20%5Cangle%20AOB%20%3D%20%5Carccos%5Cleft(%5Ccos%5Cphi_1%5Ccos%5Cphi_2%5Ccos(%5Ctheta_1%20-%20%5Ctheta_2)%20%2B%20%5Csin%5Cphi_1%5Csin%5Cphi_2%5Cright)%0A%0A

5. 计算大圆弧长:

   弧长$L$由半径R和角度$\angle AOB$决定:

   %20%20%20L%20%3D%20R%20%5Ctimes%20%5Cangle%20AOB%20%3D%20R%20%5Ctimes%20%5Carccos%5Cleft(%5Ccos%5Cphi_1%5Ccos%5Cphi_2%5Ccos(%5Ctheta_1%20-%20%5Ctheta_2)%20%2B%20%5Csin%5Cphi_1%5Csin%5Cphi_2%5Cright)

   这样,我们就得到了球面上两点A和B之间的大圆弧长的计算公式。

为什么飞机沿着测地线飞?

当飞机在地球上飞行时,为了飞行距离最短,它应该沿着测地线飞行。这是因为测地线是球面上两点间的最短路径。如果飞机选择其他路径飞行,那么它将不得不飞行更长的距离才能到达目的地。

因此,飞行员在规划航线时,会考虑地球的曲率,并选择沿着测地线飞行的路线。这样不仅可以节省燃料和时间,还可以确保飞行的安全性和效率。所以,下次当你乘坐飞机时,你可以想象一下,你正在沿着地球表面的“最短路径”飞行呢!

代码块
JavaScript
自动换行
复制代码
% 地球的平均半径(千米)  
R = 6371;  
  
% 定义两个点的经纬度(弧度)  
维度1 = -pi/4; % 45度南纬  
经度1 = pi/4; % 45度东经  
维度2 = pi/3; % 60度北纬  
经度2 = pi/6; % 30度东经  
  
% 将经纬度转换为笛卡尔坐标  
x1 = R * cos(维度1) * cos(经度1);  
y1 = R * cos(维度1) * sin(经度1);  
z1 = R * sin(维度1);  
x2 = R * cos(维度2) * cos(经度2);  
y2 = R * cos(维度2) * sin(经度2);  
z2 = R * sin(维度2);  
  
% 计算两点之间的大圆弧距离(千米)  
d = R * acos(sin(维度1) * sin(维度2) + cos(维度1) * cos(维度2) * cos(经度2 - 经度1));  
  
% 绘制地球和两点  
figure;  
subplot(2,2,1);  
hold on;  
axis equal;  
grid on;  
xlabel('X');  
ylabel('Y');  
zlabel('Z');  
title('球面上两点');  
[x, y, z] = sphere(50);  
surf(R*x, R*y, R*z, 'FaceColor', [0.7 0.7 1], 'EdgeColor', 'none');  
plot3([x1 x2], [y1 y2], [z1 z2], 'r-', 'LineWidth', 2);  
plot3(x1, y1, z1, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'r');  
plot3(x2, y2, z2, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'g');  
view(3);  
  
% 绘制球面三角形OAB  
subplot(2,2,2);  
hold on;  
axis equal;  
grid on;  
xlabel('X');  
ylabel('Y');  
zlabel('Z');  
title('球面三角形OAB');  
plot3([0 x1], [0 y1], [0 z1], 'b-', 'LineWidth', 2); % OA  
plot3([0 x2], [0 y2], [0 z2], 'b-', 'LineWidth', 2); % OB  
plot3([x1 x2], [y1 y2], [z1 z2], 'r--', 'LineWidth', 2); % AB(近似直线)  
plot3(0, 0, 0, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'k'); % O点  
plot3(x1, y1, z1, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); % A点  
plot3(x2, y2, z2, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'g'); % B点  
view(3);  
  
% 绘制夹角∠AOB  
subplot(2,2,3);  
hold on;  
axis equal;  
grid on;  
xlabel('X');  
ylabel('Y');  
zlabel('Z');  
title('夹角∠AOB');  
plot3([0 x1], [0 y1], [0 z1], 'b-', 'LineWidth', 2); % OA  
plot3([0 x2], [0 y2], [0 z2], 'b-', 'LineWidth', 2); % OB  
% 绘制夹角∠AOB的平面(近似)  
normal = [x2-x1, y2-y1, z2-z1]; % AB向量的法向量(近似为角平分线)  
pointOnPlane = [(x1+x2)/2, (y1+y2)/2, (z1+z2)/2]; % 平面上的一个点(AB中点)
d = -dot(normal, pointOnPlane); % 平面方程的点法式系数  
[xPlane, yPlane] = meshgrid(-R:R/10:R, -R:R/10:R);  
zPlane = (-normal(1)*xPlane - normal(2)*yPlane - d) / normal(3);  
mesh(xPlane, yPlane, zPlane, 'FaceColor', 'none', 'EdgeColor', 'k');  
view(3);  
  
% 绘制最终的大圆弧AB  
subplot(2,2,4);  
hold on;  
axis equal;  
grid on;  
xlabel('X');  
ylabel('Y');  
zlabel('Z');  
title('大圆弧AB');  
[x, y, z] = sphere(50);  
surf(R*x, R*y, R*z, 'FaceColor', [0.7 0.7 1], 'EdgeColor', 'none');  
% 这里我们实际上无法直接绘制真正的大圆弧,所以使用直线近似表示  
plot3([x1 x2], [y1 y2], [z1 z2], 'r-', 'LineWidth', 2); % 近似直线AB  
% 更好的做法是使用更多的点来近似大圆弧  
numPoints = 100;  
latInterp = linspace(维度1, 维度2, numPoints);  
lonInterp = linspace(经度1, 经度2, numPoints);  
xInterp = R * cos(latInterp) .* cos(lonInterp);  
yInterp = R * cos(latInterp) .* sin(lonInterp);  
zInterp = R * sin(latInterp);  
plot3(xInterp, yInterp, zInterp, 'g-', 'LineWidth', 2); % 近似大圆弧AB  
plot3(x1, y1, z1, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); % A点  
plot3(x2, y2, z2, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'g'); % B点  
view(3);
复制成功