astronoby 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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