2016-11-09 4 views
0

Je développe un petit code avec lequel j'ai besoin de calculer la différence d'angles dans le plan équatorial (ie la différence de longitudes) en fonction de la différence d'angles dans un grand plan de cercle (paramétré par une latitude donnée).Valeur NAN et angle de calcul dans le plan équatorial avec grande distance

I utilisé la formule suivante à partir de this wikipedia link:

d(sigma) = arcos (sin(phi1).sin(phi2) + cos(phi1).cos(phi2).cos(d(lambda)) 

Le but est de calculer la différence d'angle d(lambda). Dans mon code, les paramètres d'entrée sont les suivants:

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.

angle local theta dans grand plan du cercle commence à partir 0 et est incrémentée par 0.01 step.

Sachant phi1, phi2, distance et theta, je peux exprimer d(lambda) comme (en langage Javascript):

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

angleTheta est la latitude du point de départ (identifié par coordTorus THREE.Vector3) et égale à :

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

Mon problème est que, pour une valeur initiale de angleTheta égale à 0, une valeur theta initiale égale à 0, le calcul de deltaLambda est bon, mais pas dans d'autres cas:

Prenons par exemple une valeur initiale de angleTheta = PI/4 et theta = 0, j'ai un NAN value pour deltaLambda parce que dans ce qui précède formule, je reçois:

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

Je reçois Math.acos(sqrt(2)) = NAN

Comment pourrais-je contourner ce problème et trouver une astuce avec laquelle la valeur à l'intérieur Math.accos reste dans l'intervalle ?

J'ai vu sur le lien ci-dessus il y avait d'autres formules pour calculer la distance grand-cercle, mais j'ai besoin d'isoler la variable d(lambda) avec ces formules, je veux dire une expression symbolique de d(lambda) en fonction d'autres paramètres.

Si quelqu'un pouvait donner une autre formule cohérente ou trouver un moyen d'éviter NAN value error, ce serait bien.

Merci d'avance.

Répondre

0

Il est impossible que pour lat1 = 0, lat2 = 45 la distance du grand cercle soit 1/100 du rayon! Minimal possible d est Sqrt(2)/2 * R. Donc, vous prenez des données de départ illégales pour les calculs.

Un autre problème - une mauvaise formule pour obtenir la latitude des coordonnées cartésiennes.Right one:

lat = Arccos(z/R) 
or 
lat = atan(Sqrt(x^2+y^2)/z) 
+0

ok, la question semble provenir de l'angle de départ de thêta (en plan du grand cercle) mais je ne sais pas quelle valeur à prendre dans ce plan local et l'angle correspondant dans le plan équatorial. – youpilat13