【问题标题】:NAN value and computing angle in equatorial plane with great-circle distance大圆距赤道面NAN值及计算角度
【发布时间】:2017-03-22 22:37:06
【问题描述】:

我正在开发一个小代码,我需要用它计算赤道平面中的角度差(即经度差),作为大圆平面(由给定纬度参数化)中的角度差的函数。

我使用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.

大圆平面内的局部角度theta0 开始,以0.01 step 递增。

知道phi1phi2distancetheta,我可以将d(lambda)表示为(用Javascript语言):

var distance = radius*Math.abs(theta);
var deltaLambda = Math.acos(Math.cos(distance/radius) / Math.cos(angleTheta));

其中angleTheta是起点的纬度(由coordTorusTHREE.Vector3标识),等于:

var angleTheta = Math.atan(coordTorus.y / Math.sqrt(coordTorus.x * coordTorus.x + coordTorus.z * coordTorus.z));

我的问题是angleTheta的初始值等于0theta的初始值等于0,那么deltaLambda的计算是好的,但在其他情况下不是:

我们以angleTheta = PI/4theta = 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] 区间内?

我在上面的链接上看到还有其他计算大圆距离的公式,但我需要用这些公式隔离 d(lambda) 变量,我的意思是 d(lambda) 的符号表达式作为其他参数的函数。

如果有人可以给出另一个一致的公式或找到避免NAN value error的方法,那就太好了。

提前致谢。

【问题讨论】:

    标签: javascript math geometry computational-geometry nan


    【解决方案1】:

    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)
    

    【讨论】:

    • 好的,问题似乎来自 theta 起始角度(进入大圆的平面),但我不知道在这个局部平面中取哪个值以及赤道平面中的相应角度。
    猜你喜欢
    • 2019-06-22
    • 2011-01-06
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多