2020import java .util .stream .Collectors ;
2121
2222import org .eclipse .jdt .annotation .NonNullByDefault ;
23+ import org .openhab .binding .astro .internal .calc .moon .LunarArguments ;
24+ import org .openhab .binding .astro .internal .calc .moon .LunationArguments ;
2325import org .openhab .binding .astro .internal .model .MoonPhase ;
2426import org .openhab .binding .astro .internal .model .MoonPhaseSet ;
25- import org .openhab .binding .astro .internal .util .AstroConstants ;
26- import org .openhab .binding .astro .internal .util .DateTimeUtils ;
2727
2828/**
2929 * Moon Phase Calculator
3030 *
3131 * @author Gaël L'hopital - Initial contribution
3232 */
3333@ NonNullByDefault
34- public class MoonPhaseCalc extends AstroCalc {
34+ public class MoonPhaseCalc {
3535 public static MoonPhaseSet calculate (InstantSource instantSource , double julianDate , MoonPhaseSet previousMP ,
3636 ZoneId zone ) {
3737 final MoonPhaseSet result ;
@@ -58,16 +58,12 @@ public static MoonPhaseSet calculate(InstantSource instantSource, double julianD
5858 * Calculates the illumination.
5959 */
6060 private static double getIllumination (double jd ) {
61- double t = DateTimeUtils .toJulianCenturies (jd );
62- double t2 = t * t ;
63- double t3 = t2 * t ;
64- double t4 = t3 * t ;
65- double d = 297.8502042 + 445267.11151686 * t - .00163 * t2 + t3 / 545868 - t4 / 113065000 ;
66- double m = AstroConstants .E05_0 + 35999.0502909 * t - .0001536 * t2 + t3 / 24490000 ;
67- double m1 = 134.9634114 + 477198.8676313 * t + .008997 * t2 + t3 / 69699 - t4 / 14712000 ;
68- double i = 180 - d - 6.289 * sinDeg (m1 ) + 2.1 * sinDeg (m ) - 1.274 * sinDeg (2 * d - m1 ) - .658 * sinDeg (2 * d )
69- - .241 * sinDeg (2 * m1 ) - .110 * sinDeg (d );
70- return (1 + cosDeg (i )) / 2 ;
61+ LunarArguments la = new LunarArguments (jd );
62+ double i = Math .PI - la .d - Math .toRadians (6.289 ) * Math .sin (la .m1 ) + Math .toRadians (2.1 ) * Math .sin (la .m )
63+ - Math .toRadians (1.274 ) * Math .sin (2 * la .d - la .m1 ) - Math .toRadians (0.658 ) * Math .sin (2 * la .d )
64+ - Math .toRadians (0.241 ) * Math .sin (2 * la .m1 ) - Math .toRadians (0.110 ) * Math .sin (la .d );
65+
66+ return (1 + Math .cos (i )) / 2 ;
7167 }
7268
7369 /**
@@ -77,7 +73,7 @@ private static double getPhase(double jd, MoonPhase phase, boolean forward) {
7773 double tz = 0 ;
7874 double phaseJd = 0 ;
7975 do {
80- double k = varK (jd , tz );
76+ double k = LunationArguments . varK (jd , tz );
8177 tz += forward ? 1 : -1 ;
8278 phaseJd = calcMoonPhase (k , phase );
8379 } while (forward ? phaseJd <= jd : phaseJd > jd );
@@ -88,55 +84,58 @@ private static double getPhase(double jd, MoonPhase phase, boolean forward) {
8884 * Calculates the moon phase.
8985 */
9086 private static double calcMoonPhase (double k , MoonPhase phase ) {
91- double kMod = Math .floor (k ) + phase .cycleProgress ;
92- double t = kMod / 1236.85 ;
93- double e = varE (t );
94- double m = varM (kMod , t );
95- double m1 = varM1 (kMod , t );
96- double f = varF (kMod , t );
97- double o = varO (kMod , t );
98- double jd = varJde (kMod , t );
87+ LunationArguments la = new LunationArguments (k , phase .cycleProgress );
88+ double jd = la .jde ;
9989 switch (phase ) {
10090 case NEW :
101- jd += -.4072 * sinDeg (m1 ) + .17241 * e * sinDeg (m ) + .01608 * sinDeg (2 * m1 ) + .01039 * sinDeg (2 * f )
102- + .00739 * e * sinDeg (m1 - m ) - .00514 * e * sinDeg (m1 + m ) + .00208 * e * e * sinDeg (2 * m )
103- - .00111 * sinDeg (m1 - 2 * f ) - .00057 * sinDeg (m1 + 2 * f );
104- jd += .00056 * e * sinDeg (2 * m1 + m ) - .00042 * sinDeg (3 * m1 ) + .00042 * e * sinDeg (m + 2 * f )
105- + .00038 * e * sinDeg (m - 2 * f ) - .00024 * e * sinDeg (2 * m1 - m ) - .00017 * sinDeg (o )
106- - .00007 * sinDeg (m1 + 2 * m ) + .00004 * sinDeg (2 * m1 - 2 * f );
107- jd += .00004 * sinDeg (3 * m ) + .00003 * sinDeg (m1 + m - 2 * f ) + .00003 * sinDeg (2 * m1 + 2 * f )
108- - .00003 * sinDeg (m1 + m + 2 * f ) + .00003 * sinDeg (m1 - m + 2 * f )
109- - .00002 * sinDeg (m1 - m - 2 * f ) - .00002 * sinDeg (3 * m1 + m );
110- jd += .00002 * sinDeg (4 * m1 );
91+ jd += -.4072 * sinDeg (la .m1 ) + .17241 * la .e * sinDeg (la .m ) + .01608 * sinDeg (2 * la .m1 )
92+ + .01039 * sinDeg (2 * la .f ) + .00739 * la .e * sinDeg (la .m1 - la .m )
93+ - .00514 * la .e * sinDeg (la .m1 + la .m ) + .00208 * la .e * la .e * sinDeg (2 * la .m )
94+ - .00111 * sinDeg (la .m1 - 2 * la .f ) - .00057 * sinDeg (la .m1 + 2 * la .f );
95+ jd += .00056 * la .e * sinDeg (2 * la .m1 + la .m ) - .00042 * sinDeg (3 * la .m1 )
96+ + .00042 * la .e * sinDeg (la .m + 2 * la .f ) + .00038 * la .e * sinDeg (la .m - 2 * la .f )
97+ - .00024 * la .e * sinDeg (2 * la .m1 - la .m ) - .00017 * sinDeg (la .o )
98+ - .00007 * sinDeg (la .m1 + 2 * la .m ) + .00004 * sinDeg (2 * la .m1 - 2 * la .f );
99+ jd += .00004 * sinDeg (3 * la .m ) + .00003 * sinDeg (la .m1 + la .m - 2 * la .f )
100+ + .00003 * sinDeg (2 * la .m1 + 2 * la .f ) - .00003 * sinDeg (la .m1 + la .m + 2 * la .f )
101+ + .00003 * sinDeg (la .m1 - la .m + 2 * la .f ) - .00002 * sinDeg (la .m1 - la .m - 2 * la .f )
102+ - .00002 * sinDeg (3 * la .m1 + la .m );
103+ jd += .00002 * sinDeg (4 * la .m1 );
111104 break ;
112105 case FULL :
113- jd += -.40614 * sinDeg (m1 ) + .17302 * e * sinDeg (m ) + .01614 * sinDeg (2 * m1 ) + .01043 * sinDeg (2 * f )
114- + .00734 * e * sinDeg (m1 - m ) - .00515 * e * sinDeg (m1 + m ) + .00209 * e * e * sinDeg (2 * m )
115- - .00111 * sinDeg (m1 - 2 * f ) - .00057 * sinDeg (m1 + 2 * f );
116- jd += .00056 * e * sinDeg (2 * m1 + m ) - .00042 * sinDeg (3 * m1 ) + .00042 * e * sinDeg (m + 2 * f )
117- + .00038 * e * sinDeg (m - 2 * f ) - .00024 * e * sinDeg (2 * m1 - m ) - .00017 * sinDeg (o )
118- - .00007 * sinDeg (m1 + 2 * m ) + .00004 * sinDeg (2 * m1 - 2 * f );
119- jd += .00004 * sinDeg (3 * m ) + .00003 * sinDeg (m1 + m - 2 * f ) + .00003 * sinDeg (2 * m1 + 2 * f )
120- - .00003 * sinDeg (m1 + m + 2 * f ) + .00003 * sinDeg (m1 - m + 2 * f )
121- - .00002 * sinDeg (m1 - m - 2 * f ) - .00002 * sinDeg (3 * m1 + m );
122- jd += .00002 * sinDeg (4 * m1 );
106+ jd += -.40614 * sinDeg (la .m1 ) + .17302 * la .e * sinDeg (la .m ) + .01614 * sinDeg (2 * la .m1 )
107+ + .01043 * sinDeg (2 * la .f ) + .00734 * la .e * sinDeg (la .m1 - la .m )
108+ - .00515 * la .e * sinDeg (la .m1 + la .m ) + .00209 * la .e * la .e * sinDeg (2 * la .m )
109+ - .00111 * sinDeg (la .m1 - 2 * la .f ) - .00057 * sinDeg (la .m1 + 2 * la .f );
110+ jd += .00056 * la .e * sinDeg (2 * la .m1 + la .m ) - .00042 * sinDeg (3 * la .m1 )
111+ + .00042 * la .e * sinDeg (la .m + 2 * la .f ) + .00038 * la .e * sinDeg (la .m - 2 * la .f )
112+ - .00024 * la .e * sinDeg (2 * la .m1 - la .m ) - .00017 * sinDeg (la .o )
113+ - .00007 * sinDeg (la .m1 + 2 * la .m ) + .00004 * sinDeg (2 * la .m1 - 2 * la .f );
114+ jd += .00004 * sinDeg (3 * la .m ) + .00003 * sinDeg (la .m1 + la .m - 2 * la .f )
115+ + .00003 * sinDeg (2 * la .m1 + 2 * la .f ) - .00003 * sinDeg (la .m1 + la .m + 2 * la .f )
116+ + .00003 * sinDeg (la .m1 - la .m + 2 * la .f ) - .00002 * sinDeg (la .m1 - la .m - 2 * la .f )
117+ - .00002 * sinDeg (3 * la .m1 + la .m );
118+ jd += .00002 * sinDeg (4 * la .m1 );
123119 break ;
124120 default :
125- jd += -.62801 * sinDeg (m1 ) + .17172 * e * sinDeg (m ) - .01183 * e * sinDeg (m1 + m )
126- + .00862 * sinDeg (2 * m1 ) + .00804 * sinDeg (2 * f ) + .00454 * e * sinDeg (m1 - m )
127- + .00204 * e * e * sinDeg (2 * m ) - .0018 * sinDeg (m1 - 2 * f ) - .0007 * sinDeg (m1 + 2 * f );
128- jd += -.0004 * sinDeg (3 * m1 ) - .00034 * e * sinDeg (2 * m1 - m ) + .00032 * e * sinDeg (m + 2 * f )
129- + .00032 * e * sinDeg (m - 2 * f ) - .00028 * e * e * sinDeg (m1 + 2 * m )
130- + .00027 * e * sinDeg (2 * m1 + m ) - .00017 * sinDeg (o );
131- jd += -.00005 * sinDeg (m1 - m - 2 * f ) + .00004 * sinDeg (2 * m1 + 2 * f )
132- - .00004 * sinDeg (m1 + m + 2 * f ) + .00004 * sinDeg (m1 - 2 * m )
133- + .00003 * sinDeg (m1 + m - 2 * f ) + .00003 * sinDeg (3 * m ) + .00002 * sinDeg (2 * m1 - 2 * f );
134- jd += .00002 * sinDeg (m1 - m + 2 * f ) - .00002 * sinDeg (3 * m1 + m );
135- double w = .00306 - .00038 * e * cosDeg (m ) + .00026 * cosDeg (m1 ) - .00002 * cosDeg (m1 - m )
136- + .00002 * cosDeg (m1 + m ) + .00002 * cosDeg (2 * f );
121+ jd += -.62801 * sinDeg (la .m1 ) + .17172 * la .e * sinDeg (la .m ) - .01183 * la .e * sinDeg (la .m1 + la .m )
122+ + .00862 * sinDeg (2 * la .m1 ) + .00804 * sinDeg (2 * la .f ) + .00454 * la .e * sinDeg (la .m1 - la .m )
123+ + .00204 * la .e * la .e * sinDeg (2 * la .m ) - .0018 * sinDeg (la .m1 - 2 * la .f )
124+ - .0007 * sinDeg (la .m1 + 2 * la .f );
125+ jd += -.0004 * sinDeg (3 * la .m1 ) - .00034 * la .e * sinDeg (2 * la .m1 - la .m )
126+ + .00032 * la .e * sinDeg (la .m + 2 * la .f ) + .00032 * la .e * sinDeg (la .m - 2 * la .f )
127+ - .00028 * la .e * la .e * sinDeg (la .m1 + 2 * la .m ) + .00027 * la .e * sinDeg (2 * la .m1 + la .m )
128+ - .00017 * sinDeg (la .o );
129+ jd += -.00005 * sinDeg (la .m1 - la .m - 2 * la .f ) + .00004 * sinDeg (2 * la .m1 + 2 * la .f )
130+ - .00004 * sinDeg (la .m1 + la .m + 2 * la .f ) + .00004 * sinDeg (la .m1 - 2 * la .m )
131+ + .00003 * sinDeg (la .m1 + la .m - 2 * la .f ) + .00003 * sinDeg (3 * la .m )
132+ + .00002 * sinDeg (2 * la .m1 - 2 * la .f );
133+ jd += .00002 * sinDeg (la .m1 - la .m + 2 * la .f ) - .00002 * sinDeg (3 * la .m1 + la .m );
134+ double w = .00306 - .00038 * la .e * cosDeg (la .m ) + .00026 * cosDeg (la .m1 )
135+ - .00002 * cosDeg (la .m1 - la .m ) + .00002 * cosDeg (la .m1 + la .m ) + .00002 * cosDeg (2 * la .f );
137136 jd += MoonPhase .FIRST_QUARTER .equals (phase ) ? w : -w ;
138137 }
139- return moonCorrection (jd , t , kMod );
138+ return moonCorrection (jd , la . t , la . kMod );
140139 }
141140
142141 private static double moonCorrection (double jd , double t , double k ) {
0 commit comments