假设我有一个3D单位球体模型,我用
计算一个3D点x = cos(lat) * cos(lon)
y = cos(lat) * sin(lon)
z = sin(lat)
现在假设我给出了一个以度为单位的罗盘,其中0表示朝向真北(纬度= 90°)。
如何计算与[x,y,z]正交的三维轴承矢量,即朝向罗盘轴承的切线矢量。
答案 0 :(得分:0)
假设你有一个带有大地坐标lat,lon和笛卡尔坐标x,y,z的点P.另一个方便的坐标系是以地心为中心的坐标系,以P:(u,v,w)为中心,其中u向北是正向,v向东是正向,而在沿着P的切平面法线向上是正向。
以地心为中心和笛卡尔坐标由
相关联(u) = M*(X-x)
(v) = (Y-y)
(w) = (Z-z)
where
M = ( 1 0 0) * Ry(lat-90) * Rz(lon-180)
( 0 -1 0)
( 0 0 1)
and Ry is the usual 3d rotation about the y axis etc
或走另一条路
(X) = (x) + N*(u)
(Y) (y) + (v)
(Z) (z) + (w)
where
N = Rz(180-lon)*Ry(90-lat)*(1 0 0)
(0 -1 0)
(0 0 1)
在以地心为中心的坐标中,罗盘角度为c的单位矢量为
( cos(c))
( sin(c))
( 0 )
如果您在上面应用N,您将在笛卡尔中获得相应的矢量。
答案 1 :(得分:0)
要定义问题,假设我们有一个点 Po =(Xo,Yo, Zo)在单位球上,我们想要找到 Po 的切线 朝向极点 N =(0,0,1)。
我的解决方案使用了所述切线的参数化描述 辅助变量 a , P = P(a)。
在上图中我们有
在代码中,假设您的某个类Point
类
背包,
def P_tan(a, Po):
Xo, Yo, Zo = Po
Xp, Yp, Zp = 0, 0, 1/Zo
X = Xp + a*(Xo-Xp) # X(0)=Xp, X(1)=Xo
Y = Yp + a*(Yo-Tp) # Y(0)=Yp, Y(1)=Yo
Z = Zp + a*(Zo-Zp) # Z(0)=Zp, Z(1)=Zo
return Point(X, Y, Z)
如果我们对切线文字的组成部分更感兴趣
def tan_versor(Po):
Xo, Yo, Zo = Po
Xp, Yp, Zp = 0, 0, 1/Zo
dX, dY, dZ = Xp-Xo, Yp-Yo, Zp-Zo
length = sqrt(dX**2+dY**2+dZ**2)
return dX/length, dY/length, dZ/length,
请注意,定向线向外,而反面 走向最近的极点(由于 Zo 有一个符号......)。最后但是 尤其是, Zo = 0 需要特殊情况。