Skip to content

Commit

Permalink
Sun answers to ecliptic and horizontal coordinates
Browse files Browse the repository at this point in the history
  • Loading branch information
rhannequin committed Feb 17, 2024
1 parent 39491fe commit 6d5fd3a
Show file tree
Hide file tree
Showing 5 changed files with 204 additions and 66 deletions.
14 changes: 5 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,13 @@ longitude = Astronoby::Angle.as_degrees(2.3522)

sun = Astronoby::Sun.new(epoch: epoch)

horizontal_coordinates = sun
.coordinates
.to_equatorial(epoch: epoch)
.to_horizontal(
time: time,
latitude: latitude,
longitude: longitude
)
horizontal_coordinates = sun.horizontal_coordinates(
latitude: latitude,
longitude: longitude
)

horizontal_coordinates.altitude.value.to_f
# => 27.50236511886638
# => 27.50236513017543

horizontal_coordinates.altitude.to_dms.format
# => "+27° 30′ 8.5144″"
Expand Down
10 changes: 9 additions & 1 deletion lib/astronoby/bodies/sun.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def initialize(epoch:)
@epoch = epoch
end

def coordinates
def ecliptic_coordinates
Coordinates::Ecliptic.new(
latitude: Angle.as_degrees(0),
longitude: Angle.as_degrees(
Expand All @@ -21,6 +21,14 @@ def coordinates
)
end

def horizontal_coordinates(latitude:, longitude:)
time = Astronoby::Epoch.to_utc(@epoch)

ecliptic_coordinates
.to_equatorial(epoch: @epoch)
.to_horizontal(time: time, latitude: latitude, longitude: longitude)
end

private

def mean_anomaly
Expand Down
6 changes: 6 additions & 0 deletions lib/astronoby/epoch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,14 @@ class Epoch
DEFAULT_EPOCH = J2000
DAYS_PER_JULIAN_CENTURY = 36525.0

JULIAN_DAY_NUMBER_OFFSET = 0.5

def self.from_time(time)
time.to_datetime.ajd
end

def self.to_utc(epoch)
DateTime.jd(epoch + JULIAN_DAY_NUMBER_OFFSET).to_time.utc
end
end
end
148 changes: 92 additions & 56 deletions spec/astronoby/bodies/sun_spec.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# frozen_string_literal: true

RSpec.describe Astronoby::Sun do
describe "#coordinates" do
describe "#ecliptic_coordinates" do
it "returns ecliptic coordinates" do
epoch = Astronoby::Epoch::DEFAULT_EPOCH

coordinates = described_class.new(epoch: epoch).coordinates
coordinates = described_class.new(epoch: epoch).ecliptic_coordinates

expect(coordinates).to be_a(Astronoby::Coordinates::Ecliptic)
end
Expand All @@ -19,23 +19,11 @@
time = Time.new(2015, 2, 5, 12, 0, 0, "-05:00")
epoch = Astronoby::Epoch.from_time(time)

ecliptic_coordinates = described_class.new(epoch: epoch).coordinates
equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: epoch)
horizontal_coordinates = equatorial_coordinates.to_horizontal(
time: time,
latitude: Astronoby::Angle.as_degrees(38),
longitude: Astronoby::Angle.as_degrees(-78)
)
ecliptic_coordinates = described_class.new(epoch: epoch).ecliptic_coordinates

expect(ecliptic_coordinates.longitude.to_degrees.value.to_f).to(
eq(316.5726713406947)
)
expect(horizontal_coordinates.altitude.to_dms.format).to(
eq("+35° 47′ 12.6437″")
)
expect(horizontal_coordinates.azimuth.to_dms.format).to(
eq("+172° 17′ 2.7299″")
)
end

# Source:
Expand All @@ -47,30 +35,11 @@
time = Time.new(2000, 8, 9, 12, 0, 0, "-04:00")
epoch = Astronoby::Epoch.from_time(time)

ecliptic_coordinates = described_class.new(epoch: epoch).coordinates
equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: epoch)
horizontal_coordinates = equatorial_coordinates.to_horizontal(
time: time,
latitude: Astronoby::Angle.as_degrees(30),
longitude: Astronoby::Angle.as_degrees(-95)
)
ecliptic_coordinates = described_class.new(epoch: epoch).ecliptic_coordinates

expect(ecliptic_coordinates.longitude.to_degrees.value.to_f).to(
eq(137.36484079770828)
)
expect(equatorial_coordinates.right_ascension.to_hours.value).to(
eq(9.32079647116818)
)
expect(equatorial_coordinates.declination.to_degrees.value).to(
eq(15.63002864434695)
)
# TODO: very far from the expected value
expect(horizontal_coordinates.altitude.to_dms.format).to(
eq("+53° 44′ 26.5428″")
)
expect(horizontal_coordinates.azimuth.to_dms.format).to(
eq("+105° 8′ 12.9488″")
)
end

# Source:
Expand All @@ -82,29 +51,11 @@
time = Time.new(2015, 5, 6, 14, 30, 0, "-04:00")
epoch = Astronoby::Epoch.from_time(time)

ecliptic_coordinates = described_class.new(epoch: epoch).coordinates
equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: epoch)
horizontal_coordinates = equatorial_coordinates.to_horizontal(
time: time,
latitude: Astronoby::Angle.as_degrees(-20),
longitude: Astronoby::Angle.as_degrees(-30)
)
ecliptic_coordinates = described_class.new(epoch: epoch).ecliptic_coordinates

expect(ecliptic_coordinates.longitude.to_degrees.value).to(
eq(45.92185191446102)
)
expect(equatorial_coordinates.right_ascension.to_hours.value).to(
eq(2.89706471944391)
)
expect(equatorial_coordinates.declination.to_degrees.value).to(
eq(16.60289828746774)
)
expect(horizontal_coordinates.altitude.to_dms.format).to(
eq("+13° 34′ 17.4238″")
)
expect(horizontal_coordinates.azimuth.to_dms.format).to(
eq("+293° 37′ 12.5232″")
)
end

# Source:
Expand All @@ -116,7 +67,7 @@
time = Time.utc(1988, 7, 27, 0, 0, 0)
epoch = Astronoby::Epoch.from_time(time)

ecliptic_coordinates = described_class.new(epoch: epoch).coordinates
ecliptic_coordinates = described_class.new(epoch: epoch).ecliptic_coordinates
equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: epoch)

expect(equatorial_coordinates.right_ascension.to_hours.to_hms.format).to(
Expand All @@ -136,7 +87,7 @@
time = Time.utc(1992, 10, 13, 0, 0, 0)
epoch = Astronoby::Epoch.from_time(time)

ecliptic_coordinates = described_class.new(epoch: epoch).coordinates
ecliptic_coordinates = described_class.new(epoch: epoch).ecliptic_coordinates
equatorial_coordinates = ecliptic_coordinates.to_equatorial(epoch: epoch)

expect(equatorial_coordinates.right_ascension.to_hours.to_hms.format).to(
Expand All @@ -147,4 +98,89 @@
)
end
end

describe "#horizontal_coordinates" do
it "returns horizontal coordinates" do
epoch = Astronoby::Epoch::DEFAULT_EPOCH

coordinates = described_class
.new(epoch: epoch)
.horizontal_coordinates(
latitude: Astronoby::Angle.as_degrees(-20),
longitude: Astronoby::Angle.as_degrees(-30)
)

expect(coordinates).to be_a(Astronoby::Coordinates::Horizontal)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 6 - The Sun
it "computes the horizontal coordinates for the epoch" do
time = Time.new(2015, 2, 5, 12, 0, 0, "-05:00")
epoch = Astronoby::Epoch.from_time(time)
sun = described_class.new(epoch: epoch)

horizontal_coordinates = sun.horizontal_coordinates(
latitude: Astronoby::Angle.as_degrees(38),
longitude: Astronoby::Angle.as_degrees(-78)
)

expect(horizontal_coordinates.altitude.to_dms.format).to(
eq("+35° 47′ 12.6437″")
)
expect(horizontal_coordinates.azimuth.to_dms.format).to(
eq("+172° 17′ 2.7301″")
)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 6 - The Sun
it "computes the coordinates for a given epoch" do
time = Time.new(2000, 8, 9, 12, 0, 0, "-04:00")
epoch = Astronoby::Epoch.from_time(time)
sun = described_class.new(epoch: epoch)

horizontal_coordinates = sun.horizontal_coordinates(
latitude: Astronoby::Angle.as_degrees(30),
longitude: Astronoby::Angle.as_degrees(-95)
)

# TODO: very far from the expected value
expect(horizontal_coordinates.altitude.to_dms.format).to(
eq("+53° 44′ 26.5426″")
)
expect(horizontal_coordinates.azimuth.to_dms.format).to(
eq("+105° 8′ 12.9486″")
)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 6 - The Sun
it "computes the coordinates for a given epoch" do
time = Time.new(2015, 5, 6, 14, 30, 0, "-04:00")
epoch = Astronoby::Epoch.from_time(time)
sun = described_class.new(epoch: epoch)

horizontal_coordinates = sun.horizontal_coordinates(
latitude: Astronoby::Angle.as_degrees(-20),
longitude: Astronoby::Angle.as_degrees(-30)
)

expect(horizontal_coordinates.altitude.to_dms.format).to(
eq("+13° 34′ 17.4237″")
)
expect(horizontal_coordinates.azimuth.to_dms.format).to(
eq("+293° 37′ 12.5231″")
)
end
end
end
92 changes: 92 additions & 0 deletions spec/astronoby/epoch_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,97 @@

expect(described_class.from_time(time)).to eq(2459348.5)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 3 - Time Conversions
it "returns the Julian day number associated with the time" do
time = Time.utc(2010, 11, 1, 0, 0, 0)

expect(described_class.from_time(time)).to eq(2455501.5)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 3 - Time Conversions
it "returns the Julian day number associated with the time" do
time = Time.utc(2015, 5, 10, 6, 0, 0)

expect(described_class.from_time(time)).to eq(2457152.75)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 3 - Time Conversions
it "returns the Julian day number associated with the time" do
time = Time.utc(2015, 5, 10, 18, 0, 0)

expect(described_class.from_time(time)).to eq(2457153.25)
end
end

describe "::to_utc" do
# Source: https://quasar.as.utexas.edu/BillInfo/JulianDatesG.html
it "returns the UTC Time object corresponding to a given Julian day number" do
epoch = 2299160.5

time = described_class.to_utc(epoch)

expect(time).to eq Time.utc(1582, 10, 15, 0, 0, 0)
end

# Source: https://github.com/observerly/polaris
it "returns the UTC Time object corresponding to a given Julian day number" do
epoch = 2459348.5

time = described_class.to_utc(epoch)

expect(time).to eq Time.utc(2021, 5, 14, 0, 0, 0)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 3 - Time Conversions
it "returns the UTC Time object corresponding to a given Julian day number" do
epoch = 2369915.5

time = described_class.to_utc(epoch)

expect(time).to eq Time.utc(1776, 7, 4, 0, 0, 0)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 3 - Time Conversions
it "returns the UTC Time object corresponding to a given Julian day number" do
epoch = 2455323

time = described_class.to_utc(epoch)

expect(time).to eq Time.utc(2010, 5, 6, 12, 0, 0)
end

# Source:
# Title: Celestial Calculations
# Author: J. L. Lawrence
# Edition: MIT Press
# Chapter: 3 - Time Conversions
it "returns the UTC Time object corresponding to a given Julian day number" do
epoch = 2456019.37

time = described_class.to_utc(epoch).round

expect(time).to eq Time.utc(2012, 4, 1, 20, 52, 48)
end
end
end

0 comments on commit 6d5fd3a

Please sign in to comment.