大圆距赤道面NAN值及计算角度
NAN value and computing angle in equatorial plane with great-circle distance
我正在开发一个小代码,我需要用它来计算赤道平面中的角度差(即经度差)作为大圆平面中角度差的函数(由给定的纬度参数化) .
我使用了 this wikipedia link 中的以下公式:
d(sigma) = arcos (sin(phi1).sin(phi2) + cos(phi1).cos(phi2).cos(d(lambda))
目标是计算 d(lambda)
角度差。在我的代码中,输入参数是:
radius = 50
phi1 = 0
phi2 = initial latitude describe below
d(sigma) = (distance / theta) where theta is the local angle in great circle plane and distance is the perimeter of this great circle.
大圆平面内的局部角度theta
从0
开始递增0.01 step
.
知道 phi1
、phi2
、distance
和 theta
,我可以将 d(lambda)
表达为(用 Javascript 语言):
var distance = radius*Math.abs(theta);
var deltaLambda = Math.acos(Math.cos(distance/radius) / Math.cos(angleTheta));
其中 angleTheta
是起点的纬度(由 coordTorus
THREE.Vector3 标识)并且等于 :
var angleTheta = Math.atan(coordTorus.y / Math.sqrt(coordTorus.x * coordTorus.x + coordTorus.z * coordTorus.z));
我的问题是,对于 angleTheta
等于 0
的初始值,初始 theta
值等于 0
,然后计算 deltaLambda
很好,但在其他情况下则不然:
让我们以 angleTheta = PI/4
和 theta = 0
的初始值为例,然后我有一个 NAN value
对应 deltaLambda
因为在上面的公式中,我得到:
var deltaLambda = Math.acos(Math.cos(0.5/50) / Math.cos(Math.PI/4));
所以我得到 Math.acos(sqrt(2)) = NAN
我怎样才能规避这个问题并找到一个技巧,使 Math.accos
中的值保持在 [-1,1]
区间内?
我在上面看到 link 还有其他计算大圆距离的公式,但我需要用这些公式隔离 d(lambda)
变量,我的意思是 [=14= 的符号表达式] 作为其他参数的函数。
如果有人能给出另一个一致的公式或找到避免的方法NAN value error
,那就太好了。
提前致谢。
不可能lat1=0,lat2=45 大圆距离是半径的1/100!最小可能的 d 是 Sqrt(2)/2 * R
。所以你拿非法起始数据来计算。
另一个问题 - 从笛卡尔坐标获取纬度的公式错误。 Right one:
lat = Arccos(z/R)
or
lat = atan(Sqrt(x^2+y^2) / z)
我正在开发一个小代码,我需要用它来计算赤道平面中的角度差(即经度差)作为大圆平面中角度差的函数(由给定的纬度参数化) .
我使用了 this wikipedia link 中的以下公式:
d(sigma) = arcos (sin(phi1).sin(phi2) + cos(phi1).cos(phi2).cos(d(lambda))
目标是计算 d(lambda)
角度差。在我的代码中,输入参数是:
radius = 50
phi1 = 0
phi2 = initial latitude describe below
d(sigma) = (distance / theta) where theta is the local angle in great circle plane and distance is the perimeter of this great circle.
大圆平面内的局部角度theta
从0
开始递增0.01 step
.
知道 phi1
、phi2
、distance
和 theta
,我可以将 d(lambda)
表达为(用 Javascript 语言):
var distance = radius*Math.abs(theta);
var deltaLambda = Math.acos(Math.cos(distance/radius) / Math.cos(angleTheta));
其中 angleTheta
是起点的纬度(由 coordTorus
THREE.Vector3 标识)并且等于 :
var angleTheta = Math.atan(coordTorus.y / Math.sqrt(coordTorus.x * coordTorus.x + coordTorus.z * coordTorus.z));
我的问题是,对于 angleTheta
等于 0
的初始值,初始 theta
值等于 0
,然后计算 deltaLambda
很好,但在其他情况下则不然:
让我们以 angleTheta = PI/4
和 theta = 0
的初始值为例,然后我有一个 NAN value
对应 deltaLambda
因为在上面的公式中,我得到:
var deltaLambda = Math.acos(Math.cos(0.5/50) / Math.cos(Math.PI/4));
所以我得到 Math.acos(sqrt(2)) = NAN
我怎样才能规避这个问题并找到一个技巧,使 Math.accos
中的值保持在 [-1,1]
区间内?
我在上面看到 link 还有其他计算大圆距离的公式,但我需要用这些公式隔离 d(lambda)
变量,我的意思是 [=14= 的符号表达式] 作为其他参数的函数。
如果有人能给出另一个一致的公式或找到避免的方法NAN value error
,那就太好了。
提前致谢。
不可能lat1=0,lat2=45 大圆距离是半径的1/100!最小可能的 d 是 Sqrt(2)/2 * R
。所以你拿非法起始数据来计算。
另一个问题 - 从笛卡尔坐标获取纬度的公式错误。 Right one:
lat = Arccos(z/R)
or
lat = atan(Sqrt(x^2+y^2) / z)