// ============================== // Gilbert JAVAUX - PGJ Astronomie // http://pgj.astro.free.fr/ // gjavaux@wanadoo.fr // ============================== // Script adapté en partie de "moontool.c" de John Walker, Release 2.0. // ============================== function date(){ var today=new Date(); jour = today.getUTCDate(); mois = today.getUTCMonth()+1; annee = today.getUTCFullYear(); heure = today.getUTCHours(); minute = today.getUTCMinutes(); seconde = today.getUTCSeconds(); heure1 = heure + (minute / 60) +(seconde / 3600) ggg = 1 if (annee < 1582 ) ggg = 0; if (annee < 1582 && mois < 10) ggg = 0; if (annee <= 1582 && mois == 10 && jour < 5) ggg = 0; jd = - 1 * Math.floor(7 * (Math.floor((mois + 9) / 12) + annee) / 4); s = 1 if ((mois - 9) < 0) s = - 1; a = Math.abs(mois - 9); j1 = Math.floor(annee + s * Math.floor(a / 7)); j2 = - 1 * Math.floor(((Math.floor(j1 / 100) + 1) * 3 / 4)); jd1 = jd + Math.floor((275 * mois / 9) + jour + (ggg * j2)); jd2dat1 = jd1 + 1721027 + 2 * ggg + 367 * annee - 0.5 ; jj = jd2dat1 + (heure1 / 24) jj2 = jj } var d2r=Math.PI/180; var r2d=180/Math.PI; /* JYEAR -- Convert Julian date to year, month, day, which are returned as an Array. */ function jyear(td) { var z, f, a, alpha, b, c, d, e, mm; td += 0.5; z = Math.floor(td); f = td - z; if (z < 2299161.0) { a = z; } else { alpha = Math.floor((z - 1867216.25) / 36524.25); a = z + 1 + alpha - Math.floor(alpha / 4); } b = a + 1524; c = Math.floor((b - 122.1) / 365.25); d = Math.floor(365.25 * c); e = Math.floor((b - d) / 30.6001); mm = Math.floor((e < 14) ? (e - 1) : (e - 13)); return new Array( Math.floor((mm > 2) ? (c - 4716) : (c - 4715)), mm, Math.floor(b - d - Math.floor(30.6001 * e) + f) ); } /* JHMS -- Convert Julian time to hour, minutes, and seconds, returned as a three-element array. */ function jhms(j) { var ij; j += 0.5; /* Astronomical to civil */ ij = (j - Math.floor(j)) * 86400.0; return new Array( Math.floor(ij / 3600), Math.floor((ij / 60) % 60), Math.floor(ij % 60)); } /* DTR -- Degrees to radians. */ function dtr(d) { return (d * Math.PI) / 180.0; } /* PAD -- Pad a string to a given length with a given fill character. */ function pad(str, howlong, padwith) { var s = str.toString(); while (s.length < howlong) { s = padwith + s; } return s; } /* EDATE -- Edit date and time to application specific format. */ var Months = new Array( "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" ); function edate(j) { var date, time; j += (30.0 / (24 * 60 * 60)); // Round to nearest minute date = jyear(j); time = jhms(j); return (zero(date[2], 2, " ")) + "/" + Months[date[1] - 1] + " " + (zero(time[0], 2, " ")) + "h" + (zero(time[1], 2, "0")); } function dsin(x) {return Math.sin(dtr(x));} function dcos(x) {return Math.cos(dtr(x));} function zero(ze) {if (ze<10) ze="0"+ze;return ze} function norm(x){ x = x - Math.floor(x); if( x < 0 ) x = x + 1; return x; } function permute(){ if (yp[0] > yp[1]) { yp[0] = pl[1]; yp[1] = pl[2]; yp[2] = pl[3]; yp[3] = pl[0]; yph[0] = ph[1]; yph[1] = ph[2]; yph[2] = ph[3]; yph[3] = ph[0]; } if (yp[1] > yp[2]) {yp[0] = pl[2]; yp[1] = pl[3]; yp[2] = pl[0]; yp[3] = pl[1]; yph[0] = ph[2]; yph[1] = ph[3]; yph[2] = ph[0]; yph[3] = ph[1]; } } function phase_lune(phase) { // Les commentaires et les formules utilisées pour le calcul des phases de la Lune proviennent du livre de Jean MEEUS // "Calculs Astronomiques à l'usage des amateurs" Edition SAF ISBN 2-901730-03-6 // Valeur du mois synodique SynMonth = 29.53058868 // k peut être déterminé de manière approchée par : k = (annee + fnj - 1900) * 12.3685; // Astronomique en civil k += 0.5; k = Math.floor(k); k += phase; // t est le temps en siècles juliens à partir du 0.5 janvier 1900 t = (jj - 2415020) / 36525; // Une fois que la valeur correcte de k a été trouvée, t peut être calculé avec une précision suffisante par : t = k / 1236.85; t2 = t * t; t3 = t2 * t; // Le moment des phases moyennes de la Lune, affecté de l'aberration du Soleil est donné par : pt = 2415020.75933 + SynMonth * k + 0.0001178 * t2 - 0.000000155 * t3 + 0.00033 * Math.sin((166.56 + 132.87 * t - 0.009173 * t2) * d2r); // Ces instants sont exprimés en Temps des Ephémérides (Jours Juliens des Ephémérides). // Dans la formule ci-dessus, une valeur entière de k donne l'instant de la Nouvelle Lune, // une valeur entière augmentée de 0.25 donne l'instant du Premier Quartier, // 0.50 donne l'instant de la Pleine Lune, 0.75 donne l'instant du Dernier Quartier // N'importe quelle autre valeur de k donne un résultat sans signification/ // Une valeur négative de k correspond à une phase antérieure à l'année 1900, une valeur // positive à une phase postérieure au début de l'année 1900. // Anomalie moyenne du Soleil à l'instant jj m = 359.2242 + 29.10535608 * k - 0.0000333 * t2 - 0.00000347 * t3; // Anomalie moyenne de la Lune mprime = 306.0253 + 385.81691806 * k + 0.0107306 * t2 + 0.00001236 * t3; //Argument de la latitude de la Lune f = 21.2964 + 390.67050646 * k - 0.0016528 * t2 - 0.00000239 * t3; // Pour obtenir l'instant de la phase vraie, il faut ajouter les corrections suivantes à l'instant de la phase moyenne de la Lune // Les coefficients suivants sont exprimés en fractions décimales de jour; des quantités plus faibles ont été négligées. // Pour la Nouvelle Lune et la Pleine Lune : if (phase == 0||phase == 0.5) { pt += (0.1734 - 0.000393 * t) * Math.sin(m * d2r); pt += 0.0021 * Math.sin(2 * m * d2r); pt -= 0.4068 * Math.sin(mprime * d2r); pt += 0.0161 * Math.sin(2 * mprime * d2r); pt -= 0.0004 * Math.sin(3 * mprime * d2r); pt += 0.0104 * Math.sin(2 * f * d2r); pt -= 0.0051 * Math.sin((m + mprime) * d2r); pt -= 0.0074 * Math.sin((m - mprime) * d2r); pt += 0.0004 * Math.sin((2 * f + m) * d2r); pt -= 0.0004 * Math.sin((2 * f - m) * d2r); pt -= 0.0006 * Math.sin((2 * f + mprime) * d2r); pt += 0.0010 * Math.sin((2 * f - mprime) * d2r); pt += 0.0005 * Math.sin((m + 2 * mprime) * d2r); } // Pour le Premier et le Dernier Quartier : if (phase == 0.25||phase == 0.75) { pt += (0.1721 - 0.0004 * t) * Math.sin(m * d2r); pt += 0.0021 * Math.sin(2 * m * d2r); pt -= 0.6280 * Math.sin(mprime * d2r); pt += 0.0089 * Math.sin(2 * mprime * d2r); pt -= 0.0004 * Math.sin(3 * mprime * d2r); pt += 0.0079 * Math.sin(2 * f * d2r); pt -= 0.0119 * Math.sin((m + mprime) * d2r); pt -= 0.0047 * Math.sin((m - mprime) * d2r); pt += 0.0003 * Math.sin((2 * f + m) * d2r); pt -= 0.0004 * Math.sin((2 * f - m) * d2r); pt -= 0.0006 * Math.sin((2 * f + mprime) * d2r); pt += 0.0021 * Math.sin((2 * f - mprime) * d2r); pt += 0.0003 * Math.sin((m + 2 * mprime) * d2r); pt += 0.0004 * Math.sin((m - 2 * mprime) * d2r); pt -= 0.0003 * Math.sin((2 * m + mprime) * d2r); } // et, de plus, if (phase == 0.25) {pt += 0.0028 - 0.0004 * Math.cos(m * d2r) + 0.0003 * Math.cos(mprime * d2r);} if (phase == 0.75) {pt += - 0.0028 + 0.0004 * Math.cos(m * d2r) - 0.0003 * Math.cos(mprime * d2r);} return pt; } function gen() { date() window.status = "Calcul en cours..."; // Numéro du jour de l'année nj = Math.floor(275 * mois / 9) - 2 * Math.floor((mois + 9) / 12) + jour - 30; fnj = nj / 365; pl = new Array(4) ph = new Array(4) yp= new Array(4) yph= new Array(4) ph[0] = "NL" ph[1] = "PQ" ph[2] = "PL" ph[3] = "DQ" // Calcul des dates des phases // note : si l'écart entre l'instant de la phase et le moment du calcul est supérieur à 14 jours, le calcul est effectué en se décalant de 14 jours afin d'afficher aussi bien les phases précédentes que les phases suivantes par rapport à la date du jour n = 0 for (i = 0; i < 5; i++){ nextph = phase_lune(n); if (pt - jj > 14) {fnj -= 0.0397; pl[i] = phase_lune(n); fnj += 0.0397} else {pl[i] = phase_lune(n);} n = n + 0.25 } var count = pl[0] if (count > jj){count -= 29.530588853} // Construction du tableau yp[0] = pl[0]; yp[1] = pl[1]; yp[2] = pl[2]; yp[3] = pl[3]; yph[0] = ph[0]; yph[1] = ph[1]; yph[2] = ph[2]; yph[3] = ph[3]; permute() // calculate moon's age in days ip = norm((jj - count) / 29.530588853); var ag = ((ip * 29.53058868)*100) / 100; age = Math.round(ag) - 1 if (age < 0 ) age = 28; if (ag < 3){ agh = (Math.floor(ag * 24)); agm = Math.floor((ag * 24 - Math.floor(ag * 24)) * 60); agd = agh + "h "+ zero(agm) + "m";} else { agj = (Math.floor(ag)) agh = Math.floor((ag * 24) - (agj * 24)); agm = Math.floor((((ag * 24) - (agj * 24)) - agh) * 60); agd = agj + "j " + zero(agh) + "h "+ zero(agm) + "m";} // affichage des données document.write('') document.write('') document.write('') document.write('

') document.write("

" + yph[0] + " " + edate(yp[0]) +" UT

") document.write("

" + yph[1] + " " + edate(yp[1]) +" UT

") document.write("

" + yph[2] + " " + edate(yp[2]) +" UT

") document.write("

" + yph[3] + " " + edate(yp[3]) +" UT

") document.write('

' + agd + '

PGJ - Astronomie') document.write('

') window.status = "Terminé."; }