2014-06-29 11 views
2

Dans le cadre d'un projet plus important, je développe une bibliothèque JavaScript qui va m'aider à générer des éphémérides pour à peu près tout ce que vous voulez. La pièce actuelle sur laquelle je travaille est la conversion de coordonnées. En tant que projet de testeur, je génère une liste de degrés sur l'écliptique (c'est-à-dire la longitude 34, la latitude 0) et leurs azimuts horizontaux correspondants pour un temps et un lieu donnés. Le problème que j'obtiens est qu'au milieu, entre les degrés écliptiques 155 et 334, tout l'azimut saute dans la gamme 20000. Qu'est-ce qui ne va pas?Bug avec conversion de coordonnées astronomiques

Le script HTML:

function main() { 
    var i, e, h, op; 
    var olon = -121.46888; 
    var olat = 38.55556; 
    var jd = julian(1971,3,21,6,38,0); 
    var ecl = getNuta(jd).ecl; 
    op = "Equinoctal Az by Ecl Degree<br><br>" 
    for (i = 0; i < 360; i++) { 
     e = eclEqu(i, 0, ecl); 
     h = equHor(e.ra, e.dec, olat, lst(jd, olon)); 
     op += "Ecl: " + i + " = Hor: " + h.az.toFixed(3) + "<br>" 
    } 

    document.write(op); 
} 

Et les fonctions de conversion:

function eclEqu(lambda, beta, ecl) { 
    // Converts ecliptic to equatorial 
    // -> 3x float in degrees 
    // <- {ra:, dec:} 2x float in hours, degrees 

    var l, b, e, a, d, up, dn; 
    l = lambda * co.dtr; 
    b = beta * co.dtr; 
    e = ecl * co.dtr; 
    up = Math.sin(l) * Math.cos(e) - Math.tan(b) * Math.sin(e); 
    dn = Math.cos(l); 
    a = Math.atan2(up,dn); 
    d = Math.asin(Math.sin(b) * Math.cos(e) 
     + Math.cos(b) * Math.sin(e) * Math.sin(l)); 
    return {ra: a * co.rth, dec: d * co.rtd}; 
} 

function equHor(alpha, delta, phi, lst) { 
    // Converts equatorial to horizontal 
    // -> 4x float, in hrs, deg, deg (obs. lat), and hrs 
    // <- {az:, alt:} 2x float in deg 

    var d, p, ha, A, h, up, dn; 
    d = delta * co.dtr; 
    p = phi * co.dtr; 
    ha = (lst - alpha) * co.htr; 
    up = Math.sin(ha); 
    dn = Math.cos(ha) * Math.sin(p) - Math.tan(d) * Math.cos(p); 
    A = norm(Math.atan2(up, dn), 360); 
    h = Math.asin(Math.sin(p) * Math.sin(d) 
     + Math.cos(p) * Math.cos(d) * Math.cos(ha)); 
    return {az: A * co.rtd, alt: h * co.rtd}; 
} 

norm est une fonction simple qui normalise un nombre dans la plage de 0 à x (360 dans la plupart des cas ci-dessus) en ajoutant/soustrayant un multiple de x jusqu'à ce qu'il se trouve dans la plage:

norm(n, x) = n - (x * int(n/x)) 

J'ai appliqué norm à chaque sortie, ce qui a permis, mais je reçois toujours ces sauts fous:

Ecl: 153 = Hor: 2.537 
Ecl: 154 = Hor: 0.557 
Ecl: 155 = Hor: 105.103 
Ecl: 156 = Hor: 103.214 

et

Ecl: 333 = Hor: 289.018 
Ecl: 334 = Hor: 287.038 
Ecl: 335 = Hor: 178.622 
Ecl: 336 = Hor: 176.734 

Je suis aussi préoccupé - il semble qu'il y ait encore une même, lisse distribution (même si ce n'est pas linéaire) à l'horizon, mais cela ne semble pas être le cas.

Répondre

1

Je pense que le problème est la déclaration

A = norm(Math.atan2(up, dn), 360); 

dans la fonction equHor(). Le résultat de atan2 est un angle en radians. Vous ne le normaliseriez probablement pas avec 360.

+1

C'est tout! Eh bien, ça, et normaliser deux fois. Je vous remercie! – graidan

+0

À mes yeux, vous pouvez laisser cette deuxième normalisation après avoir réglé le problème 'A' (c'était simplement une tentative de résoudre le problème au mauvais endroit). – rplantiko

+0

Exactement - Je l'ai juste enlevé, et converti en degrés avant la normalisation ci-dessous: 'az: norme (A * co.rtd, 360)' – graidan

0

Je travaille sur un projet similaire et j'ai été inspiré par votre solution. Ensuite, je rencontrais des résultats faux pour l'azimut de 180 ° jusqu'à ce que j'ai découvert que je devais changer la formule de equHor() à:

up = Math.sin((alpha - lst) * co.htr); 
dn = Math.tan(d) * Math.cos(p) - Math.cos(ha) * Math.sin(p); 

Je veux juste savoir si vous pouvez le confirmer.

Questions connexes