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.
C'est tout! Eh bien, ça, et normaliser deux fois. Je vous remercie! – graidan
À 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
Exactement - Je l'ai juste enlevé, et converti en degrés avant la normalisation ci-dessous: 'az: norme (A * co.rtd, 360)' – graidan