astronoby 0.2.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25e45175dabf69ffa0c98ffdf3e93cb21b9ce004fe4e0ffe61a4cfc92794ae44
4
- data.tar.gz: 2d1ad05a74a171c71f6ff0a7fa7c3af1874f07379c8be407ff633d61ad4dd78e
3
+ metadata.gz: 3c65785b0c459ba8add86fcceb906205caa79a80f47b7f33c0b7ee008173fd14
4
+ data.tar.gz: 66478c6055d84e34f560490f225ae3e3d5020972e729b37e8f6f0a6566ae173e
5
5
  SHA512:
6
- metadata.gz: 74cdfbf511e8094bd410c67ed86eaff12f03124bec48c769eb3e6ebf1fd54870145a556cc82214db5147bd2c6e4631d0514973a76648d0e68d8770162401d338
7
- data.tar.gz: 7a6c7f98fff52a04d60dc5c4eced47610900aa10a64f8016000b9294276d547d4d350ef0d269a25f42ae9b0078d110ad9b73884f3834e55a12084274f358ae15
6
+ metadata.gz: 4bae651aabaec62d258a768952eb3cd830d99639acf33f02b9f0ab6fd2eeff8215d9a30087a5818736b777c1a86344918f98f33f987f65829a8712cb20477c55
7
+ data.tar.gz: 401659e2d49599246ad2ea1a455a6d60b9797c49e730cacf8a614f4235929263c9318644373a96ea496969fcb814cc93144a8dbfffd0a0318e1628500bb1c8e8
data/CHANGELOG.md CHANGED
@@ -1,10 +1,99 @@
1
1
  # Changelog
2
2
 
3
- ## 0.2.0 - 2024-03-24
3
+ ## 0.4.0 - 2024-04-29
4
+
5
+ _If you are upgrading: please see [UPGRADING.md]._
6
+
7
+ [UPGRADING.md]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
8
+
9
+ ### Bug fixes
10
+
11
+ * Fix ecliptic to equatorial epoch ([#56])
12
+
13
+ [#56]: https://github.com/rhannequin/astronoby/pull/56
14
+
15
+ ### Features
16
+
17
+ * Add twilight times ([#49])
18
+ * Add interpolation method ([#52])
19
+ * Add decimal_hour_to_time util ([#53])
20
+ * Calculate leap seconds for an instant ([#54])
21
+ * Add `Angle#-@` ([#55])
22
+ * Enable equivalence and hash equality to `Observer` ([#57])
23
+ * Twilight events dedicated class ([#61])
24
+
25
+ [#49]: https://github.com/rhannequin/astronoby/pull/49
26
+ [#52]: https://github.com/rhannequin/astronoby/pull/52
27
+ [#53]: https://github.com/rhannequin/astronoby/pull/53
28
+ [#54]: https://github.com/rhannequin/astronoby/pull/54
29
+ [#55]: https://github.com/rhannequin/astronoby/pull/55
30
+ [#57]: https://github.com/rhannequin/astronoby/pull/57
31
+ [#61]: https://github.com/rhannequin/astronoby/pull/61
32
+
33
+ ### Improvements
34
+
35
+ * Upgrade bundler from 2.3.11 to 2.5.7 by @dorianmariecom ([#45])
36
+ * Drop `BigDecimal` ([#46])
37
+ * Bump rake from 13.1.0 to 13.2.0 ([#47])
38
+ * Increase Ruby versions support ([#48])
39
+ * Bump rake from 13.2.0 to 13.2.1 ([#51])
40
+ * Dedicated constants class ([#62])
41
+ * Improve accuracy of equation of time ([#63])
42
+ * Twilight times better accuracy ([#65])
43
+ * Update UPGRADING.md ([#66])
44
+ * release: Bump version to 0.4.0 ([#67])
45
+
46
+ [#45]: https://github.com/rhannequin/astronoby/pull/45
47
+ [#46]: https://github.com/rhannequin/astronoby/pull/46
48
+ [#47]: https://github.com/rhannequin/astronoby/pull/47
49
+ [#48]: https://github.com/rhannequin/astronoby/pull/48
50
+ [#51]: https://github.com/rhannequin/astronoby/pull/51
51
+ [#62]: https://github.com/rhannequin/astronoby/pull/62
52
+ [#63]: https://github.com/rhannequin/astronoby/pull/63
53
+ [#65]: https://github.com/rhannequin/astronoby/pull/65
54
+ [#66]: https://github.com/rhannequin/astronoby/pull/66
55
+ [#67]: https://github.com/rhannequin/astronoby/pull/67
56
+
57
+ ### Backward-incompatible changes
58
+
59
+ * More accurate rising, transit and setting times ([#50])
60
+ * Observation events dedicated and centralized class ([#60])
61
+ * Change `Astronoby::Sun` constructor ([#64])
62
+
63
+ [#50]: https://github.com/rhannequin/astronoby/pull/50
64
+ [#60]: https://github.com/rhannequin/astronoby/pull/60
65
+ [#64]: https://github.com/rhannequin/astronoby/pull/64
66
+
67
+ ### New Contributors
68
+
69
+ * @dorianmariecom made their first contribution in [#45]
70
+
71
+ [#45]: https://github.com/rhannequin/astronoby/pull/45
72
+
73
+ **Full Changelog**: https://github.com/rhannequin/astronoby/compare/v0.3.0...v0.4.0
74
+
75
+ ## 0.3.0 - 2024-03-29
4
76
 
5
77
  _If you are upgrading: please see [`UPGRADING.md`]._
6
78
 
7
- [`UPGRADING.md`]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
79
+ ### Improvements
80
+
81
+ * Drop `Angle#==` ([#42])
82
+ * Improved accuracy with Sun's location predictions ([#41])
83
+
84
+ ### Breaking changes
85
+
86
+ * **breaking:** Difference between true and apparent ecliptic and equatorial
87
+ coordinates ([#41])
88
+ * **breaking:** Rename `Angle::as_*` into `Angle::from_*` ([#43])
89
+
90
+ [#41]: https://github.com/rhannequin/astronoby/pull/41
91
+ [#42]: https://github.com/rhannequin/astronoby/pull/42
92
+ [#43]: https://github.com/rhannequin/astronoby/pull/43
93
+
94
+ ## 0.2.0 - 2024-03-24
95
+
96
+ _If you are upgrading: please see [`UPGRADING.md`]._
8
97
 
9
98
  ### Features
10
99
 
@@ -74,3 +163,5 @@ _If you are upgrading: please see [`UPGRADING.md`]._
74
163
 
75
164
  * Add `Astronoby::Angle`
76
165
  * Support angles in degrees and radians
166
+
167
+ [`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.4.0)
5
5
  matrix (~> 0.4.2)
6
6
  rake (~> 13.0)
7
7
  rspec (~> 3.0)
@@ -21,7 +21,7 @@ GEM
21
21
  racc
22
22
  racc (1.7.3)
23
23
  rainbow (3.1.1)
24
- rake (13.1.0)
24
+ rake (13.2.1)
25
25
  regexp_parser (2.9.0)
26
26
  rexml (3.2.6)
27
27
  rspec (3.13.0)
@@ -77,4 +77,4 @@ DEPENDENCIES
77
77
  standard (~> 1.3)
78
78
 
79
79
  BUNDLED WITH
80
- 2.3.11
80
+ 2.5.7
data/README.md CHANGED
@@ -28,27 +28,125 @@ 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(Math::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
- epoch = Astronoby::Epoch.from_time(time)
36
74
 
37
- latitude = Astronoby::Angle.as_degrees(48.8566)
38
- longitude = Astronoby::Angle.as_degrees(2.3522)
75
+ latitude = Astronoby::Angle.from_degrees(48.8566)
76
+ longitude = Astronoby::Angle.from_degrees(2.3522)
39
77
 
40
- sun = Astronoby::Sun.new(epoch: epoch)
78
+ sun = Astronoby::Sun.new(time: time)
41
79
 
42
80
  horizontal_coordinates = sun.horizontal_coordinates(
43
81
  latitude: latitude,
44
82
  longitude: longitude
45
83
  )
46
84
 
47
- horizontal_coordinates.altitude.degrees.to_f
48
- # => 27.502365130176567
85
+ horizontal_coordinates.altitude.degrees
86
+ # => 27.500082409271247
49
87
 
50
88
  horizontal_coordinates.altitude.str(:dms)
51
- # => "+27° 30′ 8.5144″"
89
+ # => "+27° 30′ 0.2966″"
90
+ ```
91
+
92
+ ### Sunrise and sunset times and azimuths
93
+
94
+ ```rb
95
+ time = Time.new(2015, 2, 5)
96
+ observer = Astronoby::Observer.new(
97
+ latitude: Astronoby::Angle.from_degrees(38),
98
+ longitude: Astronoby::Angle.from_degrees(-78)
99
+ )
100
+ sun = Astronoby::Sun.new(time: time)
101
+ observation_events = sun.observation_events(observer: observer)
102
+
103
+ observation_events.rising_time
104
+ # => 2015-02-05 12:12:59 UTC
105
+
106
+ observation_events.rising_azimuth.str(:dms)
107
+ # => "+109° 46′ 43.145″"
108
+
109
+ observation_events.transit_time
110
+ # => 2015-02-05 17:25:59 UTC
111
+
112
+ observation_events.transit_altitude.str(:dms)
113
+ # => "+36° 8′ 15.7638″"
114
+
115
+ observation_events.setting_time
116
+ # => 2015-02-05 22:39:27 UTC
117
+
118
+ observation_events.setting_azimuth.str(:dms)
119
+ # => "+250° 23′ 33.614″"
120
+ ```
121
+
122
+ ### Twilight times
123
+
124
+ ```rb
125
+ time = Time.new(2024, 1, 1)
126
+ sun = Astronoby::Sun.new(time: time)
127
+ observer = Astronoby::Observer.new(
128
+ latitude: Astronoby::Angle.from_degrees(48.8566),
129
+ longitude: Astronoby::Angle.from_degrees(2.3522)
130
+ )
131
+ twilight_events = sun.twilight_events(observer: observer)
132
+
133
+ twilight_events.morning_astronomical_twilight_time
134
+ # => 2024-01-01 05:49:25 UTC
135
+
136
+ twilight_events.morning_nautical_twilight_time
137
+ # => 2024-01-01 06:27:42 UTC
138
+
139
+ twilight_events.morning_civil_twilight_time
140
+ # => 2024-01-01 07:07:50 UTC
141
+
142
+ twilight_events.evening_civil_twilight_time
143
+ # => 2024-01-01 16:40:01 UTC
144
+
145
+ twilight_events.evening_nautical_twilight_time
146
+ # => 2024-01-01 17:20:10 UTC
147
+
148
+ twilight_events.evening_astronomical_twilight_time
149
+ # => 2024-01-01 17:58:26 UTC
52
150
  ```
53
151
 
54
152
  ### Solstice and Equinox times
@@ -57,10 +155,10 @@ horizontal_coordinates.altitude.str(:dms)
57
155
  year = 2024
58
156
 
59
157
  Astronoby::EquinoxSolstice.march_equinox(year)
60
- # => 2024-03-20 03:05:00 UTC
158
+ # => 2024-03-20 03:05:08 UTC
61
159
 
62
160
  Astronoby::EquinoxSolstice.june_solstice(year)
63
- # => 2024-06-20 20:50:14 UTC
161
+ # => 2024-06-20 20:50:18 UTC
64
162
  ```
65
163
 
66
164
  ## Precision
data/UPGRADING.md CHANGED
@@ -7,6 +7,80 @@ 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.3.0 to 0.4.0
11
+
12
+ ### `Body` class removed ([#50])
13
+
14
+ The different behaviors from `Body` have been moved to other classes like
15
+ `Events::ObservationEvents`.
16
+
17
+ [#50]: https://github.com/rhannequin/astronoby/pull/50
18
+
19
+ ### Rising and setting times and azimuths removed from `Sun` ([#60])
20
+
21
+ `#rising_time`, `#rising_azimuth`, `#setting_time` and `#setting_azimuth`
22
+ have been removed from `Astronoby::Sun` and moved to
23
+ `Astronoby::Events::ObservationEvents`.
24
+
25
+ [#60]: https://github.com/rhannequin/astronoby/pull/60
26
+
27
+ ### `Sun` constructor changed ([#64])
28
+
29
+ The `Sun` constructor now doesn't accept the `epoch` key argument anymore,
30
+ but only a new `time` key argument.
31
+
32
+ [#64]: https://github.com/rhannequin/astronoby/pull/64
33
+
34
+ ## Upgrading from 0.2.0 to 0.3.0
35
+
36
+ ### `Sun#ecliptic_coordinates` method removed (#41)
37
+
38
+ Removed in favor of `#true_ecliptic_coordinates` and
39
+ `#apparent_ecliptic_coordinates`.
40
+
41
+ ### `Coordinates::Ecliptic#to_horizontal` method removed (#41)
42
+
43
+ Removed in favor of `#to_true_horizontal` and
44
+ `#to_apparent_horizontal`.
45
+
46
+ ### `Sun#true_ecliptic_coordinates` method added (#41)
47
+
48
+ Returns the true ecliptic coordinates for the date's epoch.
49
+
50
+ ### `Sun#apparent_ecliptic_coordinates` method added (#41)
51
+
52
+ Returns the apparent ecliptic coordinates for the date's epoch, including
53
+ corrections for the nutation and aberration.
54
+
55
+ ### `Coordinates::Ecliptic#to_true_horizontal` method added (#41)
56
+
57
+ Returns the true equatorial coordinates for ths date's epoch.
58
+
59
+ ### `Coordinates::Ecliptic#to_apparent_horizontal` method added (#41)
60
+
61
+ Returns the apparent equatorial coordinates for the date's epoch, including
62
+ corrections for the obliquity.
63
+
64
+ ### `Angle::as_radians` renamed into `Angle::from_radians` (#43)
65
+
66
+ Behaviour not changed.
67
+
68
+ ### `Angle::as_degrees` renamed into `Angle::from_degrees` (#43)
69
+
70
+ Behaviour not changed.
71
+
72
+ ### `Angle::as_hours` renamed into `Angle::from_hours` (#43)
73
+
74
+ Behaviour not changed.
75
+
76
+ ### `Angle::as_dms` renamed into `Angle::from_dms` (#43)
77
+
78
+ Behaviour not changed.
79
+
80
+ ### `Angle::as_hms` renamed into `Angle::from_hms` (#43)
81
+
82
+ Behaviour not changed.
83
+
10
84
  ## Upgrading from 0.1.0 to 0.2.0
11
85
 
12
86
  ### `Observer` class added (#29)
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Astronoby
4
4
  class Aberration
5
+ MAXIMUM_SHIFT = Angle.from_degrees(20.5)
6
+
5
7
  def self.for_ecliptic_coordinates(coordinates:, epoch:)
6
8
  new(coordinates, epoch).apply
7
9
  end
@@ -17,16 +19,16 @@ module Astronoby
17
19
  # Edition: Cambridge University Press
18
20
  # Chapter: 36 - Aberration
19
21
  def apply
20
- delta_longitude = Angle.as_degrees(
21
- -20.5 * (
22
+ delta_longitude = Angle.from_degrees(
23
+ -MAXIMUM_SHIFT.degrees * (
22
24
  sun_longitude - @coordinates.longitude
23
- ).cos / @coordinates.latitude.cos / 3600
25
+ ).cos / @coordinates.latitude.cos / Constants::SECONDS_PER_DEGREE
24
26
  )
25
27
 
26
- delta_latitude = Angle.as_degrees(
27
- -20.5 *
28
+ delta_latitude = Angle.from_degrees(
29
+ -MAXIMUM_SHIFT.degrees *
28
30
  (sun_longitude - @coordinates.longitude).sin *
29
- @coordinates.latitude.sin / 3600
31
+ @coordinates.latitude.sin / Constants::SECONDS_PER_DEGREE
30
32
  )
31
33
 
32
34
  Coordinates::Ecliptic.new(
@@ -36,7 +38,10 @@ module Astronoby
36
38
  end
37
39
 
38
40
  def sun_longitude
39
- @_sun_longitude ||= Sun.new(epoch: @epoch).ecliptic_coordinates.longitude
41
+ @_sun_longitude ||= Sun
42
+ .new(time: Epoch.to_utc(@epoch))
43
+ .true_ecliptic_coordinates
44
+ .longitude
40
45
  end
41
46
  end
42
47
  end
@@ -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
@@ -25,73 +12,77 @@ module Astronoby
25
12
  new(0)
26
13
  end
27
14
 
28
- def as_radians(radians)
29
- normalized_radians = radians.remainder(FULL_CIRCLE_IN_RADIANS)
15
+ def from_radians(radians)
16
+ normalized_radians = radians.remainder(Constants::RADIANS_PER_CIRCLE)
30
17
  new(normalized_radians)
31
18
  end
32
19
 
33
- def as_degrees(degrees)
34
- radians = degrees / PI_IN_DEGREES * PI
35
- as_radians(radians)
20
+ def from_degrees(degrees)
21
+ radians = degrees / Constants::PI_IN_DEGREES * Math::PI
22
+ from_radians(radians)
36
23
  end
37
24
 
38
- def as_hours(hours)
39
- radians = hours * RADIAN_PER_HOUR
40
- as_radians(radians)
25
+ def from_hours(hours)
26
+ radians = hours * Constants::RADIAN_PER_HOUR
27
+ from_radians(radians)
41
28
  end
42
29
 
43
- def as_hms(hour, minute, second)
44
- hours = hour + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
45
- as_hours(hours)
30
+ def from_hms(hour, minute, second)
31
+ hours = hour +
32
+ minute / Constants::MINUTES_PER_HOUR +
33
+ second / Constants::SECONDS_PER_HOUR
34
+ from_hours(hours)
46
35
  end
47
36
 
48
- def as_dms(degree, minute, second)
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
51
- as_degrees(sign * degrees)
39
+ degrees = degree.abs +
40
+ minute / Constants::MINUTES_PER_HOUR +
41
+ second / Constants::SECONDS_PER_HOUR
42
+ from_degrees(sign * degrees)
52
43
  end
53
44
 
54
45
  def asin(ratio)
55
46
  radians = Math.asin(ratio)
56
- as_radians(radians)
47
+ from_radians(radians)
57
48
  end
58
49
 
59
50
  def acos(ratio)
60
51
  radians = Math.acos(ratio)
61
- as_radians(radians)
52
+ from_radians(radians)
62
53
  end
63
54
 
64
55
  def atan(ratio)
65
56
  radians = Math.atan(ratio)
66
- as_radians(radians)
57
+ from_radians(radians)
67
58
  end
68
59
  end
69
60
 
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)
90
- self.class.as_radians(radians + other.radians)
77
+ self.class.from_radians(radians + other.radians)
91
78
  end
92
79
 
93
80
  def -(other)
94
- self.class.as_radians(@radians - other.radians)
81
+ self.class.from_radians(@radians - other.radians)
82
+ end
83
+
84
+ def -@
85
+ self.class.from_radians(-@radians)
95
86
  end
96
87
 
97
88
  def sin
@@ -118,20 +109,16 @@ module Astronoby
118
109
  radians.zero?
119
110
  end
120
111
 
121
- def ==(other)
122
- other.is_a?(self.class) && radians == other.radians
123
- end
124
- alias_method :eql?, :==
125
-
126
112
  def hash
127
113
  [radians, self.class].hash
128
114
  end
129
115
 
130
116
  def <=>(other)
131
- return nil unless other.is_a?(self.class)
117
+ return unless other.is_a?(self.class)
132
118
 
133
119
  radians <=> other.radians
134
120
  end
121
+ alias_method :eql?, :==
135
122
 
136
123
  def str(format)
137
124
  case format
@@ -148,31 +135,32 @@ module Astronoby
148
135
  sign = deg.negative? ? "-" : "+"
149
136
  absolute_degrees = deg.abs
150
137
  degrees = absolute_degrees.floor
151
- decimal_minutes = MINUTES_PER_DEGREE * (absolute_degrees - degrees)
138
+ decimal_minutes = Constants::MINUTES_PER_DEGREE *
139
+ (absolute_degrees - degrees)
152
140
  absolute_decimal_minutes = (
153
- MINUTES_PER_DEGREE * (absolute_degrees - degrees)
141
+ Constants::MINUTES_PER_DEGREE * (absolute_degrees - degrees)
154
142
  ).abs
155
143
  minutes = decimal_minutes.floor
156
- seconds = SECONDS_PER_MINUTE * (
144
+ seconds = Constants::SECONDS_PER_MINUTE * (
157
145
  absolute_decimal_minutes - absolute_decimal_minutes.floor
158
146
  )
159
147
 
160
- Dms.new(sign, degrees, minutes, seconds.to_f.floor(4))
148
+ Dms.new(sign, degrees, minutes, seconds.floor(4))
161
149
  end
162
150
 
163
151
  def to_hms(hrs)
164
152
  absolute_hours = hrs.abs
165
153
  hours = absolute_hours.floor
166
- decimal_minutes = MINUTES_PER_HOUR * (absolute_hours - hours)
154
+ decimal_minutes = Constants::MINUTES_PER_HOUR * (absolute_hours - hours)
167
155
  absolute_decimal_minutes = (
168
- MINUTES_PER_HOUR * (absolute_hours - hours)
156
+ Constants::MINUTES_PER_HOUR * (absolute_hours - hours)
169
157
  ).abs
170
158
  minutes = decimal_minutes.floor
171
- seconds = SECONDS_PER_MINUTE * (
159
+ seconds = Constants::SECONDS_PER_MINUTE * (
172
160
  absolute_decimal_minutes - absolute_decimal_minutes.floor
173
161
  )
174
162
 
175
- Hms.new(hours, minutes, seconds.to_f.floor(4))
163
+ Hms.new(hours, minutes, seconds.floor(4))
176
164
  end
177
165
  end
178
166
  end