ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
2 lines • 9.16 kB
JavaScript
// !data astro
var ilib=require("../index.js"),Utils=require("./Utils.js"),SearchUtils=require("./SearchUtils.js"),GregorianDate=require("./GregorianDate.js"),RataDie=require("./RataDie.js"),GregRataDie=require("./GregRataDie.js"),Astro={initAstro:function(sync,loadParams,callback){ilib.data.astro?callback&&"function"==typeof callback&&callback(ilib.data.astro):Utils.loadData({object:"Astro",name:"astro.json",locale:"-",nonLocale:!0,sync:sync,loadParams:loadParams,callback:ilib.bind(this,function(astroData){ilib.data.astro=astroData,callback&&"function"==typeof callback&&callback(astroData)})})},_dtr:function(d){return d*Math.PI/180},_rtd:function(r){return 180*r/Math.PI},_dcos:function(d){return Math.cos(Astro._dtr(d))},_dsin:function(d){return Math.sin(Astro._dtr(d))},_dtan:function(d){return Math.tan(Astro._dtr(d))},_fixangle:function(a){return a-360*Math.floor(a/360)},_fixangr:function(a){return a-2*Math.PI*Math.floor(a/(2*Math.PI))},_equinox:function(year,which){for(var year=year<1e3?(JDE0tab=ilib.data.astro._JDE0tab1000,year/1e3):(JDE0tab=ilib.data.astro._JDE0tab2000,(year-2e3)/1e3),JDE0tab=JDE0tab[which][0]+JDE0tab[which][1]*year+JDE0tab[which][2]*year*year+JDE0tab[which][3]*year*year*year+JDE0tab[which][4]*year*year*year*year,T=(JDE0tab-2451545)/36525,which=35999.373*T-2.47,year=1+.0334*Astro._dcos(which)+7e-4*Astro._dcos(2*which),S=0,j=0,i=0;i<24;i++)S+=ilib.data.astro._EquinoxpTerms[j]*Astro._dcos(ilib.data.astro._EquinoxpTerms[j+1]+ilib.data.astro._EquinoxpTerms[j+2]*T),j+=3;return JDE0tab+1e-5*S/year},_deltat:function(year){var i,t;return 1620<=year&&year<=2014?(i=Math.floor(year-1620),i=ilib.data.astro._deltaTtab[i]+(ilib.data.astro._deltaTtab[i+1]-ilib.data.astro._deltaTtab[i])*(year-1620-i)):(t=(year-2e3)/100,year<948?i=2177+497*t+44.1*t*t:(i=102+102*t+25.3*t*t,2e3<year&&year<2100&&(i+=.37*(year-2100)))),i},_obliqeq:function(jd){var u,i,v=u=(jd-2451545)/3652500,eps=23.43929111111111;if(Math.abs(u)<1)for(i=0;i<10;i++)eps+=ilib.data.astro._oterms[i]/3600*v,v*=u;return eps},_sunpos:function(jd){var Omega,ret={},T=(jd-2451545)/36525,T2=T*T,T3=T*T2;return ret.meanLongitude=Astro._fixangle(280.46646+36000.76983*T+3032e-7*T2),ret.meanAnomaly=Astro._fixangle(357.52911+35999.05029*T-1537e-7*T2-48e-8*T3),ret.eccentricity=.016708634-42037e-9*T-1.267e-7*T2,ret.equationOfCenter=(1.914602-.004817*T-14e-6*T2)*Astro._dsin(ret.meanAnomaly)+(.019993-101e-6*T)*Astro._dsin(2*ret.meanAnomaly)+289e-6*Astro._dsin(3*ret.meanAnomaly),ret.sunLongitude=ret.meanLongitude+ret.equationOfCenter,ret.apparentLong=ret.sunLongitude+-.00569+-.00478*Astro._dsin(Omega=125.04-1934.136*T),jd=Astro._obliqeq(jd)+.00256*Astro._dcos(Omega),ret.inclination=Astro._fixangle(23.4392911-.013004167*T-1.6389e-7*T2+5.036e-7*T3),ret.apparentRightAscension=Astro._fixangle(Astro._rtd(Math.atan2(Astro._dcos(jd)*Astro._dsin(ret.apparentLong),Astro._dcos(ret.apparentLong)))),ret},_nutation:function(jd){var i,j,t2,to10,ang,jd=(jd-2451545)/36525,ta=[],dp=0,de=0,ret={},t3=jd*(t2=jd*jd);for(ta[0]=Astro._dtr(297.850363+445267.11148*jd-.0019142*t2+t3/189474),ta[1]=Astro._dtr(357.52772+35999.05034*jd-1603e-7*t2-t3/3e5),ta[2]=Astro._dtr(134.96298+477198.867398*jd+.0086972*t2+t3/56250),ta[3]=Astro._dtr(93.27191+483202.017538*jd-.0036825*t2+t3/327270),ta[4]=Astro._dtr(125.04452-1934.136261*jd+.0020708*t2+t3/45e4),i=0;i<5;i++)ta[i]=Astro._fixangr(ta[i]);for(to10=jd/10,i=0;i<63;i++){for(j=ang=0;j<5;j++)0!=ilib.data.astro._nutArgMult[5*i+j]&&(ang+=ilib.data.astro._nutArgMult[5*i+j]*ta[j]);dp+=(ilib.data.astro._nutArgCoeff[4*i+0]+ilib.data.astro._nutArgCoeff[4*i+1]*to10)*Math.sin(ang),de+=(ilib.data.astro._nutArgCoeff[4*i+2]+ilib.data.astro._nutArgCoeff[4*i+3]*to10)*Math.cos(ang)}return ret.deltaPsi=dp/36e6,ret.deltaEpsilon=de/36e6,ret},_equationOfTime:function(jd){var tau=(jd-2451545)/365250,tau=280.4664567+360007.6982779*tau+.03032028*tau*tau+tau*tau*tau/49931+-tau*tau*tau*tau/15300+-tau*tau*tau*tau*tau/2e6;tau=Astro._fixangle(tau);var alpha=Astro._sunpos(jd).apparentRightAscension,nut=Astro._nutation(jd),deltaPsi=nut.deltaPsi,jd=Astro._obliqeq(jd)+nut.deltaEpsilon;return 180<(nut=tau-.0057183-alpha+deltaPsi*Astro._dcos(jd))&&(nut-=360),nut=nut*4/1440},_poly:function(x,coefficients){for(var result=coefficients[0],xpow=x,i=1;i<coefficients.length;i++)result+=coefficients[i]*xpow,xpow*=x;return result},_universalFromLocal:function(local,zone){return local-zone/1440},_localFromUniversal:function(local,zone){return local+zone/1440},_aberration:function(c){return 974e-7*Astro._dcos(177.63+35999.01847999999*c)-.005575},_nutation2:function(c){var a=Astro._poly(c,ilib.data.astro._nutCoeffA),c=Astro._poly(c,ilib.data.astro._nutCoeffB);return-.004778*Astro._dsin(a)-3667e-7*Astro._dsin(c)},_ephemerisCorrection:function(jd){var theta,jd=GregorianDate._calcYear(jd-1721424.5);return 1988<=jd&&jd<=2019?(jd-1933)/86400:1800<=jd&&jd<=1987?(theta=(new GregRataDie({year:jd,month:7,day:1,hour:0,minute:0,second:0}).getRataDie()-693596)/36525,Astro._poly(theta,1900<=jd?ilib.data.astro._coeff19th:ilib.data.astro._coeff18th)):1620<=jd&&jd<=1799?(196.58333-4.0675*(jd-=1600)+.0219167*jd*jd)/86400:((theta=new GregRataDie({year:jd,month:1,day:1,hour:0,minute:0,second:0}).getRataDie()-660724+.5)*theta/41048480-15)/86400},_ephemerisFromUniversal:function(jd){return jd+Astro._ephemerisCorrection(jd)},_universalFromEphemeris:function(jd){return jd-Astro._ephemerisCorrection(jd)},_julianCenturies:function(jd){return(Astro._ephemerisFromUniversal(jd)-2451545)/36525},_solarLongitude:function(jd){for(var c=Astro._julianCenturies(jd),longitude=0,len=ilib.data.astro._solarLongCoeff.length,i=0;i<len;i++)longitude+=ilib.data.astro._solarLongCoeff[i]*Astro._dsin(ilib.data.astro._solarLongAddends[i]+ilib.data.astro._solarLongMultipliers[i]*c);return longitude=(longitude=longitude*5729577951308232e-21+(282.7771834+36000.76953744*c))+(Astro._aberration(c)+Astro._nutation2(c)),Astro._fixangle(longitude)},_lunarLongitude:function(jd){for(var jd=Astro._julianCenturies(jd),meanMoon=Astro._fixangle(Astro._poly(jd,ilib.data.astro._meanMoonCoeff)),elongation=Astro._fixangle(Astro._poly(jd,ilib.data.astro._elongationCoeff)),solarAnomaly=Astro._fixangle(Astro._poly(jd,ilib.data.astro._solarAnomalyCoeff)),lunarAnomaly=Astro._fixangle(Astro._poly(jd,ilib.data.astro._lunarAnomalyCoeff)),moonNode=Astro._fixangle(Astro._poly(jd,ilib.data.astro._moonFromNodeCoeff)),e=Astro._poly(jd,ilib.data.astro._eCoeff),sum=0,i=0;i<ilib.data.astro._lunarElongationLongCoeff.length;i++){var x=ilib.data.astro._solarAnomalyLongCoeff[i];sum+=ilib.data.astro._sineCoeff[i]*Math.pow(e,Math.abs(x))*Astro._dsin(ilib.data.astro._lunarElongationLongCoeff[i]*elongation+x*solarAnomaly+ilib.data.astro._lunarAnomalyLongCoeff[i]*lunarAnomaly+ilib.data.astro._moonFromNodeLongCoeff[i]*moonNode)}var longitude=sum/1e6,venus=.003958*Astro._dsin(119.75+131.849*jd),jupiter=318e-6*Astro._dsin(53.09+479264.29*jd),flatEarth=.001962*Astro._dsin(meanMoon-moonNode);return Astro._fixangle(meanMoon+longitude+venus+jupiter+flatEarth+Astro._nutation2(jd))},_newMoonTime:function(n){for(var k=n-24724,n=k/1236.85,approx=Astro._poly(n,ilib.data.astro._nmApproxCoeff),capE=Astro._poly(n,ilib.data.astro._nmCapECoeff),solarAnomaly=Astro._poly(n,ilib.data.astro._nmSolarAnomalyCoeff),lunarAnomaly=Astro._poly(n,ilib.data.astro._nmLunarAnomalyCoeff),moonArgument=Astro._poly(n,ilib.data.astro._nmMoonArgumentCoeff),capOmega=Astro._poly(n,ilib.data.astro._nmCapOmegaCoeff),correction=-17e-5*Astro._dsin(capOmega),i=0;i<ilib.data.astro._nmSineCoeff.length;i++)correction+=ilib.data.astro._nmSineCoeff[i]*Math.pow(capE,ilib.data.astro._nmEFactor[i])*Astro._dsin(ilib.data.astro._nmSolarCoeff[i]*solarAnomaly+ilib.data.astro._nmLunarCoeff[i]*lunarAnomaly+ilib.data.astro._nmMoonCoeff[i]*moonArgument);var additional=0;for(i=0;i<ilib.data.astro._nmAddConst.length;i++)additional+=ilib.data.astro._nmAddFactor[i]*Astro._dsin(ilib.data.astro._nmAddConst[i]+ilib.data.astro._nmAddCoeff[i]*k);capOmega=325e-6*Astro._dsin(Astro._poly(n,ilib.data.astro._nmExtra));return Astro._universalFromEphemeris(approx+correction+capOmega+additional+RataDie.gregorianEpoch)},_lunarSolarAngle:function(jd){var lunar=Astro._lunarLongitude(jd),jd=Astro._solarLongitude(jd);return Astro._fixangle(lunar-jd)},_newMoonBefore:function(jd){for(var last,phase=Astro._lunarSolarAngle(jd),guess=Math.round((jd-11.450086114414322-RataDie.gregorianEpoch)/29.530588853-phase/360)-1,current=last=Astro._newMoonTime(guess);current<jd;)last=current,current=Astro._newMoonTime(++guess);return last},_newMoonAtOrAfter:function(jd){for(var current,phase=Astro._lunarSolarAngle(jd),guess=Math.round((jd-11.450086114414322-RataDie.gregorianEpoch)/29.530588853-phase/360);(current=Astro._newMoonTime(guess))<jd;)guess++;return current},_nextSolarLongitude:function(jd,longitude){var tau=jd+365.242189/360*Astro._fixangle(longitude-Astro._solarLongitude(jd)),jd=Math.max(jd,tau-5);return SearchUtils.bisectionSearch(0,jd,tau+5,1e-6,function(l){return 180-Astro._fixangle(Astro._solarLongitude(l)-longitude)})},_floorToJD:function(jd){return Math.floor(jd-.5)+.5},_ceilToJD:function(jd){return Math.ceil(jd+.5)-.5}};module.exports=Astro;