2016-11-09 71 views
0

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

我用下面的公式从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的初始值,初始theta值等于0,那么deltaLambda的计算是好的,但不是在其他情况下:

让我们例如angleTheta = PI/4theta = 0的初始值,然后我有deltaLambdaNAN value因为在上述公式,我得到:

var deltaLambda = Math.acos(Math.cos(0.5/50)/Math.cos(Math.PI/4)); 

所以我得到Math.acos(sqrt(2)) = NAN

我怎么能绕过这个问题,并找到一个窍门与内部值保持进入[-1,1]区间?

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

如果有人可以给出另一个一致的公式或找到一种方法来避免NAN value error,这将是很好的。

在此先感谢。

回答

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) 
+0

OK,这个问题似乎来自于THETA起始角(进入大圆面),但我不知道在这方面采取局部平面和赤道平面成相应角度的参数值。 – youpilat13