【发布时间】: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.
大圆平面内的局部角度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是起点的纬度(由coordTorusTHREE.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] 区间内?
我在上面的链接上看到还有其他计算大圆距离的公式,但我需要用这些公式隔离 d(lambda) 变量,我的意思是 d(lambda) 的符号表达式作为其他参数的函数。
如果有人可以给出另一个一致的公式或找到避免NAN value error的方法,那就太好了。
提前致谢。
【问题讨论】:
标签: javascript math geometry computational-geometry nan