astronoby 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +132 -0
- data/Gemfile.lock +19 -17
- data/README.md +195 -25
- data/UPGRADING.md +72 -0
- data/lib/astronoby/aberration.rb +7 -5
- data/lib/astronoby/angle.rb +26 -34
- data/lib/astronoby/astronomical_models/ephemeride_lunaire_parisienne.rb +143 -0
- data/lib/astronoby/astronomical_models/moon_phases_periodic_terms.rb +249 -0
- data/lib/astronoby/bodies/moon.rb +335 -0
- data/lib/astronoby/bodies/sun.rb +129 -132
- data/lib/astronoby/constants.rb +31 -0
- data/lib/astronoby/coordinates/ecliptic.rb +4 -4
- data/lib/astronoby/coordinates/equatorial.rb +7 -5
- data/lib/astronoby/coordinates/horizontal.rb +24 -12
- data/lib/astronoby/distance.rb +83 -0
- data/lib/astronoby/epoch.rb +0 -2
- data/lib/astronoby/equinox_solstice.rb +3 -2
- data/lib/astronoby/events/moon_phases.rb +143 -0
- data/lib/astronoby/events/observation_events.rb +259 -0
- data/lib/astronoby/events/rise_transit_set_iteration.rb +215 -0
- data/lib/astronoby/events/twilight_events.rb +121 -0
- data/lib/astronoby/geocentric_parallax.rb +36 -56
- data/lib/astronoby/mean_obliquity.rb +2 -2
- data/lib/astronoby/moon_phase.rb +43 -0
- data/lib/astronoby/nutation.rb +5 -3
- data/lib/astronoby/observer.rb +39 -18
- data/lib/astronoby/precession.rb +1 -1
- data/lib/astronoby/refraction.rb +8 -10
- data/lib/astronoby/time/greenwich_sidereal_time.rb +18 -29
- data/lib/astronoby/time/local_sidereal_time.rb +4 -4
- data/lib/astronoby/util/maths.rb +72 -0
- data/lib/astronoby/util/time.rb +88 -0
- data/lib/astronoby/util/trigonometry.rb +4 -4
- data/lib/astronoby/version.rb +1 -1
- data/lib/astronoby.rb +12 -1
- metadata +15 -4
- data/lib/astronoby/body.rb +0 -155
data/lib/astronoby/angle.rb
CHANGED
@@ -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
|
-
|
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(
|
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 +
|
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 +
|
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 =
|
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 *
|
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.
|
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.
|
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
|