如何旋转保留一条子午线的球体?
How can I rotate a sphere preserving one meridian?
这是针对地球上的 latitude/longitude,所以我将使用这些术语,但我对球形地球近似感兴趣,不需要花哨的大地测量,只需三角学。我也可以处理 (ρ, θ, φ)。
我想做的是取一点 (lat, lon)
并旋转球体,以便:
(lat, lon)
变为 (0, 0)
.
lon
子午线成为新的本初子午线(旧北极和南极应出现在经度 0 / 180 的大圆上,纬度与 +/- 90 的偏移量为 lat
).
我需要能够获取球体上的任何其他点并计算它在这次旋转后将结束的位置——或者,如果找到变换点的 x、y、z 坐标会更容易,无需生成转换后的 latitude/longitude,这也很好。
我认为这是两个旋转的简单组合——一个围绕通过两极的轴 -lon
,另一个围绕在 lon ± 90°
处穿过赤道的轴 lon ± 90°
=17=],但我不确定这一点,而且我在数学上磕磕绊绊。
你已经差不多明白了。我将讨论笛卡尔变换。如果你想保持球坐标,四元数是其他人所说的方法。
假设原点在地心,x-axis在赤道本初子午线上伸出,y-axis在北极伸出。然后对于右手坐标系,z-axis 将以 -90 度在赤道上伸出。
让“lon”到达 x-y 平面需要绕 y-axis 旋转 -lon。然后再降到赤道需要再旋转-lat。
您可以使用 3d 仿射变换来表示这些:
[ cos(-lon) 0 sin(-lon) ] [ cos(lon) 0 -sin(lon) ]
Ry(-lon) = [ 0 1 0 ] = [ 0 1 0 ]
[-sin(-lon) 0 cos(-lon) ] [ sin(lon) 0 cos(lon) ]
[ cos(-lat) -sin(-lat) 0 ] [ cos(lat) sin(lat) 0 ]
Rz(-lat) = [ sin(-lat) cos(-lat) 0 ] = [-sin(lat) cos(lat) 0 ]
[ 0 0 1 ] [ 0 0 1 ]
你想要的变换是 T(p) = Rz * (Ry * p)。也就是说,将 y 旋转应用于 p,将 z 旋转应用于该结果。
但是根据矩阵乘法的结合律,我们可以说这等于(Rz * Ry) * p。也就是说,我们可以将矩阵相乘一次,然后在任意多的点上使用生成的复合旋转。
执行此乘法产生:
[ cos(lat) cos(lon) sin(lat) -cos(lat) sin(lon) ]
[-cos(lon) sin(lat) cos(lat) sin(lat) sin(lon) ]
[ sin(lon) 0 cos(lon) ]
让我们检查一下这是否真的有效。 (lat,lon) 的 (x,y,z) 坐标 - 假设地球有单位半径 - 是
x = cos(lat) cos(lon)
y = sin(lat)
z = -cos(lat) sin(lon)
乘以上面的矩阵,我们得到
x = cos^2(lat) cos^2(lon) + sin^2(lat) + cos^2(lat) sin^2(lon) = 1
y = -cos^2(lon) sin(lat) cos(lat) + cos(lat) sin(lat) - cos(lat) sin^2(lon) sin(lat) = 0
z = sin(lon) cos(lat) cos(lon) - cos(lat) sin(lon) cos(lon) = 0
我将这些插入 Wolfram Alpha 进行验证。
所以它似乎工作正常。换句话说,要变换球体上的任何其他点 (x, y, z),只需找到
A = cos(lat) cos(lon)
B = sin(lat)
C = -cos(lat) sin(lon)
D = -cos(lon) sin(lat)
E = cos(lat)
F = -sin(lat) sin(lon)
G = sin(lon)
H = cos(lon)
一次。然后用
变换
x' = A x + B y + C z
y' = D x + E y + F z
z' = G x + H z
根据需要多次。
nb:即使一次检查成功,请验证数学。这是一个漫长的一天。
这是针对地球上的 latitude/longitude,所以我将使用这些术语,但我对球形地球近似感兴趣,不需要花哨的大地测量,只需三角学。我也可以处理 (ρ, θ, φ)。
我想做的是取一点 (lat, lon)
并旋转球体,以便:
(lat, lon)
变为(0, 0)
.lon
子午线成为新的本初子午线(旧北极和南极应出现在经度 0 / 180 的大圆上,纬度与 +/- 90 的偏移量为lat
).
我需要能够获取球体上的任何其他点并计算它在这次旋转后将结束的位置——或者,如果找到变换点的 x、y、z 坐标会更容易,无需生成转换后的 latitude/longitude,这也很好。
我认为这是两个旋转的简单组合——一个围绕通过两极的轴 -lon
,另一个围绕在 lon ± 90°
处穿过赤道的轴 lon ± 90°
=17=],但我不确定这一点,而且我在数学上磕磕绊绊。
你已经差不多明白了。我将讨论笛卡尔变换。如果你想保持球坐标,四元数是其他人所说的方法。
假设原点在地心,x-axis在赤道本初子午线上伸出,y-axis在北极伸出。然后对于右手坐标系,z-axis 将以 -90 度在赤道上伸出。
让“lon”到达 x-y 平面需要绕 y-axis 旋转 -lon。然后再降到赤道需要再旋转-lat。
您可以使用 3d 仿射变换来表示这些:
[ cos(-lon) 0 sin(-lon) ] [ cos(lon) 0 -sin(lon) ]
Ry(-lon) = [ 0 1 0 ] = [ 0 1 0 ]
[-sin(-lon) 0 cos(-lon) ] [ sin(lon) 0 cos(lon) ]
[ cos(-lat) -sin(-lat) 0 ] [ cos(lat) sin(lat) 0 ]
Rz(-lat) = [ sin(-lat) cos(-lat) 0 ] = [-sin(lat) cos(lat) 0 ]
[ 0 0 1 ] [ 0 0 1 ]
你想要的变换是 T(p) = Rz * (Ry * p)。也就是说,将 y 旋转应用于 p,将 z 旋转应用于该结果。
但是根据矩阵乘法的结合律,我们可以说这等于(Rz * Ry) * p。也就是说,我们可以将矩阵相乘一次,然后在任意多的点上使用生成的复合旋转。
执行此乘法产生:
[ cos(lat) cos(lon) sin(lat) -cos(lat) sin(lon) ]
[-cos(lon) sin(lat) cos(lat) sin(lat) sin(lon) ]
[ sin(lon) 0 cos(lon) ]
让我们检查一下这是否真的有效。 (lat,lon) 的 (x,y,z) 坐标 - 假设地球有单位半径 - 是
x = cos(lat) cos(lon)
y = sin(lat)
z = -cos(lat) sin(lon)
乘以上面的矩阵,我们得到
x = cos^2(lat) cos^2(lon) + sin^2(lat) + cos^2(lat) sin^2(lon) = 1
y = -cos^2(lon) sin(lat) cos(lat) + cos(lat) sin(lat) - cos(lat) sin^2(lon) sin(lat) = 0
z = sin(lon) cos(lat) cos(lon) - cos(lat) sin(lon) cos(lon) = 0
我将这些插入 Wolfram Alpha 进行验证。
所以它似乎工作正常。换句话说,要变换球体上的任何其他点 (x, y, z),只需找到
A = cos(lat) cos(lon)
B = sin(lat)
C = -cos(lat) sin(lon)
D = -cos(lon) sin(lat)
E = cos(lat)
F = -sin(lat) sin(lon)
G = sin(lon)
H = cos(lon)
一次。然后用
变换x' = A x + B y + C z
y' = D x + E y + F z
z' = G x + H z
根据需要多次。
nb:即使一次检查成功,请验证数学。这是一个漫长的一天。