astronoby 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25e45175dabf69ffa0c98ffdf3e93cb21b9ce004fe4e0ffe61a4cfc92794ae44
4
- data.tar.gz: 2d1ad05a74a171c71f6ff0a7fa7c3af1874f07379c8be407ff633d61ad4dd78e
3
+ metadata.gz: 2ab8b9191b1b2452c678389fbc4c1750c4080c8f3cddf55cf7aebad2d99a0da7
4
+ data.tar.gz: f823456f556792e1d2ea3747f3665c84442a907c3a08271df5f871204bd09f10
5
5
  SHA512:
6
- metadata.gz: 74cdfbf511e8094bd410c67ed86eaff12f03124bec48c769eb3e6ebf1fd54870145a556cc82214db5147bd2c6e4631d0514973a76648d0e68d8770162401d338
7
- data.tar.gz: 7a6c7f98fff52a04d60dc5c4eced47610900aa10a64f8016000b9294276d547d4d350ef0d269a25f42ae9b0078d110ad9b73884f3834e55a12084274f358ae15
6
+ metadata.gz: b14d2a19972991fecc5b0a12c15fe18f3a9a07d0e9fc705fe2d984af14e45ae82962332361e65dace20c27b5f6e05e19483385731770abe463a3bf28adcfb354
7
+ data.tar.gz: 725810244872e539789b23d2b28ce656781a1f9121fabc76c3e2ebc5c9e6616900bff852290cf8719a10feb7a06afa42f7d02f4e00ac3ba2dadc4dea47d6a24c
data/CHANGELOG.md CHANGED
@@ -1,10 +1,27 @@
1
1
  # Changelog
2
2
 
3
- ## 0.2.0 - 2024-03-24
3
+ ## 0.3.0 - 2024-03-29
4
4
 
5
5
  _If you are upgrading: please see [`UPGRADING.md`]._
6
6
 
7
- [`UPGRADING.md`]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
7
+ ### Improvements
8
+
9
+ * Drop `Angle#==` ([#42])
10
+ * Improved accuracy with Sun's location predictions ([#41])
11
+
12
+ ### Breaking changes
13
+
14
+ * **breaking:** Difference between true and apparent ecliptic and equatorial
15
+ coordinates ([#41])
16
+ * **breaking:** Rename `Angle::as_*` into `Angle::from_*` ([#43])
17
+
18
+ [#41]: https://github.com/rhannequin/astronoby/pull/41
19
+ [#42]: https://github.com/rhannequin/astronoby/pull/42
20
+ [#43]: https://github.com/rhannequin/astronoby/pull/43
21
+
22
+ ## 0.2.0 - 2024-03-24
23
+
24
+ _If you are upgrading: please see [`UPGRADING.md`]._
8
25
 
9
26
  ### Features
10
27
 
@@ -74,3 +91,5 @@ _If you are upgrading: please see [`UPGRADING.md`]._
74
91
 
75
92
  * Add `Astronoby::Angle`
76
93
  * Support angles in degrees and radians
94
+
95
+ [`UPGRADING.md`]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- astronoby (0.2.0)
4
+ astronoby (0.3.0)
5
5
  matrix (~> 0.4.2)
6
6
  rake (~> 13.0)
7
7
  rspec (~> 3.0)
data/README.md CHANGED
@@ -28,14 +28,53 @@ This library is still in heavy development. The public is not stable, please
28
28
  be aware new minor versions will probably lead to breaking changes until a
29
29
  major one is released.
30
30
 
31
+ ### Angle manipulation
32
+
33
+ ```rb
34
+ angle1 = Astronoby::Angle.from_degrees(90)
35
+ angle2 = Astronoby::Angle.from_radians(Astronoby::Angle::PI / 2)
36
+ angle3 = Astronoby::Angle.from_hours(12)
37
+
38
+ angle1 == angle2
39
+ # => true
40
+
41
+ angle1 < angle3
42
+ # => true
43
+
44
+ angle = angle1 + angle2 + angle3
45
+ angle.cos
46
+ # => 1.0
47
+ ```
48
+
49
+ ### Coordinates conversion
50
+
51
+ ```rb
52
+ equatorial = Astronoby::Coordinates::Equatorial.new(
53
+ right_ascension: Astronoby::Angle.from_hms(17, 43, 54),
54
+ declination: Astronoby::Angle.from_dms(-22, 10, 0)
55
+ )
56
+
57
+ horizontal = equatorial.to_horizontal(
58
+ time: Time.new(2016, 1, 21, 21, 30, 0, "-05:00"),
59
+ latitude: Astronoby::Angle.from_degrees(38),
60
+ longitude: Astronoby::Angle.from_degrees(-78)
61
+ )
62
+
63
+ horizontal.altitude.str(:dms)
64
+ # => "-73° 27′ 19.1557″"
65
+
66
+ horizontal.azimuth.str(:dms)
67
+ # => "+341° 33′ 21.587″"
68
+ ```
69
+
31
70
  ### Sun's location in the sky
32
71
 
33
72
  ```rb
34
73
  time = Time.utc(2023, 2, 17, 11, 0, 0)
35
74
  epoch = Astronoby::Epoch.from_time(time)
36
75
 
37
- latitude = Astronoby::Angle.as_degrees(48.8566)
38
- longitude = Astronoby::Angle.as_degrees(2.3522)
76
+ latitude = Astronoby::Angle.from_degrees(48.8566)
77
+ longitude = Astronoby::Angle.from_degrees(2.3522)
39
78
 
40
79
  sun = Astronoby::Sun.new(epoch: epoch)
41
80
 
@@ -45,10 +84,34 @@ horizontal_coordinates = sun.horizontal_coordinates(
45
84
  )
46
85
 
47
86
  horizontal_coordinates.altitude.degrees.to_f
48
- # => 27.502365130176567
87
+ # => 27.50008242057459
49
88
 
50
89
  horizontal_coordinates.altitude.str(:dms)
51
- # => "+27° 30′ 8.5144″"
90
+ # => "+27° 30′ 0.2967″"
91
+ ```
92
+
93
+ ### Sunrise and sunset times and azimuths
94
+
95
+ ```rb
96
+ date = Date.new(2015, 2, 5)
97
+ epoch = Astronoby::Epoch.from_time(date)
98
+ observer = Astronoby::Observer.new(
99
+ latitude: Astronoby::Angle.from_degrees(38),
100
+ longitude: Astronoby::Angle.from_degrees(-78)
101
+ )
102
+ sun = Astronoby::Sun.new(epoch: epoch)
103
+
104
+ sun.rising_time(observer: observer)
105
+ # => 2015-02-05 12:13:26 UTC
106
+
107
+ sun.rising_azimuth(observer: observer).str(:dms)
108
+ # => "+109° 41′ 22.2585″"
109
+
110
+ sun.setting_time(observer: observer)
111
+ # => 2015-02-05 22:35:12 UTC
112
+
113
+ sun.setting_azimuth(observer: observer).str(:dms)
114
+ # => "+250° 18′ 37.7414″"
52
115
  ```
53
116
 
54
117
  ### Solstice and Equinox times
@@ -57,10 +120,10 @@ horizontal_coordinates.altitude.str(:dms)
57
120
  year = 2024
58
121
 
59
122
  Astronoby::EquinoxSolstice.march_equinox(year)
60
- # => 2024-03-20 03:05:00 UTC
123
+ # => 2024-03-20 03:05:08 UTC
61
124
 
62
125
  Astronoby::EquinoxSolstice.june_solstice(year)
63
- # => 2024-06-20 20:50:14 UTC
126
+ # => 2024-06-20 20:50:18 UTC
64
127
  ```
65
128
 
66
129
  ## Precision
data/UPGRADING.md CHANGED
@@ -7,6 +7,56 @@ changes to it as long as a major version has not been released.
7
7
  If you are already using Astronoby and wish to follow the changes to its
8
8
  public API, please read the upgrading notes for each release.
9
9
 
10
+ ## Upgrading from 0.2.0 to 0.3.0
11
+
12
+ ### `Sun#ecliptic_coordinates` method removed (#41)
13
+
14
+ Removed in favor of `#true_ecliptic_coordinates` and
15
+ `#apparent_ecliptic_coordinates`.
16
+
17
+ ### `Coordinates::Ecliptic#to_horizontal` method removed (#41)
18
+
19
+ Removed in favor of `#to_true_horizontal` and
20
+ `#to_apparent_horizontal`.
21
+
22
+ ### `Sun#true_ecliptic_coordinates` method added (#41)
23
+
24
+ Returns the true ecliptic coordinates for the date's epoch.
25
+
26
+ ### `Sun#apparent_ecliptic_coordinates` method added (#41)
27
+
28
+ Returns the apparent ecliptic coordinates for the date's epoch, including
29
+ corrections for the nutation and aberration.
30
+
31
+ ### `Coordinates::Ecliptic#to_true_horizontal` method added (#41)
32
+
33
+ Returns the true equatorial coordinates for ths date's epoch.
34
+
35
+ ### `Coordinates::Ecliptic#to_apparent_horizontal` method added (#41)
36
+
37
+ Returns the apparent equatorial coordinates for the date's epoch, including
38
+ corrections for the obliquity.
39
+
40
+ ### `Angle::as_radians` renamed into `Angle::from_radians` (#43)
41
+
42
+ Behaviour not changed.
43
+
44
+ ### `Angle::as_degrees` renamed into `Angle::from_degrees` (#43)
45
+
46
+ Behaviour not changed.
47
+
48
+ ### `Angle::as_hours` renamed into `Angle::from_hours` (#43)
49
+
50
+ Behaviour not changed.
51
+
52
+ ### `Angle::as_dms` renamed into `Angle::from_dms` (#43)
53
+
54
+ Behaviour not changed.
55
+
56
+ ### `Angle::as_hms` renamed into `Angle::from_hms` (#43)
57
+
58
+ Behaviour not changed.
59
+
10
60
  ## Upgrading from 0.1.0 to 0.2.0
11
61
 
12
62
  ### `Observer` class added (#29)
@@ -17,13 +17,13 @@ module Astronoby
17
17
  # Edition: Cambridge University Press
18
18
  # Chapter: 36 - Aberration
19
19
  def apply
20
- delta_longitude = Angle.as_degrees(
20
+ delta_longitude = Angle.from_degrees(
21
21
  -20.5 * (
22
22
  sun_longitude - @coordinates.longitude
23
23
  ).cos / @coordinates.latitude.cos / 3600
24
24
  )
25
25
 
26
- delta_latitude = Angle.as_degrees(
26
+ delta_latitude = Angle.from_degrees(
27
27
  -20.5 *
28
28
  (sun_longitude - @coordinates.longitude).sin *
29
29
  @coordinates.latitude.sin / 3600
@@ -36,7 +36,10 @@ module Astronoby
36
36
  end
37
37
 
38
38
  def sun_longitude
39
- @_sun_longitude ||= Sun.new(epoch: @epoch).ecliptic_coordinates.longitude
39
+ @_sun_longitude ||= Sun
40
+ .new(epoch: @epoch)
41
+ .true_ecliptic_coordinates
42
+ .longitude
40
43
  end
41
44
  end
42
45
  end
@@ -25,45 +25,45 @@ module Astronoby
25
25
  new(0)
26
26
  end
27
27
 
28
- def as_radians(radians)
28
+ def from_radians(radians)
29
29
  normalized_radians = radians.remainder(FULL_CIRCLE_IN_RADIANS)
30
30
  new(normalized_radians)
31
31
  end
32
32
 
33
- def as_degrees(degrees)
33
+ def from_degrees(degrees)
34
34
  radians = degrees / PI_IN_DEGREES * PI
35
- as_radians(radians)
35
+ from_radians(radians)
36
36
  end
37
37
 
38
- def as_hours(hours)
38
+ def from_hours(hours)
39
39
  radians = hours * RADIAN_PER_HOUR
40
- as_radians(radians)
40
+ from_radians(radians)
41
41
  end
42
42
 
43
- def as_hms(hour, minute, second)
43
+ def from_hms(hour, minute, second)
44
44
  hours = hour + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
45
- as_hours(hours)
45
+ from_hours(hours)
46
46
  end
47
47
 
48
- def as_dms(degree, minute, second)
48
+ def from_dms(degree, minute, second)
49
49
  sign = degree.negative? ? -1 : 1
50
50
  degrees = degree.abs + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
51
- as_degrees(sign * degrees)
51
+ from_degrees(sign * degrees)
52
52
  end
53
53
 
54
54
  def asin(ratio)
55
55
  radians = Math.asin(ratio)
56
- as_radians(radians)
56
+ from_radians(radians)
57
57
  end
58
58
 
59
59
  def acos(ratio)
60
60
  radians = Math.acos(ratio)
61
- as_radians(radians)
61
+ from_radians(radians)
62
62
  end
63
63
 
64
64
  def atan(ratio)
65
65
  radians = Math.atan(ratio)
66
- as_radians(radians)
66
+ from_radians(radians)
67
67
  end
68
68
  end
69
69
 
@@ -87,11 +87,11 @@ module Astronoby
87
87
  end
88
88
 
89
89
  def +(other)
90
- self.class.as_radians(radians + other.radians)
90
+ self.class.from_radians(radians + other.radians)
91
91
  end
92
92
 
93
93
  def -(other)
94
- self.class.as_radians(@radians - other.radians)
94
+ self.class.from_radians(@radians - other.radians)
95
95
  end
96
96
 
97
97
  def sin
@@ -118,20 +118,16 @@ module Astronoby
118
118
  radians.zero?
119
119
  end
120
120
 
121
- def ==(other)
122
- other.is_a?(self.class) && radians == other.radians
123
- end
124
- alias_method :eql?, :==
125
-
126
121
  def hash
127
122
  [radians, self.class].hash
128
123
  end
129
124
 
130
125
  def <=>(other)
131
- return nil unless other.is_a?(self.class)
126
+ return unless other.is_a?(self.class)
132
127
 
133
128
  radians <=> other.radians
134
129
  end
130
+ alias_method :eql?, :==
135
131
 
136
132
  def str(format)
137
133
  case format
@@ -3,7 +3,7 @@
3
3
  module Astronoby
4
4
  class Sun
5
5
  SEMI_MAJOR_AXIS_IN_METERS = 149_598_500_000
6
- ANGULAR_DIAMETER = Angle.as_degrees(0.533128)
6
+ ANGULAR_DIAMETER = Angle.from_degrees(0.533128)
7
7
  INTERPOLATION_FACTOR = BigDecimal("24.07")
8
8
 
9
9
  # Source:
@@ -19,8 +19,8 @@ module Astronoby
19
19
  epoch_at_noon = Epoch.from_time(noon)
20
20
  sun_at_noon = new(epoch: epoch_at_noon)
21
21
  equatorial_hours = sun_at_noon
22
- .ecliptic_coordinates
23
- .to_equatorial(epoch: epoch_at_noon)
22
+ .apparent_ecliptic_coordinates
23
+ .to_apparent_equatorial(epoch: epoch_at_noon)
24
24
  .right_ascension
25
25
  .hours
26
26
  gst = GreenwichSiderealTime
@@ -41,13 +41,24 @@ module Astronoby
41
41
  @epoch = epoch
42
42
  end
43
43
 
44
- # @return [Astronoby::Coordinates::Ecliptic] Sun's ecliptic coordinates
45
- def ecliptic_coordinates
44
+ def true_ecliptic_coordinates
46
45
  Coordinates::Ecliptic.new(
47
46
  latitude: Angle.zero,
48
- longitude: Angle.as_degrees(
49
- (true_anomaly + longitude_at_perigee).degrees % 360
50
- )
47
+ longitude: true_longitude
48
+ )
49
+ end
50
+
51
+ def apparent_ecliptic_coordinates
52
+ nutation = Nutation.for_ecliptic_longitude(epoch: @epoch)
53
+ longitude_with_aberration = Aberration.for_ecliptic_coordinates(
54
+ coordinates: true_ecliptic_coordinates,
55
+ epoch: @epoch
56
+ ).longitude
57
+ apparent_longitude = nutation + longitude_with_aberration
58
+
59
+ Coordinates::Ecliptic.new(
60
+ latitude: Angle.zero,
61
+ longitude: apparent_longitude
51
62
  )
52
63
  end
53
64
 
@@ -59,8 +70,8 @@ module Astronoby
59
70
  def horizontal_coordinates(latitude:, longitude:)
60
71
  time = Epoch.to_utc(@epoch)
61
72
 
62
- ecliptic_coordinates
63
- .to_equatorial(epoch: @epoch)
73
+ apparent_ecliptic_coordinates
74
+ .to_apparent_equatorial(epoch: @epoch)
64
75
  .to_horizontal(time: time, latitude: latitude, longitude: longitude)
65
76
  end
66
77
 
@@ -83,7 +94,8 @@ module Astronoby
83
94
  # @param observer [Astronoby::Observer] Observer of the event
84
95
  # @return [Astronoby::Angle, nil] Azimuth of sunrise
85
96
  def rising_azimuth(observer:)
86
- equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: @epoch)
97
+ equatorial_coordinates = apparent_ecliptic_coordinates
98
+ .to_apparent_equatorial(epoch: @epoch)
87
99
  Body.new(equatorial_coordinates).rising_azimuth(
88
100
  latitude: observer.latitude,
89
101
  vertical_shift: vertical_shift
@@ -109,7 +121,8 @@ module Astronoby
109
121
  # @param observer [Astronoby::Observer] Observer of the event
110
122
  # @return [Astronoby::Angle, nil] Azimuth of sunset
111
123
  def setting_azimuth(observer:)
112
- equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: @epoch)
124
+ equatorial_coordinates = apparent_ecliptic_coordinates
125
+ .to_apparent_equatorial(epoch: @epoch)
113
126
  Body.new(equatorial_coordinates).setting_azimuth(
114
127
  latitude: observer.latitude,
115
128
  vertical_shift: vertical_shift
@@ -123,7 +136,9 @@ module Astronoby
123
136
 
124
137
  # @return [Astronoby::Angle] Apparent Sun's angular size
125
138
  def angular_size
126
- Angle.as_degrees(ANGULAR_DIAMETER.degrees * distance_angular_size_factor)
139
+ Angle.from_degrees(
140
+ ANGULAR_DIAMETER.degrees * distance_angular_size_factor
141
+ )
127
142
  end
128
143
 
129
144
  # @return [Astronoby::Angle] Sun's true anomaly
@@ -139,27 +154,33 @@ module Astronoby
139
154
  (1 + orbital_eccentricity.degrees) / (1 - orbital_eccentricity.degrees)
140
155
  ) * Math.tan(eccentric_anomaly.radians / 2)
141
156
 
142
- Angle.as_degrees((Angle.atan(tan).degrees * 2) % 360)
157
+ Angle.from_degrees((Angle.atan(tan).degrees * 2) % 360)
143
158
  end
144
159
 
145
160
  # @return [Astronoby::Angle] Sun's longitude at perigee
146
161
  def longitude_at_perigee
147
- Angle.as_degrees(
162
+ Angle.from_degrees(
148
163
  (281.2208444 + 1.719175 * centuries + 0.000452778 * centuries**2) % 360
149
164
  )
150
165
  end
151
166
 
152
167
  # @return [Astronoby::Angle] Sun's orbital eccentricity
153
168
  def orbital_eccentricity
154
- Angle.as_degrees(
169
+ Angle.from_degrees(
155
170
  (0.01675104 - 0.0000418 * centuries - 0.000000126 * centuries**2) % 360
156
171
  )
157
172
  end
158
173
 
159
174
  private
160
175
 
176
+ def true_longitude
177
+ Angle.from_degrees(
178
+ (true_anomaly + longitude_at_perigee).degrees % 360
179
+ )
180
+ end
181
+
161
182
  def mean_anomaly
162
- Angle.as_degrees(
183
+ Angle.from_degrees(
163
184
  (longitude_at_base_epoch - longitude_at_perigee).degrees % 360
164
185
  )
165
186
  end
@@ -173,7 +194,7 @@ module Astronoby
173
194
  end
174
195
 
175
196
  def longitude_at_base_epoch
176
- Angle.as_degrees(
197
+ Angle.from_degrees(
177
198
  (279.6966778 + 36000.76892 * centuries + 0.0003025 * centuries**2) % 360
178
199
  )
179
200
  end
@@ -191,9 +212,10 @@ module Astronoby
191
212
  sun_at_midnight = self.class.new(epoch: epoch)
192
213
  shift = Body::DEFAULT_REFRACTION_VERTICAL_SHIFT +
193
214
  GeocentricParallax.angle(distance: sun_at_midnight.earth_distance) +
194
- Angle.as_degrees(sun_at_midnight.angular_size.degrees / 2)
195
- ecliptic_coordinates = sun_at_midnight.ecliptic_coordinates
196
- equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: epoch)
215
+ Angle.from_degrees(sun_at_midnight.angular_size.degrees / 2)
216
+ ecliptic_coordinates = sun_at_midnight.apparent_ecliptic_coordinates
217
+ equatorial_coordinates = ecliptic_coordinates
218
+ .to_apparent_equatorial(epoch: epoch)
197
219
 
198
220
  event_time = if event == :rising
199
221
  Body.new(equatorial_coordinates).rising_time(
@@ -220,7 +242,7 @@ module Astronoby
220
242
  def vertical_shift
221
243
  Astronoby::Body::DEFAULT_REFRACTION_VERTICAL_SHIFT +
222
244
  Astronoby::GeocentricParallax.angle(distance: earth_distance) +
223
- Astronoby::Angle.as_degrees(angular_size.degrees / 2)
245
+ Astronoby::Angle.from_degrees(angular_size.degrees / 2)
224
246
  end
225
247
  end
226
248
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Astronoby
4
4
  class Body
5
- DEFAULT_REFRACTION_VERTICAL_SHIFT = Angle.as_dms(0, 34, 0)
5
+ DEFAULT_REFRACTION_VERTICAL_SHIFT = Angle.from_dms(0, 34, 0)
6
6
  RISING_SETTING_HOUR_ANGLE_RATIO_RANGE = (-1..1)
7
7
 
8
8
  def initialize(equatorial_coordinates)
@@ -80,7 +80,7 @@ module Astronoby
80
80
  vertical_shift: nil
81
81
  )
82
82
  time_ratio = time_ratio(latitude, apparent, vertical_shift)
83
- return nil unless RISING_SETTING_HOUR_ANGLE_RATIO_RANGE.cover?(time_ratio)
83
+ return unless RISING_SETTING_HOUR_ANGLE_RATIO_RANGE.cover?(time_ratio)
84
84
 
85
85
  hour_angle = Angle.acos(time_ratio)
86
86
  local_sidereal_time = LocalSiderealTime.new(
@@ -108,7 +108,7 @@ module Astronoby
108
108
 
109
109
  azimuth_ratio = azimuth_ratio(latitude, apparent, vertical_shift)
110
110
 
111
- Angle.as_degrees(360 - Angle.acos(azimuth_ratio).degrees)
111
+ Angle.from_degrees(360 - Angle.acos(azimuth_ratio).degrees)
112
112
  end
113
113
 
114
114
  private
@@ -15,26 +15,37 @@ module Astronoby
15
15
  # Author: J. L. Lawrence
16
16
  # Edition: MIT Press
17
17
  # Chapter: 4 - Orbits and Coordinate Systems
18
- def to_equatorial(epoch:)
18
+
19
+ def to_true_equatorial(epoch:)
19
20
  mean_obliquity = MeanObliquity.for_epoch(epoch)
21
+ to_equatorial(obliquity: mean_obliquity)
22
+ end
23
+
24
+ def to_apparent_equatorial(epoch:)
25
+ apparent_obliquity = TrueObliquity.for_epoch(epoch)
26
+ to_equatorial(obliquity: apparent_obliquity)
27
+ end
28
+
29
+ private
20
30
 
21
- y = Angle.as_radians(
22
- @longitude.sin * mean_obliquity.cos -
23
- @latitude.tan * mean_obliquity.sin
31
+ def to_equatorial(obliquity:)
32
+ y = Angle.from_radians(
33
+ @longitude.sin * obliquity.cos -
34
+ @latitude.tan * obliquity.sin
24
35
  )
25
- x = Angle.as_radians(@longitude.cos)
36
+ x = Angle.from_radians(@longitude.cos)
26
37
  r = Angle.atan(y.radians / x.radians)
27
38
  right_ascension = Util::Trigonometry.adjustement_for_arctangent(y, x, r)
28
39
 
29
40
  declination = Angle.asin(
30
- @latitude.sin * mean_obliquity.cos +
31
- @latitude.cos * mean_obliquity.sin * @longitude.sin
41
+ @latitude.sin * obliquity.cos +
42
+ @latitude.cos * obliquity.sin * @longitude.sin
32
43
  )
33
44
 
34
45
  Equatorial.new(
35
46
  right_ascension: right_ascension,
36
47
  declination: declination,
37
- epoch: epoch
48
+ epoch: @epoch
38
49
  )
39
50
  end
40
51
  end
@@ -25,7 +25,7 @@ module Astronoby
25
25
  ha = (lst.time - @right_ascension.hours)
26
26
  ha += 24 if ha.negative?
27
27
 
28
- Angle.as_hours(ha)
28
+ Angle.from_hours(ha)
29
29
  end
30
30
 
31
31
  def to_horizontal(time:, latitude:, longitude:)
@@ -39,7 +39,7 @@ module Astronoby
39
39
  azimuth = Angle.acos(t2)
40
40
 
41
41
  if ha.sin.positive?
42
- azimuth = Angle.as_degrees(BigDecimal("360") - azimuth.degrees)
42
+ azimuth = Angle.from_degrees(BigDecimal("360") - azimuth.degrees)
43
43
  end
44
44
 
45
45
  Horizontal.new(
@@ -58,11 +58,11 @@ module Astronoby
58
58
  def to_ecliptic(epoch:)
59
59
  mean_obliquity = MeanObliquity.for_epoch(epoch)
60
60
 
61
- y = Angle.as_radians(
61
+ y = Angle.from_radians(
62
62
  @right_ascension.sin * mean_obliquity.cos +
63
63
  @declination.tan * mean_obliquity.sin
64
64
  )
65
- x = Angle.as_radians(@right_ascension.cos)
65
+ x = Angle.from_radians(@right_ascension.cos)
66
66
  r = Angle.atan(y.radians / x.radians)
67
67
  longitude = Util::Trigonometry.adjustement_for_arctangent(y, x, r)
68
68
 
@@ -31,17 +31,17 @@ module Astronoby
31
31
 
32
32
  if @azimuth.sin.positive?
33
33
  hour_angle_degrees = Angle
34
- .as_degrees(BigDecimal("360") - hour_angle_degrees)
34
+ .from_degrees(BigDecimal("360") - hour_angle_degrees)
35
35
  .degrees
36
36
  end
37
37
 
38
- hour_angle_hours = Angle.as_degrees(hour_angle_degrees).hours
38
+ hour_angle_hours = Angle.from_degrees(hour_angle_degrees).hours
39
39
  lst = GreenwichSiderealTime
40
40
  .from_utc(time.utc)
41
41
  .to_lst(longitude: @longitude)
42
42
  right_ascension_decimal = lst.time - hour_angle_hours
43
43
  right_ascension_decimal += 24 if right_ascension_decimal.negative?
44
- right_ascension = Angle.as_hours(right_ascension_decimal)
44
+ right_ascension = Angle.from_hours(right_ascension_decimal)
45
45
 
46
46
  Equatorial.new(
47
47
  right_ascension: right_ascension,
@@ -102,13 +102,13 @@ module Astronoby
102
102
 
103
103
  def compute
104
104
  t = (julian_day - Epoch::J2000) / Epoch::DAYS_PER_JULIAN_CENTURY
105
- w = Angle.as_degrees(35999.373 * t) - Angle.as_degrees(2.47)
105
+ w = Angle.from_degrees(35999.373 * t) - Angle.from_degrees(2.47)
106
106
  delta = 1 +
107
107
  0.0334 * w.cos +
108
- 0.0007 * Angle.as_degrees(w.degrees * 2).cos
108
+ 0.0007 * Angle.from_degrees(w.degrees * 2).cos
109
109
 
110
110
  s = PERIODIC_TERMS.sum do |a, b, c|
111
- a * (Angle.as_degrees(b) + Angle.as_degrees(c * t)).cos
111
+ a * (Angle.from_degrees(b) + Angle.from_degrees(c * t)).cos
112
112
  end
113
113
 
114
114
  delta_days = 0.00001 * s / delta
@@ -131,23 +131,9 @@ module Astronoby
131
131
 
132
132
  def correction(epoch)
133
133
  sun = Sun.new(epoch: epoch)
134
+ longitude = sun.apparent_ecliptic_coordinates.longitude
134
135
 
135
- nutation = Nutation.for_ecliptic_longitude(epoch: epoch)
136
-
137
- earth_radius_vector = 1 / (
138
- 1 +
139
- sun.orbital_eccentricity.degrees *
140
- (sun.true_anomaly - sun.longitude_at_perigee).cos
141
- )
142
- aberration = Angle.as_degrees(
143
- Angle.as_dms(0, 0, 20.4898).degrees / -earth_radius_vector
144
- )
145
-
146
- corrected_longitude = sun.ecliptic_coordinates.longitude +
147
- nutation +
148
- aberration
149
-
150
- 58 * Angle.as_degrees(@event * 90 - corrected_longitude.degrees).sin
136
+ 58 * Angle.from_degrees(@event * 90 - longitude.degrees).sin
151
137
  end
152
138
  end
153
139
  end
@@ -16,7 +16,7 @@ module Astronoby
16
16
 
17
17
  t = (epoch - EPOCH_OF_REFERENCE) / Epoch::DAYS_PER_JULIAN_CENTURY
18
18
 
19
- Angle.as_degrees(
19
+ Angle.from_degrees(
20
20
  obliquity_of_reference.degrees - (
21
21
  46.815 * t -
22
22
  0.0006 * t * t +
@@ -26,7 +26,7 @@ module Astronoby
26
26
  end
27
27
 
28
28
  def self.obliquity_of_reference
29
- Angle.as_dms(23, 26, 21.45)
29
+ Angle.from_dms(23, 26, 21.45)
30
30
  end
31
31
  end
32
32
  end
@@ -21,7 +21,7 @@ module Astronoby
21
21
  end
22
22
 
23
23
  def for_ecliptic_longitude
24
- Angle.as_dms(
24
+ Angle.from_dms(
25
25
  0,
26
26
  0,
27
27
  (
@@ -32,7 +32,7 @@ module Astronoby
32
32
  end
33
33
 
34
34
  def for_obliquity_of_the_ecliptic
35
- Angle.as_dms(
35
+ Angle.from_dms(
36
36
  0,
37
37
  0,
38
38
  (
@@ -49,13 +49,13 @@ module Astronoby
49
49
  end
50
50
 
51
51
  def sun_mean_longitude
52
- Angle.as_degrees(
52
+ Angle.from_degrees(
53
53
  (279.6967 + 360.0 * (centuries_a - centuries_a.to_i)) % 360
54
54
  )
55
55
  end
56
56
 
57
57
  def moon_ascending_node_longitude
58
- Angle.as_degrees(
58
+ Angle.from_degrees(
59
59
  (259.1833 - 360.0 * (centuries_b - centuries_b.to_i)) % 360
60
60
  )
61
61
  end
@@ -33,8 +33,8 @@ module Astronoby
33
33
 
34
34
  Coordinates::Equatorial.new(
35
35
  right_ascension: Util::Trigonometry.adjustement_for_arctangent(
36
- Angle.as_radians(w[1]),
37
- Angle.as_radians(w[0]),
36
+ Angle.from_radians(w[1]),
37
+ Angle.from_radians(w[0]),
38
38
  Angle.atan(w[1] / w[0])
39
39
  ),
40
40
  declination: Angle.asin(w[2]),
@@ -47,13 +47,13 @@ module Astronoby
47
47
  def matrix_for_epoch(epoch)
48
48
  t = (epoch - Epoch::DEFAULT_EPOCH) / Epoch::DAYS_PER_JULIAN_CENTURY
49
49
 
50
- zeta = Angle.as_degrees(
50
+ zeta = Angle.from_degrees(
51
51
  0.6406161 * t + 0.0000839 * t * t + 0.000005 * t * t * t
52
52
  )
53
- z = Angle.as_degrees(
53
+ z = Angle.from_degrees(
54
54
  0.6406161 * t + 0.0003041 * t * t + 0.0000051 * t * t * t
55
55
  )
56
- theta = Angle.as_degrees(
56
+ theta = Angle.from_degrees(
57
57
  0.5567530 * t - 0.0001185 * t * t - 0.0000116 * t * t * t
58
58
  )
59
59
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Astronoby
4
4
  class Refraction
5
- LOW_ALTITUDE_BODY_ANGLE = Angle.as_degrees(15)
6
- ZENITH = Angle.as_degrees(90)
5
+ LOW_ALTITUDE_BODY_ANGLE = Angle.from_degrees(15)
6
+ ZENITH = Angle.from_degrees(90)
7
7
 
8
8
  def self.angle(coordinates:, observer:)
9
9
  new(coordinates, observer).refraction_angle
@@ -56,7 +56,7 @@ module Astronoby
56
56
 
57
57
  def high_altitude_angle
58
58
  zenith_angle = ZENITH - @coordinates.altitude
59
- Angle.as_degrees(0.00452 * pressure * zenith_angle.tan / temperature)
59
+ Angle.from_degrees(0.00452 * pressure * zenith_angle.tan / temperature)
60
60
  end
61
61
 
62
62
  def low_altitude_angle
@@ -67,7 +67,7 @@ module Astronoby
67
67
  1 + 0.505 * altitude_in_degrees + 0.0845 * altitude_in_degrees**2
68
68
  )
69
69
 
70
- Angle.as_degrees(term1 / term2)
70
+ Angle.from_degrees(term1 / term2)
71
71
  end
72
72
  end
73
73
  end
@@ -42,7 +42,7 @@ module Astronoby
42
42
  previous_solution &&
43
43
  (solution - previous_solution).abs <= precision
44
44
  )
45
- return Angle.as_radians(solution)
45
+ return Angle.from_radians(solution)
46
46
  end
47
47
 
48
48
  eccentric_anomaly_newton_raphson(
@@ -51,7 +51,7 @@ module Astronoby
51
51
  precision,
52
52
  maximum_iteration_count,
53
53
  current_iteration + 1,
54
- Angle.as_radians(solution)
54
+ Angle.from_radians(solution)
55
55
  )
56
56
  end
57
57
  end
@@ -15,10 +15,10 @@ module Astronoby
15
15
  return angle if y.positive? && x.positive?
16
16
 
17
17
  if y.negative? && x.positive?
18
- return Angle.as_degrees(angle.degrees + 360)
18
+ return Angle.from_degrees(angle.degrees + 360)
19
19
  end
20
20
 
21
- Angle.as_degrees(angle.degrees + 180)
21
+ Angle.from_degrees(angle.degrees + 180)
22
22
  end
23
23
  end
24
24
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Astronoby
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: astronoby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémy Hannequin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-24 00:00:00.000000000 Z
11
+ date: 2024-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: matrix