UNPKG

solar-calc

Version:

A sunrise/sunset/moonrise/moonset calculator

525 lines (467 loc) 24.2 kB
"use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var Moon = (function () { function Moon(date, latitude, longitude) { _classCallCheck(this, Moon); this.date = date; this.latitude = latitude; this.longitude = longitude; this.julianDate = getJD(date); } _createClass(Moon, { illuminosity: { get: function () { return moonPhase(this.date) / 360; } }, distance: { get: function () { return moonPos(this.date).distance; } } }); return Moon; })(); // Utility functions for astronomical programming. // JavaScript by Peter Hayes http://www.peter-hayes.freeserve.co.uk/ // Copyright 2001-2002 // This code is made freely available but please keep this notice. // I accept no liability for any errors in my coding but please // let me know of any errors you find. My address is on my home page. function getJD(date) { var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); var A = Math.floor(year / 100); var B = 2 - A + Math.floor(A / 4); var JD = Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5; return JD; } // function dayno(year, month, day, hours) { // // Day number is a modified Julian date, day 0 is 2000 January 0.0 // // which corresponds to a Julian date of 2451543.5 // var A = Math.floor(year / 100); // var B = 2 - A + Math.floor(A / 4); // var JD = Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + B - 1524.5 + hours; // return JD; // } // function julian(year, month, day, hours) { // return dayno(year, month, day, hours) + 2451543.5; // } // function jdtocd(jd) { // // The calendar date from julian date // // Returns year, month, day, day of week, hours, minutes, seconds // var Z = Math.floor(jd + 0.5); // var F = jd + 0.5 - Z; // if (Z < 2299161) { // var A = Z; // } else { // var alpha = Math.floor((Z - 1867216.25) / 36524.25); // var A = Z + 1 + alpha - Math.floor(alpha / 4); // } // var B = A + 1524; // var C = Math.floor((B - 122.1) / 365.25); // var D = Math.floor(365.25 * C); // var E = Math.floor((B - D) / 30.6001); // var d = B - D - Math.floor(30.6001 * E) + F; // if (E < 14) { // var month = E - 1; // } else { // var month = E - 13; // } // if (month > 2) { // var year = C - 4716; // } else { // var year = C - 4715; // } // var day = Math.floor(d); // var h = (d - day) * 24; // var hours = Math.floor(h); // var m = (h - hours) * 60; // var minutes = Math.floor(m); // var seconds = Math.round((m - minutes) * 60); // if (seconds >= 60) { // minutes = minutes + 1; // seconds = seconds - 60; // } // if (minutes >= 60) { // hours = hours + 1; // minutes = 0; // } // var dw = Math.floor(jd + 1.5) - 7 * Math.floor((jd + 1.5) / 7); // return [year, month, day, dw, hours, minutes, seconds]; // } // function local_sidereal(year, month, day, hours, lon) { // // Compute local siderial time in degrees // // year, month, day and hours are the Greenwich date and time // // lon is the observers longitude // var d = dayno(year, month, day, hours); // var lst = (98.9818 + 0.985647352 * d + hours * 15 + lon); // return rev(lst) / 15; // } // function radtoaa(ra, dec, year, month, day, hours, lat, lon) { // // convert ra and dec to altitude and azimuth // // year, month, day and hours are the Greenwich date and time // // lat and lon are the observers latitude and longitude // var lst = local_sidereal(year, month, day, hours, lon); // var x = cosd(15.0 * (lst - ra)) * cosd(dec); // var y = sind(15.0 * (lst - ra)) * cosd(dec); // var z = sind(dec); // // rotate so z is the local zenith // var xhor = x * sind(lat) - z * cosd(lat); // var yhor = y; // var zhor = x * cosd(lat) + z * sind(lat); // var azimuth = rev(atan2d(yhor, xhor) + 180.0); // so 0 degrees is north // var altitude = atan2d(zhor, Math.sqrt(xhor * xhor + yhor * yhor)); // return [altitude, azimuth]; // } // Extensions to the Math routines - Trig routines in degrees // JavaScript by Peter Hayes http://www.peter-hayes.freeserve.co.uk/ // Copyright 2001-2002 function rev(angle) { return angle - Math.floor(angle / 360) * 360; } function sind(angle) { return Math.sin(angle * Math.PI / 180); } function cosd(angle) { return Math.cos(angle * Math.PI / 180); } function tand(angle) { return Math.tan(angle * Math.PI / 180); } function asind(c) { return 180 / Math.PI * Math.asin(c); } // function acosd(c) { // return (180.0 / Math.PI) * Math.acos(c); // } function atan2d(y, x) { return 180 / Math.PI * Math.atan(y / x) - 180 * (x < 0); } // function anglestring(a, circle) { // // returns a in degrees as a string degrees:minutes // // circle is true for range between 0 and 360 and false for -90 to +90 // var ar = Math.round(a * 60) / 60; // var deg = Math.abs(ar); // var min = Math.round(60.0 * (deg - Math.floor(deg))); // if (min >= 60) { // deg += 1; // min = 0; // } // var anglestr = ""; // if (!circle) anglestr += (ar < 0 ? "-" : "+"); // if (circle) anglestr += ((Math.floor(deg) < 100) ? "0" : ""); // anglestr += ((Math.floor(deg) < 10) ? "0" : "") + Math.floor(deg); // anglestr += ((min < 10) ? ":0" : ":") + (min); // return anglestr; // } // JavaScript by Peter Hayes http://www.aphayes.pwp.blueyonder.co.uk/ // Copyright 2001-2010 // Unless otherwise stated this code is based on the methods in // Astronomical Algorithms, first edition, by Jean Meeus // Published by Willmann-Bell, Inc. // This code is made freely available but please keep this notice. // The calculations are approximate but should be good enough for general use, // I accept no responsibility for errors in astronomy or coding. // WARNING moonrise code changed on 6 May 2003 to correct a systematic error // these are now local times NOT UTC as the original code did. // Meeus first edition table 45.A Longitude and distance of the moon var T45AD = [0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 1, 0, 2, 0, 0, 4, 0, 4, 2, 2, 1, 1, 2, 2, 4, 2, 0, 2, 2, 1, 2, 0, 0, 2, 2, 2, 4, 0, 3, 2, 4, 0, 2, 2, 2, 4, 0, 4, 1, 2, 0, 1, 3, 4, 2, 0, 1, 2, 2]; var T45AM = [0, 0, 0, 0, 1, 0, 0, -1, 0, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, -1, 0, 0, 0, 1, 0, -1, 0, -2, 1, 2, -2, 0, 0, -1, 0, 0, 1, -1, 2, 2, 1, -1, 0, 0, -1, 0, 1, 0, 1, 0, 0, -1, 2, 1, 0, 0]; var T45AMP = [1, -1, 0, 2, 0, 0, -2, -1, 1, 0, -1, 0, 1, 0, 1, 1, -1, 3, -2, -1, 0, -1, 0, 1, 2, 0, -3, -2, -1, -2, 1, 0, 2, 0, -1, 1, 0, -1, 2, -1, 1, -2, -1, -1, -2, 0, 1, 4, 0, -2, 0, 2, 1, -2, -3, 2, 1, -1, 3, -1]; var T45AF = [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -2, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, -2, 2, 0, 2, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, -2]; var T45AL = [6288774, 1274027, 658314, 213618, -185116, -114332, 58793, 57066, 53322, 45758, -40923, -34720, -30383, 15327, -12528, 10980, 10675, 10034, 8548, -7888, -6766, -5163, 4987, 4036, 3994, 3861, 3665, -2689, -2602, 2390, -2348, 2236, -2120, -2069, 2048, -1773, -1595, 1215, -1110, -892, -810, 759, -713, -700, 691, 596, 549, 537, 520, -487, -399, -381, 351, -340, 330, 327, -323, 299, 294, 0]; var T45AR = [-20905355, -3699111, -2955968, -569925, 48888, -3149, 246158, -152138, -170733, -204586, -129620, 108743, 104755, 10321, 0, 79661, -34782, -23210, -21636, 24208, 30824, -8379, -16675, -12831, -10445, -11650, 14403, -7003, 0, 10056, 6322, -9884, 5751, 0, -4950, 4130, 0, -3958, 0, 3258, 2616, -1897, -2117, 2354, 0, 0, -1423, -1117, -1571, -1739, 0, -4421, 0, 0, 0, 0, 1165, 0, 0, 8752]; // Meeus table 45B latitude of the moon var T45BD = [0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 4, 0, 4, 2, 2, 2, 2, 0, 2, 2, 2, 2, 4, 2, 2, 0, 2, 1, 1, 0, 2, 1, 2, 0, 4, 4, 1, 4, 1, 4, 2]; var T45BM = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, -1, -1, -1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, -1, -2, 0, 1, 1, 1, 1, 1, 0, -1, 1, 0, -1, 0, 0, 0, -1, -2]; var T45BMP = [0, 1, 1, 0, -1, -1, 0, 2, 1, 2, 0, -2, 1, 0, -1, 0, -1, -1, -1, 0, 0, -1, 0, 1, 1, 0, 0, 3, 0, -1, 1, -2, 0, 2, 1, -2, 3, 2, -3, -1, 0, 0, 1, 0, 1, 1, 0, 0, -2, -1, 1, -2, 2, -2, -1, 1, 1, -1, 0, 0]; var T45BF = [1, 1, -1, -1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 3, 1, 1, 1, -1, -1, -1, 1, -1, 1, -3, 1, -3, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, 3, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1]; var T45BL = [5128122, 280602, 277693, 173237, 55413, 46271, 32573, 17198, 9266, 8822, 8216, 4324, 4200, -3359, 2463, 2211, 2065, -1870, 1828, -1794, -1749, -1565, -1491, -1475, -1410, -1344, -1335, 1107, 1021, 833, 777, 671, 607, 596, 491, -451, 439, 422, 421, -366, -351, 331, 315, 302, -283, -229, 223, 223, -220, -220, -185, 181, -177, 176, 166, -164, 132, -119, 115, 107]; // MoonPos calculates the Moon position, based on Meeus chapter 45 function moonPos(date) { // julian date var jd = getJD(date) + 2451543.5; var T = (jd - 2451545) / 36525; var T2 = T * T; var T3 = T2 * T; var T4 = T3 * T; // Moons mean longitude L' var LP = 218.3164477 + 481267.88123421 * T - 0.0015786 * T2 + T3 / 538841 - T4 / 65194000; // Moons mean elongation var D = 297.8501921 + 445267.1114034 * T - 0.0018819 * T2 + T3 / 545868 - T4 / 113065000; // Suns mean anomaly var M = 357.5291092 + 35999.0502909 * T - 0.0001536 * T2 + T3 / 24490000; // Moons mean anomaly M' var MP = 134.9633964 + 477198.8675055 * T + 0.0087414 * T2 + T3 / 69699 - T4 / 14712000; // Moons argument of latitude var F = 93.272095 + 483202.0175233 * T - 0.0036539 * T2 - T3 / 3526000 + T4 / 863310000; // Additional arguments var A1 = 119.75 + 131.849 * T; var A2 = 53.09 + 479264.29 * T; var A3 = 313.45 + 481266.484 * T; var E = 1 - 0.002516 * T - 0.0000074 * T2; var E2 = E * E; // Sums of periodic terms from table 45.A and 45.B var Sl = 0; var Sr = 0; for (var i = 0; i < 60; i++) { var Eterm = 1; if (Math.abs(T45AM[i]) === 1) Eterm = E; if (Math.abs(T45AM[i]) === 2) Eterm = E2; Sl += T45AL[i] * Eterm * sind(rev(T45AD[i] * D + T45AM[i] * M + T45AMP[i] * MP + T45AF[i] * F)); Sr += T45AR[i] * Eterm * cosd(rev(T45AD[i] * D + T45AM[i] * M + T45AMP[i] * MP + T45AF[i] * F)); } var Sb = 0; for (var i = 0; i < 60; i++) { var Eterm = 1; if (Math.abs(T45BM[i]) === 1) Eterm = E; if (Math.abs(T45BM[i]) === 2) Eterm = E2; Sb += T45BL[i] * Eterm * sind(rev(T45BD[i] * D + T45BM[i] * M + T45BMP[i] * MP + T45BF[i] * F)); } // Additional additive terms Sl = Sl + 3958 * sind(rev(A1)) + 1962 * sind(rev(LP - F)) + 318 * sind(rev(A2)); Sb = Sb - 2235 * sind(rev(LP)) + 382 * sind(rev(A3)) + 175 * sind(rev(A1 - F)) + 175 * sind(rev(A1 + F)) + 127 * sind(rev(LP - MP)) - 115 * sind(rev(LP + MP)); // geocentric longitude, latitude and distance var mglong = rev(LP + Sl / 1000000); var mglat = rev(Sb / 1000000); if (mglat > 180) mglat = mglat - 360; var mr = Math.round(385000.56 + Sr / 1000); // Obliquity of Ecliptic var obl = 23.4393 - 3.563e-9 * (jd - 2451543.5); // RA and dec var ra = rev(atan2d(sind(mglong) * cosd(obl) - tand(mglat) * sind(obl), cosd(mglong))) / 15; var dec = rev(asind(sind(mglat) * cosd(obl) + cosd(mglat) * sind(obl) * sind(mglong))); if (dec > 180) dec = dec - 360; return { ra: ra, dec: dec, distance: mr }; } // function MoonRise(year, month, day, TZ, latitude, longitude) { // // returns an array containing rise and set times or one of the // // following codes. // // -1 rise or set event not found and moon was down at 00:00 // // -2 rise or set event not found and moon was up at 00:00 // // WARNING code changes on 6/7 May 2003 these are now local times // // NOT UTC and rise/set not found codes changed. // var hours = 0; // var riseset = []; // // elh is the elevation at the hour elhdone is true if elh calculated // var elh = []; // var elhdone = []; // for (var i = 0; i <= 24; i++) { // elhdone[i] = false; // } // // Compute the moon elevation at start and end of day // // store elevation at the hours in an array elh to save search time // var rad = MoonPos(year, month, day, hours - TZ); // var altaz = radtoaa(rad[0], rad[1], year, month, day, hours - TZ, latitude, longitude); // elh[0] = altaz[0]; // elhdone[0] = true; // // set the return code to allow for always up or never rises // if (elh[0] > 0.0) { // riseset = [-2, -2]; // } else { // riseset = [-1, -1]; // } // hours = 24; // rad = MoonPos(year, month, day, hours - TZ); // altaz = radtoaa(rad[0], rad[1], year, month, day, hours - TZ, latitude, longitude); // elh[24] = altaz[0]; // elhdone[24] = true; // // search for moonrise and set // for (var rise = 0; rise < 2; rise++) { // var found = false; // var hfirst = 0; // var hlast = 24; // // Try a binary chop on the hours to speed the search // while (Math.ceil((hlast - hfirst) / 2) > 1) { // hmid = hfirst + Math.round((hlast - hfirst) / 2); // if (!elhdone[hmid]) { // hours = hmid; // rad = MoonPos(year, month, day, hours - TZ); // altaz = radtoaa(rad[0], rad[1], year, month, day, hours - TZ, latitude, longitude); // elh[hmid] = altaz[0]; // elhdone[hmid] = true; // } // if (((rise === 0) && (elh[hfirst] <= 0.0) && (elh[hmid] >= 0.0)) || // ((rise === 1) && (elh[hfirst] >= 0.0) && (elh[hmid] <= 0.0))) { // hlast = hmid; // found = true; // continue; // } // if (((rise === 0) && (elh[hmid] <= 0.0) && (elh[hlast] >= 0.0)) || // ((rise === 1) && (elh[hmid] >= 0.0) && (elh[hlast] <= 0.0))) { // hfirst = hmid; // found = true; // continue; // } // break; // } // // If the binary chop did not find a 1 hour interval // if ((hlast - hfirst) > 1) { // for (var i = hfirst; i < hlast; i++) { // found = false; // if (!elhdone[i + 1]) { // hours = i + 1; // rad = MoonPos(year, month, day, hours - TZ); // altaz = radtoaa(rad[0], rad[1], year, month, day, hours - TZ, latitude, longitude); // elh[hours] = altaz[0]; // elhdone[hours] = true; // } // if (((rise === 0) && (elh[i] <= 0.0) && (elh[i + 1] >= 0.0)) || // ((rise === 1) && (elh[i] >= 0.0) && (elh[i + 1] <= 0.0))) { // hfirst = i; // hlast = i + 1; // found = true; // break; // } // } // } // // simple linear interpolation for the minutes // if (found) { // var elfirst = elh[hfirst]; // var ellast = elh[hlast]; // hours = hfirst + 0.5; // rad = MoonPos(year, month, day, hours - TZ); // altaz = radtoaa(rad[0], rad[1], year, month, day, hours - TZ, latitude, longitude); // // alert("day ="+day+" hour ="+hours+" altaz="+altaz[0]+" "+altaz[1]); // if ((rise == 0) && (altaz[0] <= 0.0)) { // hfirst = hours; // elfirst = altaz[0]; // } // if ((rise == 0) && (altaz[0] > 0.0)) { // hlast = hours; // ellast = altaz[0]; // } // if ((rise == 1) && (altaz[0] <= 0.0)) { // hlast = hours; // ellast = altaz[0]; // } // if ((rise === 1) && (altaz[0] > 0.0)) { // hfirst = hours; // elfirst = altaz[0]; // } // var eld = Math.abs(elfirst) + Math.abs(ellast); // riseset[rise] = hfirst + (hlast - hfirst) * Math.abs(elfirst) / eld; // } // } // End of rise/set loop // return (riseset); // } function moonPhase(date) { // the illuminated percentage from Meeus chapter 46 var j = getJD(date) + 2451543.5; var T = (j - 2451545) / 36525; var T2 = T * T; var T3 = T2 * T; var T4 = T3 * T; // Moons mean elongation Meeus first edition // var D=297.8502042+445267.1115168*T-0.0016300*T2+T3/545868.0-T4/113065000.0; // Moons mean elongation Meeus second edition var D = 297.8501921 + 445267.1114034 * T - 0.0018819 * T2 + T3 / 545868 - T4 / 113065000; // Moons mean anomaly M' Meeus first edition // var MP=134.9634114+477198.8676313*T+0.0089970*T2+T3/69699.0-T4/14712000.0; // Moons mean anomaly M' Meeus second edition var MP = 134.9633964 + 477198.8675055 * T + 0.0087414 * T2 + T3 / 69699 - T4 / 14712000; // Suns mean anomaly var M = 357.5291092 + 35999.0502909 * T - 0.0001536 * T2 + T3 / 24490000; // phase angle var pa = 180 - D - 6.289 * sind(MP) + 2.1 * sind(M) - 1.274 * sind(2 * D - MP) - 0.658 * sind(2 * D) - 0.214 * sind(2 * MP) - 0.11 * sind(D); return rev(pa); } // function MoonQuarters(year, month, day) { // // returns an array of Julian Ephemeris Days (JDE) for // // new moon, first quarter, full moon and last quarter // // Meeus first edition chapter 47 with only the most larger additional corrections // // Meeus code calculate Terrestrial Dynamic Time // // TDT = UTC + (number of leap seconds) + 32.184 // // At the end of June 2012 the 25th leap second was added // // // var quarters = []; // // k is an integer for new moon incremented by 0.25 for first quarter 0.5 for new etc. // var k = Math.floor((year + ((month - 1) + day / 30) / 12 - 2000) * 12.3685); // // Time in Julian centuries since 2000.0 // var T = k / 1236.85; // // Sun's mean anomaly // var M = rev(2.5534 + 29.10535669 * k - 0.0000218 * T * T); // // Moon's mean anomaly (M' in Meeus) // var MP = rev(201.5643 + 385.81693528 * k + 0.0107438 * T * T + 0.00001239 * T * T * T - 0.00000011 * T * T * T); // var E = 1 - 0.002516 * T - 0.0000074 * T * T; // // Moons argument of latitude // var F = rev(160.7108 + 390.67050274 * k - 0.0016341 * T * T - 0.00000227 * T * T * T + 0.000000011 * T * T * T * T); // // Longitude of ascending node of lunar orbit // var Omega = rev(124.7746 - 1.56375580 * k + 0.0020691 * T * T + 0.00000215 * T * T * T); // // The full planetary arguments include 14 terms, only used the 7 most significant // var A = []; // A[1] = rev(299.77 + 0.107408 * k - 0.009173 * T * T); // A[2] = rev(251.88 + 0.016321 * k); // A[3] = rev(251.83 + 26.651886 * k); // A[4] = rev(349.42 + 36.412478 * k); // A[5] = rev(84.88 + 18.206239 * k); // A[6] = rev(141.74 + 53.303771 * k); // A[7] = rev(207.14 + 2.453732 * k); // // New moon // var JDE0 = 2451550.09765 + 29.530588853 * k + 0.0001337 * T * T - 0.000000150 * T * T * T + 0.00000000073 * T * T * T * T; // // Correct for TDT since 1 July 2012 // JDE0 = JDE0 - 57.184 / (24 * 60 * 60); // var JDE = JDE0 - 0.40720 * sind(MP) + 0.17241 * E * sind(M) + 0.01608 * sind(2 * MP) + 0.01039 * sind(2 * F) + 0.00739 * E * sind(MP - M) - 0.00514 * E * sind(MP + M) + 0.00208 * E * E * sind(2 * M) - 0.00111 * sind(MP - 2 * F) - 0.00057 * sind(MP + 2 * F) + 0.00056 * E * sind(2 * MP + M) - 0.00042 * sind(3 * MP) + 0.00042 * E * sind(M + 2 * F) + 0.00038 * E * sind(M - 2 * F) - 0.00024 * E * sind(2 * MP - M) - 0.00017 * sind(Omega) - 0.00007 * sind(MP + 2 * M); // quarters[0] = JDE + 0.000325 * sind(A[1]) + 0.000165 * sind(A[2]) + 0.000164 * sind(A[3]) + 0.000126 * sind(A[4]) + 0.000110 * sind(A[5]) + 0.000062 * sind(A[6]) + 0.000060 * sind(A[7]); // // The following code needs tidying up with a loop and conditionals for each quarter // // First Quarter k=k+0.25 // JDE = JDE0 + 29.530588853 * 0.25; // M = rev(M + 29.10535669 * 0.25); // MP = rev(MP + 385.81693528 * 0.25); // F = rev(F + 390.67050274 * 0.25); // Omega = rev(Omega - 1.56375580 * 0.25); // A[1] = rev(A[1] + 0.107408 * 0.25); // A[2] = rev(A[2] + 0.016321 * 0.25); // A[3] = rev(A[3] + 26.651886 * 0.25); // A[4] = rev(A[4] + 36.412478 * 0.25); // A[5] = rev(A[5] + 18.206239 * 0.25); // A[6] = rev(A[6] + 53.303771 * 0.25); // A[7] = rev(A[7] + 2.453732 * 0.25); // JDE = JDE - 0.62801 * sind(MP) + 0.17172 * E * sind(M) - 0.01183 * E * sind(MP + M) + 0.00862 * sind(2 * MP) + 0.00804 * sind(2 * F) + 0.00454 * E * sind(MP - M) + 0.00204 * E * E * sind(2 * M) - 0.00180 * sind(MP - 2 * F) - 0.00070 * sind(MP + 2 * F) - 0.00040 * sind(3 * MP) - 0.00034 * E * sind(2 * MP - M) + 0.00032 * E * sind(M + 2 * F) + 0.00032 * E * sind(M - 2 * F) - 0.00028 * E * E * sind(MP + 2 * M) + 0.00027 * E * sind(2 * MP + M) - 0.00017 * sind(Omega); // // Next term is w add for first quarter & subtract for second // JDE = JDE + (0.00306 - 0.00038 * E * cosd(M) + 0.00026 * cosd(MP) - 0.00002 * cosd(MP - M) + 0.00002 * cosd(MP + M) + 0.00002 * cosd(2 * F)); // quarters[1] = JDE + 0.000325 * sind(A[1]) + 0.000165 * sind(A[2]) + 0.000164 * sind(A[3]) + 0.000126 * sind(A[4]) + 0.000110 * sind(A[5]) + 0.000062 * sind(A[6]) + 0.000060 * sind(A[7]); // // Full moon k=k+0.5 // JDE = JDE0 + 29.530588853 * 0.5; // // Already added 0.25 for first quarter // M = rev(M + 29.10535669 * 0.25); // MP = rev(MP + 385.81693528 * 0.25); // F = rev(F + 390.67050274 * 0.25); // Omega = rev(Omega - 1.56375580 * 0.25); // A[1] = rev(A[1] + 0.107408 * 0.25); // A[2] = rev(A[2] + 0.016321 * 0.25); // A[3] = rev(A[3] + 26.651886 * 0.25); // A[4] = rev(A[4] + 36.412478 * 0.25); // A[5] = rev(A[5] + 18.206239 * 0.25); // A[6] = rev(A[6] + 53.303771 * 0.25); // A[7] = rev(A[7] + 2.453732 * 0.25); // JDE = JDE - 0.40614 * sind(MP) + 0.17302 * E * sind(M) + 0.01614 * sind(2 * MP) + 0.01043 * sind(2 * F) + 0.00734 * E * sind(MP - M) - 0.00515 * E * sind(MP + M) + 0.00209 * E * E * sind(2 * M) - 0.00111 * sind(MP - 2 * F) - 0.00057 * sind(MP + 2 * F) + 0.00056 * E * sind(2 * MP + M) - 0.00042 * sind(3 * MP) + 0.00042 * E * sind(M + 2 * F) + 0.00038 * E * sind(M - 2 * F) - 0.00024 * E * sind(2 * MP - M) - 0.00017 * sind(Omega) - 0.00007 * sind(MP + 2 * M); // quarters[2] = JDE + 0.000325 * sind(A[1]) + 0.000165 * sind(A[2]) + 0.000164 * sind(A[3]) + 0.000126 * sind(A[4]) + 0.000110 * sind(A[5]) + 0.000062 * sind(A[6]) + 0.000060 * sind(A[7]); // // Last Quarter k=k+0.75 // JDE = JDE0 + 29.530588853 * 0.75; // // Already added 0.5 for full moon // M = rev(M + 29.10535669 * 0.25); // MP = rev(MP + 385.81693528 * 0.25); // F = rev(F + 390.67050274 * 0.25); // Omega = rev(Omega - 1.56375580 * 0.25); // A[1] = rev(A[1] + 0.107408 * 0.25); // A[2] = rev(A[2] + 0.016321 * 0.25); // A[3] = rev(A[3] + 26.651886 * 0.25); // A[4] = rev(A[4] + 36.412478 * 0.25); // A[5] = rev(A[5] + 18.206239 * 0.25); // A[6] = rev(A[6] + 53.303771 * 0.25); // A[7] = rev(A[7] + 2.453732 * 0.25); // JDE = JDE - 0.62801 * sind(MP) + 0.17172 * E * sind(M) - 0.01183 * E * sind(MP + M) + 0.00862 * sind(2 * MP) + 0.00804 * sind(2 * F) + 0.00454 * E * sind(MP - M) + 0.00204 * E * E * sind(2 * M) - 0.00180 * sind(MP - 2 * F) - 0.00070 * sind(MP + 2 * F) - 0.00040 * sind(3 * MP) - 0.00034 * E * sind(2 * MP - M) + 0.00032 * E * sind(M + 2 * F) + 0.00032 * E * sind(M - 2 * F) - 0.00028 * E * E * sind(MP + 2 * M) + 0.00027 * E * sind(2 * MP + M) - 0.00017 * sind(Omega); // // Next term is w add for first quarter & subtract for second // JDE = JDE - (0.00306 - 0.00038 * E * cosd(M) + 0.00026 * cosd(MP) - 0.00002 * cosd(MP - M) + 0.00002 * cosd(MP + M) + 0.00002 * cosd(2 * F)); // quarters[3] = JDE + 0.000325 * sind(A[1]) + 0.000165 * sind(A[2]) + 0.000164 * sind(A[3]) + 0.000126 * sind(A[4]) + 0.000110 * sind(A[5]) + 0.000062 * sind(A[6]) + 0.000060 * sind(A[7]); // return quarters; // } module.exports = Moon;