计算月球的相位
问题
你想找出月球的相位。
解决方案
以下代码提供了一种计算给出日期的月球相位计算方案:
# moonPhase.coffee# Moon-phase calculator# Roger W. Sinnott, Sky & Telescope, June 16, 2006# http://www.skyandtelescope.com/observing/objects/javascript/moon_phases## Translated to CoffeeScript by Mike Hatfield @WebCoding4Funproper_ang = (big) ->tmp = 0if big > 0tmp = big / 360.0tmp = (tmp - (~~tmp)) * 360.0elsetmp = Math.ceil(Math.abs(big / 360.0))tmp = big + tmp * 360.0tmpjdn = (date) ->month = date.getMonth()day = date.getDate()year = date.getFullYear()zone = date.getTimezoneOffset() / 1440mm = monthdd = dayyy = yearyyy = yymmm = mmif mm < 3yyy = yyy - 1mmm = mm + 12day = dd + zone + 0.5a = ~~( yyy / 100 )b = 2 - a + ~~( a / 4 )jd = ~~( 365.25 * yyy ) + ~~( 30.6001 * ( mmm+ 1 ) ) + day + 1720994.5jd + b if jd > 2299160.4999999moonElong = (jd) ->dr = Math.PI / 180rd = 1 / drmeeDT = Math.pow((jd - 2382148), 2) / (41048480 * 86400)meeT = (jd + meeDT - 2451545.0) / 36525meeT2 = Math.pow(meeT, 2)meeT3 = Math.pow(meeT, 3)meeD = 297.85 + (445267.1115 * meeT) - (0.0016300 * meeT2) + (meeT3 / 545868)meeD = (proper_ang meeD) * drmeeM1 = 134.96 + (477198.8676 * meeT) + (0.0089970 * meeT2) + (meeT3 / 69699)meeM1 = (proper_ang meeM1) * drmeeM = 357.53 + (35999.0503 * meeT)meeM = (proper_ang meeM) * drelong = meeD * rd + 6.29 * Math.sin( meeM1 )elong = elong - 2.10 * Math.sin( meeM )elong = elong + 1.27 * Math.sin( 2*meeD - meeM1 )elong = elong + 0.66 * Math.sin( 2*meeD )elong = proper_ang elongelong = Math.round elongmoonNum = ( ( elong + 6.43 ) / 360 ) * 28moonNum = ~~( moonNum )if moonNum is 28 then 0 else moonNumgetMoonPhase = (age) ->moonPhase = "new Moon"moonPhase = "first quarter" if age > 3 and age < 11moonPhase = "full Moon" if age > 10 and age < 18moonPhase = "last quarter" if age > 17 and age < 25if ((age is 1) or (age is 8) or (age is 15) or (age is 22))moonPhase = "1 day past " + moonPhaseif ((age is 2) or (age is 9) or (age is 16) or (age is 23))moonPhase = "2 days past " + moonPhaseif ((age is 3) or (age is 1) or (age is 17) or (age is 24))moonPhase = "3 days past " + moonPhaseif ((age is 4) or (age is 11) or (age is 18) or (age is 25))moonPhase = "3 days before " + moonPhaseif ((age is 5) or (age is 12) or (age is 19) or (age is 26))moonPhase = "2 days before " + moonPhaseif ((age is 6) or (age is 13) or (age is 20) or (age is 27))moonPhase = "1 day before " + moonPhasemoonPhaseMoonPhase = exports? and exports or @MoonPhase = {}class MoonPhase.CalculatorgetMoonDays: (date) ->jd = jdn datemoonElong jdgetMoonPhase: (date) ->jd = jdn dategetMoonPhase( moonElong jd )
讨论
此代码显示一个月球相位计算器对象的方法有两种。计算器 -> getmoonphase 将返回一用个文本表示的日期的月球相位。
这可以用在浏览器和 Node.js 中。
$ node> var MoonPhase = require('./moonPhase.js');undefined> var calc = new MoonPhase.Calculator();undefined> calc.getMoonPhase(new Date());'full moon'> calc.getMoonPhase(new Date(1972, 6, 30));'3 days before last quarter'
转载本站内容时,请务必注明来自W3xue,违者必究。


优化或报错有奖
皖公网安备34020702000426号