具有大圆距离的赤道平面的NAN值和计算角度

时间:2016-11-09 06:59:08

标签: javascript math geometry computational-geometry nan

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

我使用了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是起点的纬度(由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/4theta = 0的初始值为例,然后NAN valuedeltaLambda,因为在上面的公式中,我得到:

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的方法,那就太好了。

提前致谢。

1 个答案:

答案 0 :(得分:0)

对于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)