astronoby 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -0
  3. data/Gemfile.lock +19 -17
  4. data/README.md +195 -25
  5. data/UPGRADING.md +72 -0
  6. data/lib/astronoby/aberration.rb +7 -5
  7. data/lib/astronoby/angle.rb +26 -34
  8. data/lib/astronoby/astronomical_models/ephemeride_lunaire_parisienne.rb +143 -0
  9. data/lib/astronoby/astronomical_models/moon_phases_periodic_terms.rb +249 -0
  10. data/lib/astronoby/bodies/moon.rb +335 -0
  11. data/lib/astronoby/bodies/sun.rb +129 -132
  12. data/lib/astronoby/constants.rb +31 -0
  13. data/lib/astronoby/coordinates/ecliptic.rb +4 -4
  14. data/lib/astronoby/coordinates/equatorial.rb +7 -5
  15. data/lib/astronoby/coordinates/horizontal.rb +24 -12
  16. data/lib/astronoby/distance.rb +83 -0
  17. data/lib/astronoby/epoch.rb +0 -2
  18. data/lib/astronoby/equinox_solstice.rb +3 -2
  19. data/lib/astronoby/events/moon_phases.rb +143 -0
  20. data/lib/astronoby/events/observation_events.rb +259 -0
  21. data/lib/astronoby/events/rise_transit_set_iteration.rb +215 -0
  22. data/lib/astronoby/events/twilight_events.rb +121 -0
  23. data/lib/astronoby/geocentric_parallax.rb +36 -56
  24. data/lib/astronoby/mean_obliquity.rb +2 -2
  25. data/lib/astronoby/moon_phase.rb +43 -0
  26. data/lib/astronoby/nutation.rb +5 -3
  27. data/lib/astronoby/observer.rb +39 -18
  28. data/lib/astronoby/precession.rb +1 -1
  29. data/lib/astronoby/refraction.rb +8 -10
  30. data/lib/astronoby/time/greenwich_sidereal_time.rb +18 -29
  31. data/lib/astronoby/time/local_sidereal_time.rb +4 -4
  32. data/lib/astronoby/util/maths.rb +72 -0
  33. data/lib/astronoby/util/time.rb +88 -0
  34. data/lib/astronoby/util/trigonometry.rb +4 -4
  35. data/lib/astronoby/version.rb +1 -1
  36. data/lib/astronoby.rb +12 -1
  37. metadata +15 -4
  38. data/lib/astronoby/body.rb +0 -155
@@ -1,23 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bigdecimal/math"
4
-
5
3
  module Astronoby
6
4
  class Angle
7
5
  include Comparable
8
6
 
9
- PRECISION = 14
10
- PI = BigMath.PI(PRECISION)
11
- PI_IN_DEGREES = BigDecimal("180")
12
-
13
- FULL_CIRCLE_IN_RADIANS = (2 * PI)
14
-
15
- RADIAN_PER_HOUR = PI / BigDecimal("12")
16
- MINUTES_PER_DEGREE = BigDecimal("60")
17
- MINUTES_PER_HOUR = BigDecimal("60")
18
- SECONDS_PER_MINUTE = BigDecimal("60")
19
- SECONDS_PER_HOUR = MINUTES_PER_HOUR * SECONDS_PER_MINUTE
20
-
7
+ MIN_PRECISION = 10
21
8
  FORMATS = %i[dms hms].freeze
22
9
 
23
10
  class << self
@@ -26,28 +13,32 @@ module Astronoby
26
13
  end
27
14
 
28
15
  def from_radians(radians)
29
- normalized_radians = radians.remainder(FULL_CIRCLE_IN_RADIANS)
16
+ normalized_radians = radians.remainder(Constants::RADIANS_PER_CIRCLE)
30
17
  new(normalized_radians)
31
18
  end
32
19
 
33
20
  def from_degrees(degrees)
34
- radians = degrees / PI_IN_DEGREES * PI
21
+ radians = degrees / Constants::PI_IN_DEGREES * Math::PI
35
22
  from_radians(radians)
36
23
  end
37
24
 
38
25
  def from_hours(hours)
39
- radians = hours * RADIAN_PER_HOUR
26
+ radians = hours * Constants::RADIAN_PER_HOUR
40
27
  from_radians(radians)
41
28
  end
42
29
 
43
30
  def from_hms(hour, minute, second)
44
- hours = hour + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
31
+ hours = hour +
32
+ minute / Constants::MINUTES_PER_HOUR +
33
+ second / Constants::SECONDS_PER_HOUR
45
34
  from_hours(hours)
46
35
  end
47
36
 
48
37
  def from_dms(degree, minute, second)
49
38
  sign = degree.negative? ? -1 : 1
50
- degrees = degree.abs + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
39
+ degrees = degree.abs +
40
+ minute / Constants::MINUTES_PER_HOUR +
41
+ second / Constants::SECONDS_PER_HOUR
51
42
  from_degrees(sign * degrees)
52
43
  end
53
44
 
@@ -70,20 +61,16 @@ module Astronoby
70
61
  attr_reader :radians
71
62
 
72
63
  def initialize(radians)
73
- @radians = if radians.is_a?(Integer) || radians.is_a?(BigDecimal)
74
- BigDecimal(radians)
75
- else
76
- BigDecimal(radians, PRECISION)
77
- end
64
+ @radians = radians
78
65
  freeze
79
66
  end
80
67
 
81
68
  def degrees
82
- @radians * PI_IN_DEGREES / PI
69
+ @radians * Constants::PI_IN_DEGREES / Math::PI
83
70
  end
84
71
 
85
72
  def hours
86
- @radians / RADIAN_PER_HOUR
73
+ @radians / Constants::RADIAN_PER_HOUR
87
74
  end
88
75
 
89
76
  def +(other)
@@ -94,6 +81,10 @@ module Astronoby
94
81
  self.class.from_radians(@radians - other.radians)
95
82
  end
96
83
 
84
+ def -@
85
+ self.class.from_radians(-@radians)
86
+ end
87
+
97
88
  def sin
98
89
  Math.sin(radians)
99
90
  end
@@ -144,31 +135,32 @@ module Astronoby
144
135
  sign = deg.negative? ? "-" : "+"
145
136
  absolute_degrees = deg.abs
146
137
  degrees = absolute_degrees.floor
147
- decimal_minutes = MINUTES_PER_DEGREE * (absolute_degrees - degrees)
138
+ decimal_minutes = Constants::MINUTES_PER_DEGREE *
139
+ (absolute_degrees - degrees)
148
140
  absolute_decimal_minutes = (
149
- MINUTES_PER_DEGREE * (absolute_degrees - degrees)
141
+ Constants::MINUTES_PER_DEGREE * (absolute_degrees - degrees)
150
142
  ).abs
151
143
  minutes = decimal_minutes.floor
152
- seconds = SECONDS_PER_MINUTE * (
144
+ seconds = Constants::SECONDS_PER_MINUTE * (
153
145
  absolute_decimal_minutes - absolute_decimal_minutes.floor
154
146
  )
155
147
 
156
- Dms.new(sign, degrees, minutes, seconds.to_f.floor(4))
148
+ Dms.new(sign, degrees, minutes, seconds.floor(4))
157
149
  end
158
150
 
159
151
  def to_hms(hrs)
160
152
  absolute_hours = hrs.abs
161
153
  hours = absolute_hours.floor
162
- decimal_minutes = MINUTES_PER_HOUR * (absolute_hours - hours)
154
+ decimal_minutes = Constants::MINUTES_PER_HOUR * (absolute_hours - hours)
163
155
  absolute_decimal_minutes = (
164
- MINUTES_PER_HOUR * (absolute_hours - hours)
156
+ Constants::MINUTES_PER_HOUR * (absolute_hours - hours)
165
157
  ).abs
166
158
  minutes = decimal_minutes.floor
167
- seconds = SECONDS_PER_MINUTE * (
159
+ seconds = Constants::SECONDS_PER_MINUTE * (
168
160
  absolute_decimal_minutes - absolute_decimal_minutes.floor
169
161
  )
170
162
 
171
- Hms.new(hours, minutes, seconds.to_f.floor(4))
163
+ Hms.new(hours, minutes, seconds.floor(4))
172
164
  end
173
165
  end
174
166
  end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Astronoby
4
+ class EphemerideLunaireParisienne
5
+ # Lunar theory: Éphéméride Lunaire Parisienne
6
+ # By Jean Chapront, Michelle Chapront-Touzé
7
+ # https://en.wikipedia.org/wiki/Ephemeride_Lunaire_Parisienne
8
+
9
+ DEGREES_UNIT = 10**-6
10
+
11
+ # @return [Array] Periodic terms for the Moon's longitude and distance
12
+ def self.periodic_terms_for_moon_longitude_and_distance
13
+ [
14
+ [0, 0, 1, 0, 6288774, -20905355],
15
+ [2, 0, -1, 0, 1274027, -3699111],
16
+ [2, 0, 0, 0, 658314, -2955968],
17
+ [0, 0, 2, 0, 213618, -569925],
18
+ [0, 1, 0, 0, -185116, 48888],
19
+ [0, 0, 0, 2, -114332, -3149],
20
+ [2, 0, -2, 0, 58793, 246158],
21
+ [2, -1, -1, 0, 57066, -152138],
22
+ [2, 0, 1, 0, 53322, -170733],
23
+ [2, -1, 0, 0, 45758, -204586],
24
+ [0, 1, -1, 0, -40923, -129620],
25
+ [1, 0, 0, 0, -34720, 108743],
26
+ [0, 1, 1, 0, -30383, 104755],
27
+ [2, 0, 0, -2, 15327, 10321],
28
+ [0, 0, 1, 2, -12528, 0],
29
+ [0, 0, 1, -2, 10980, 79661],
30
+ [4, 0, -1, 0, 10675, -34782],
31
+ [0, 0, 3, 0, 10034, -23210],
32
+ [4, 0, -2, 0, 8548, -21636],
33
+ [2, 1, -1, 0, -7888, 24208],
34
+ [2, 1, 0, 0, -6766, 30824],
35
+ [1, 0, -1, 0, -5163, -8379],
36
+ [1, 1, 0, 0, 4987, -16675],
37
+ [2, -1, 1, 0, 4036, -12831],
38
+ [2, 0, 2, 0, 3994, -10445],
39
+ [4, 0, 0, 0, 3861, -11650],
40
+ [2, 0, -3, 0, 3665, 14403],
41
+ [0, 1, -2, 0, -2689, -7003],
42
+ [2, 0, -1, 2, -2602, 0],
43
+ [2, -1, -2, 0, 2390, 10056],
44
+ [1, 0, 1, 0, -2348, 6322],
45
+ [2, -2, 0, 0, 2236, -9884],
46
+ [0, 1, 2, 0, -2120, 5751],
47
+ [0, 2, 0, 0, -2069, 0],
48
+ [2, -2, -1, 0, 2048, -4950],
49
+ [2, 0, 1, -2, -1773, 4130],
50
+ [2, 0, 0, 2, -1595, 0],
51
+ [4, -1, -1, 0, 1215, -3958],
52
+ [0, 0, 2, 2, -1110, 0],
53
+ [3, 0, -1, 0, -892, 3258],
54
+ [2, 1, 1, 0, -810, 2616],
55
+ [4, -1, -2, 0, 759, -1897],
56
+ [0, 2, -1, 0, -713, -2117],
57
+ [2, 2, -1, 0, -700, 2354],
58
+ [2, 1, -2, 0, 691, 0],
59
+ [2, -1, 0, -2, 596, 0],
60
+ [4, 0, 1, 0, 549, -1423],
61
+ [0, 0, 4, 0, 537, -1117],
62
+ [4, -1, 0, 0, 520, -1571],
63
+ [1, 0, -2, 0, -487, -1739],
64
+ [2, 1, 0, -2, -399, 0],
65
+ [0, 0, 2, -2, -381, -4421],
66
+ [1, 1, 1, 0, 351, 0],
67
+ [3, 0, -2, 0, -340, 0],
68
+ [4, 0, -3, 0, 330, 0],
69
+ [2, -1, 2, 0, 327, 0],
70
+ [0, 2, 1, 0, -323, 1165],
71
+ [1, 1, -1, 0, 299, 0],
72
+ [2, 0, 3, 0, 294, 0],
73
+ [2, 0, -1, -2, 0, 8752]
74
+ ]
75
+ end
76
+
77
+ # @return [Array] Periodic terms for the Moon's latitude
78
+ def self.periodic_terms_for_moon_latitude
79
+ [
80
+ [0, 0, 0, 1, 5128122],
81
+ [0, 0, 1, 1, 280602],
82
+ [0, 0, 1, -1, 277693],
83
+ [2, 0, 0, -1, 173237],
84
+ [2, 0, -1, 1, 55413],
85
+ [2, 0, -1, -1, 46271],
86
+ [2, 0, 0, 1, 32573],
87
+ [0, 0, 2, 1, 17198],
88
+ [2, 0, 1, -1, 9266],
89
+ [0, 0, 2, -1, 8822],
90
+ [2, -1, 0, -1, 8216],
91
+ [2, 0, -2, -1, 4324],
92
+ [2, 0, 1, 1, 4200],
93
+ [2, 1, 0, -1, -3359],
94
+ [2, -1, -1, 1, 2463],
95
+ [2, -1, 0, 1, 2211],
96
+ [2, -1, -1, -1, 2065],
97
+ [0, 1, -1, -1, -1870],
98
+ [4, 0, -1, -1, 1828],
99
+ [0, 1, 0, 1, -1794],
100
+ [0, 0, 0, 3, -1749],
101
+ [0, 1, -1, 1, -1565],
102
+ [1, 0, 0, 1, -1491],
103
+ [0, 1, 1, 1, -1475],
104
+ [0, 1, 1, -1, -1410],
105
+ [0, 1, 0, -1, -1344],
106
+ [1, 0, 0, -1, -1335],
107
+ [0, 0, 3, 1, 1107],
108
+ [4, 0, 0, -1, 1021],
109
+ [4, 0, -1, 1, 833],
110
+ [0, 0, 1, -3, 777],
111
+ [4, 0, -2, 1, 671],
112
+ [2, 0, 0, -3, 607],
113
+ [2, 0, 2, -1, 596],
114
+ [2, -1, 1, -1, 491],
115
+ [2, 0, -2, 1, -451],
116
+ [0, 0, 3, -1, 439],
117
+ [2, 0, 2, 1, 422],
118
+ [2, 0, -3, -1, 421],
119
+ [2, 1, -1, 1, -366],
120
+ [2, 1, 0, 1, -351],
121
+ [4, 0, 0, 1, 331],
122
+ [2, -1, 1, 1, 315],
123
+ [2, -2, 0, -1, 302],
124
+ [0, 0, 1, 3, -283],
125
+ [2, 1, 1, -1, -229],
126
+ [1, 1, 0, -1, 223],
127
+ [1, 1, 0, 1, 223],
128
+ [0, 1, -2, -1, -220],
129
+ [2, 1, -1, -1, -220],
130
+ [1, 0, 1, 1, -185],
131
+ [2, -1, -2, -1, 181],
132
+ [0, 1, 2, 1, -177],
133
+ [4, 0, -2, -1, 176],
134
+ [4, -1, -1, -1, 166],
135
+ [1, 0, 1, -1, -164],
136
+ [4, 0, 1, -1, 132],
137
+ [1, 0, -1, -1, -119],
138
+ [4, -1, 0, -1, 115],
139
+ [2, -2, 0, 1, 107]
140
+ ]
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,249 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Astronoby
4
+ class MoonPhasesPeriodicTerms
5
+ # Lunar Solution ELP 2000-82B (Chapront-Touze+, 1988)
6
+
7
+ # Source:
8
+ # Title: Astronomical Algorithms
9
+ # Author: Jean Meeus
10
+ # Edition: 2nd edition
11
+ # Chapter: 49 - Phases of the Moon
12
+
13
+ # @param julian_centuries [Float] Julian centuries
14
+ # @param time [Float] Time
15
+ # @param eccentricity_correction [Float] Eccentricity correction
16
+ # @param moon_mean_anomaly [Float] Moon mean anomaly
17
+ # @param sun_mean_anomaly [Float] Sun mean anomaly
18
+ # @param moon_argument_of_latitude [Float] Moon argument of latitude
19
+ # @param longitude_of_the_ascending_node [Float] Longitude of the ascending node
20
+ def initialize(
21
+ julian_centuries:,
22
+ time:,
23
+ eccentricity_correction:,
24
+ moon_mean_anomaly:,
25
+ sun_mean_anomaly:,
26
+ moon_argument_of_latitude:,
27
+ longitude_of_the_ascending_node:
28
+
29
+ )
30
+ @julian_centuries = julian_centuries
31
+ @time = time
32
+ @eccentricity_correction = eccentricity_correction
33
+ @moon_mean_anomaly = moon_mean_anomaly
34
+ @sun_mean_anomaly = sun_mean_anomaly
35
+ @moon_argument_of_latitude = moon_argument_of_latitude
36
+ @longitude_of_the_ascending_node = longitude_of_the_ascending_node
37
+ end
38
+
39
+ # @return [Float] New moon correction
40
+ def new_moon_correction
41
+ ecc = @eccentricity_correction
42
+ mma = @moon_mean_anomaly.radians
43
+ sma = @sun_mean_anomaly.radians
44
+ maol = @moon_argument_of_latitude.radians
45
+ lotan = @longitude_of_the_ascending_node.radians
46
+ [
47
+ [-0.40720, mma],
48
+ [0.17241 * ecc, sma],
49
+ [0.01608, 2 * mma],
50
+ [0.01039, 2 * maol],
51
+ [0.00739 * ecc, mma - sma],
52
+ [-0.00514 * ecc, mma + sma],
53
+ [0.00208 * ecc * ecc, 2 * sma],
54
+ [-0.00111, mma - 2 * maol],
55
+ [-0.00057, mma + 2 * maol],
56
+ [0.00056 * ecc, 2 * mma + sma],
57
+ [-0.00042, 3 * mma],
58
+ [0.00042 * ecc, sma + 2 * maol],
59
+ [0.00038 * ecc, sma - 2 * maol],
60
+ [-0.00024 * ecc, 2 * mma - sma],
61
+ [-0.00017, lotan],
62
+ [-0.00007, mma + 2 * sma],
63
+ [0.00004, 2 * mma - 2 * maol],
64
+ [0.00004, 3 * sma],
65
+ [0.00003, mma + sma - 2 * maol],
66
+ [0.00003, 2 * mma + 2 * maol],
67
+ [-0.00003, mma + sma + 2 * maol],
68
+ [0.00003, mma - sma + 2 * maol],
69
+ [-0.00002, mma - sma - 2 * maol],
70
+ [-0.00002, 3 * mma + sma],
71
+ [0.00002, 4 * mma]
72
+ ].map { _1.first * Math.sin(_1.last) }.sum
73
+ end
74
+
75
+ # @return [Float] First quarter correction
76
+ def first_quarter_correction
77
+ first_and_last_quarter_correction + first_and_last_quarter_final_correction
78
+ end
79
+
80
+ # @return [Float] Full moon correction
81
+ def full_moon_correction
82
+ ecc = @eccentricity_correction
83
+ mma = @moon_mean_anomaly.radians
84
+ sma = @sun_mean_anomaly.radians
85
+ maol = @moon_argument_of_latitude.radians
86
+ lotan = @longitude_of_the_ascending_node.radians
87
+ [
88
+ [-0.40614, mma],
89
+ [0.17302 * ecc, sma],
90
+ [0.01614, 2 * mma],
91
+ [0.01043, 2 * maol],
92
+ [0.00734 * ecc, mma - sma],
93
+ [-0.00515 * ecc, mma + sma],
94
+ [0.00209 * ecc * ecc, 2 * sma],
95
+ [-0.00111, mma - 2 * maol],
96
+ [-0.00057, mma + 2 * maol],
97
+ [0.00056 * ecc, 2 * mma + sma],
98
+ [-0.00042, 3 * mma],
99
+ [0.00042 * ecc, sma + 2 * maol],
100
+ [0.00038 * ecc, sma - 2 * maol],
101
+ [-0.00024 * ecc, 2 * mma - sma],
102
+ [-0.00017, lotan],
103
+ [-0.00007, mma + 2 * sma],
104
+ [0.00004, 2 * mma - 2 * maol],
105
+ [0.00004, 3 * sma],
106
+ [0.00003, mma + sma - 2 * maol],
107
+ [0.00003, 2 * mma + 2 * maol],
108
+ [-0.00003, mma + sma + 2 * maol],
109
+ [0.00003, mma - sma + 2 * maol],
110
+ [-0.00002, mma - sma - 2 * maol],
111
+ [-0.00002, 3 * mma + sma],
112
+ [0.00002, 4 * mma]
113
+ ].map { _1.first * Math.sin(_1.last) }.sum
114
+ end
115
+
116
+ # @return [Float] Last quarter correction
117
+ def last_quarter_correction
118
+ first_and_last_quarter_correction - first_and_last_quarter_final_correction
119
+ end
120
+
121
+ # @return [Float] Additional corrections
122
+ def additional_corrections
123
+ [
124
+ [0.000325, a1],
125
+ [0.000165, a2],
126
+ [0.000164, a3],
127
+ [0.000126, a4],
128
+ [0.000110, a5],
129
+ [0.000062, a6],
130
+ [0.000060, a7],
131
+ [0.000056, a8],
132
+ [0.000047, a9],
133
+ [0.000042, a10],
134
+ [0.000040, a11],
135
+ [0.000037, a12],
136
+ [0.000035, a13],
137
+ [0.000023, a14]
138
+ ].map { _1.first * _1.last.sin }.sum
139
+ end
140
+
141
+ private
142
+
143
+ def a1
144
+ Angle.from_degrees(
145
+ (
146
+ 299.77 +
147
+ 0.107408 * @time -
148
+ 0.009173 * @julian_centuries**2
149
+ ) % 360
150
+ )
151
+ end
152
+
153
+ def a2
154
+ Angle.from_degrees (251.88 + 0.016321 * @time) % 360
155
+ end
156
+
157
+ def a3
158
+ Angle.from_degrees (251.83 + 26.651886 * @time) % 360
159
+ end
160
+
161
+ def a4
162
+ Angle.from_degrees (349.42 + 36.412478 * @time) % 360
163
+ end
164
+
165
+ def a5
166
+ Angle.from_degrees (84.66 + 18.206239 * @time) % 360
167
+ end
168
+
169
+ def a6
170
+ Angle.from_degrees (141.74 + 53.303771 * @time) % 360
171
+ end
172
+
173
+ def a7
174
+ Angle.from_degrees (207.14 + 2.453732 * @time) % 360
175
+ end
176
+
177
+ def a8
178
+ Angle.from_degrees (154.84 + 7.306860 * @time) % 360
179
+ end
180
+
181
+ def a9
182
+ Angle.from_degrees (34.52 + 27.261239 * @time) % 360
183
+ end
184
+
185
+ def a10
186
+ Angle.from_degrees (207.19 + 0.121824 * @time) % 360
187
+ end
188
+
189
+ def a11
190
+ Angle.from_degrees (291.34 + 1.844379 * @time) % 360
191
+ end
192
+
193
+ def a12
194
+ Angle.from_degrees (161.72 + 24.198154 * @time) % 360
195
+ end
196
+
197
+ def a13
198
+ Angle.from_degrees (239.56 + 25.513099 * @time) % 360
199
+ end
200
+
201
+ def a14
202
+ Angle.from_degrees (331.55 + 3.592518 * @time) % 360
203
+ end
204
+
205
+ def first_and_last_quarter_final_correction
206
+ 0.00306 -
207
+ 0.00038 * @eccentricity_correction * @sun_mean_anomaly.cos +
208
+ 0.00026 * @moon_mean_anomaly.cos -
209
+ 0.00002 * (@moon_mean_anomaly - @sun_mean_anomaly).cos +
210
+ 0.00002 * (@moon_mean_anomaly + @sun_mean_anomaly).cos +
211
+ 0.00002 * Math.cos(2 * @moon_argument_of_latitude.radians)
212
+ end
213
+
214
+ def first_and_last_quarter_correction
215
+ ecc = @eccentricity_correction
216
+ mma = @moon_mean_anomaly.radians
217
+ sma = @sun_mean_anomaly.radians
218
+ maol = @moon_argument_of_latitude.radians
219
+ lotan = @longitude_of_the_ascending_node.radians
220
+ [
221
+ [-0.62801, mma],
222
+ [0.17172 * ecc, sma],
223
+ [-0.01183, mma + sma],
224
+ [0.00862, 2 * mma],
225
+ [0.00804, 2 * maol],
226
+ [0.00454 * ecc, mma - sma],
227
+ [0.00204 * ecc**2, 2 * sma],
228
+ [-0.00180, mma - 2 * maol],
229
+ [-0.00070, mma + 2 * maol],
230
+ [-0.00040, 3 * mma],
231
+ [-0.00034 * ecc, 2 * mma - sma],
232
+ [0.00032 * ecc, sma + 2 * maol],
233
+ [0.00032, sma - 2 * maol],
234
+ [-0.00028 * ecc**2, mma + 2 * sma],
235
+ [0.00027 * ecc, 2 * mma + sma],
236
+ [-0.00017, lotan],
237
+ [-0.00005, mma - sma - 2 * maol],
238
+ [0.00004, 2 * mma + 2 * maol],
239
+ [-0.00004, mma + sma + 2 * maol],
240
+ [0.00004, mma - 2 * sma],
241
+ [0.00003, mma + sma - 2 * maol],
242
+ [0.00003, 3 * sma],
243
+ [0.00002, 2 * mma - 2 * maol],
244
+ [0.00002, mma - sma + 2 * maol],
245
+ [-0.00002, 3 * mma + sma]
246
+ ].map { _1.first * Math.sin(_1.last) }.sum
247
+ end
248
+ end
249
+ end