Skip to content

Refactor crate #37

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 35 additions & 35 deletions src/earth_orbit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ enum Event {
DecemberSolstice
}

fn get_time_of(event: Event, timestamp: i64) -> i64 {
fn time_of(event: Event, timestamp: i64) -> i64 {
let jd = unix_to_julian(timestamp);

let y = jde_to_julian_year(jd).floor();

// Convert AD year to millenia, from 2000 AD
let m = (y - 2000.0) / 1000.0;

let jdme = get_jdme(event, m);
let jdme = jdme(event, m);

// Julian century
let t = (jdme - J2000) / 36525.0;
Expand All @@ -31,13 +31,13 @@ fn get_time_of(event: Event, timestamp: i64) -> i64 {

let l = 1.0 + 0.0334 * cos_deg(w) + 0.0007 * cos_deg(2.0 * w);

let s = get_periodic_terms(t);
let s = periodic_terms(t);

// FIXME: Improve the accuracy
terrestrial_to_universal_time(julian_to_unix(jdme + (0.00001 * s) / l))
}

fn get_jdme(event: Event, m: f64) -> f64 {
fn jdme(event: Event, m: f64) -> f64 {
let jdme_terms = vec![
(2451_623.80984, 365_242.37404, 0.05169, -0.00411, -0.00057), // March Equinoxe
(2451_716.56767, 365_241.62603, 0.00325, 0.00888, -0.00030), // June Solstice
Expand All @@ -54,7 +54,7 @@ fn get_jdme(event: Event, m: f64) -> f64 {
+ e * m.powi(4)
}

fn get_periodic_terms(t: f64) -> f64 {
fn periodic_terms(t: f64) -> f64 {
let terms = vec![
(485.0, 324.96, 1934.136),
(203.0, 337.23, 32964.467),
Expand Down Expand Up @@ -87,56 +87,56 @@ fn get_periodic_terms(t: f64) -> f64 {
})
}

fn get_previous_time_of(event: Event, timestamp: i64) -> i64 {
let time_of_event = get_time_of(event, timestamp);
fn previous_time_of(event: Event, timestamp: i64) -> i64 {
let time_of_event = time_of(event, timestamp);
if time_of_event >= timestamp {
let delta = (365.25 * 86400.0) as i64;
get_time_of(event, timestamp - delta)
time_of(event, timestamp - delta)
} else {
time_of_event
}
}

fn get_next_time_of(event: Event, timestamp: i64) -> i64 {
let time_of_event = get_time_of(event, timestamp);
fn next_time_of(event: Event, timestamp: i64) -> i64 {
let time_of_event = time_of(event, timestamp);
if time_of_event <= timestamp {
let delta = (365.25 * 86400.0) as i64;
get_time_of(event, timestamp + delta)
time_of(event, timestamp + delta)
} else {
time_of_event
}
}

pub fn get_previous_march_equinox(timestamp: i64) -> i64 {
get_previous_time_of(Event::MarchEquinox, timestamp)
pub fn previous_march_equinox(timestamp: i64) -> i64 {
previous_time_of(Event::MarchEquinox, timestamp)
}

pub fn get_next_march_equinox(timestamp: i64) -> i64 {
get_next_time_of(Event::MarchEquinox, timestamp)
pub fn next_march_equinox(timestamp: i64) -> i64 {
next_time_of(Event::MarchEquinox, timestamp)
}

pub fn get_previous_june_solstice(timestamp: i64) -> i64 {
get_previous_time_of(Event::JuneSolstice, timestamp)
pub fn previous_june_solstice(timestamp: i64) -> i64 {
previous_time_of(Event::JuneSolstice, timestamp)
}

pub fn get_next_june_solstice(timestamp: i64) -> i64 {
get_next_time_of(Event::JuneSolstice, timestamp)
pub fn next_june_solstice(timestamp: i64) -> i64 {
next_time_of(Event::JuneSolstice, timestamp)
}

pub fn get_previous_september_equinox(timestamp: i64) -> i64 {
get_previous_time_of(Event::SeptemberEquinox, timestamp)
pub fn previous_september_equinox(timestamp: i64) -> i64 {
previous_time_of(Event::SeptemberEquinox, timestamp)
}

pub fn get_next_september_equinox(timestamp: i64) -> i64 {
get_next_time_of(Event::SeptemberEquinox, timestamp)
pub fn next_september_equinox(timestamp: i64) -> i64 {
next_time_of(Event::SeptemberEquinox, timestamp)
}

pub fn get_previous_december_solstice(timestamp: i64) -> i64 {
get_previous_time_of(Event::DecemberSolstice, timestamp)
pub fn previous_december_solstice(timestamp: i64) -> i64 {
previous_time_of(Event::DecemberSolstice, timestamp)
}

pub fn get_next_december_solstice(timestamp: i64) -> i64 {
get_next_time_of(Event::DecemberSolstice, timestamp)
pub fn next_december_solstice(timestamp: i64) -> i64 {
next_time_of(Event::DecemberSolstice, timestamp)
}

#[cfg(test)]
Expand All @@ -145,40 +145,40 @@ mod tests {
use utils::*;

#[test]
fn get_next_june_solstice_test() {
fn next_june_solstice_test() {
// Example 27.a from "Astronomical Algoritms"
// June Solstice: 1962-06-21 21:25:08 TD
let t = terrestrial_to_universal_time(parse_time("1962-06-21T21:25:08+00:00"));
assert_eq!(t, get_next_june_solstice(parse_time("1962-06-01T00:00:00+00:00")));
assert_eq!(t, next_june_solstice(parse_time("1962-06-01T00:00:00+00:00")));
}

#[test]
fn get_previous_december_solstice_test() {
fn previous_december_solstice_test() {
let accuracy = 20; // TODO: Improve accuracy
let solstice_december_2012 = parse_time("2012-12-21T11:11:37+0000");

let times = vec![
get_previous_december_solstice(parse_time("2014-06-01T00:00:00+0000")),
previous_december_solstice(parse_time("2014-06-01T00:00:00+0000")),
parse_time("2013-06-01T00:00:00+0000"),
];

for t in times {
assert_approx_eq!(solstice_december_2012, get_previous_december_solstice(t), accuracy);
assert_approx_eq!(solstice_december_2012, previous_december_solstice(t), accuracy);
}
}

#[test]
fn get_next_december_solstice_test() {
fn next_december_solstice_test() {
let accuracy = 20; // TODO: Improve accuracy
let solstice_december_2013 = parse_time("2013-12-21T17:11:00+0000");

let times = vec![
get_next_december_solstice(parse_time("2012-06-01T00:00:00+0000")),
next_december_solstice(parse_time("2012-06-01T00:00:00+0000")),
parse_time("2013-06-01T00:00:00+0000"),
];

for t in times {
assert_approx_eq!(solstice_december_2013, get_next_december_solstice(t), accuracy);
assert_approx_eq!(solstice_december_2013, next_december_solstice(t), accuracy);
}
}
}
76 changes: 38 additions & 38 deletions src/ephemeris.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,85 +8,85 @@ use alloc::string::ToString;
use alloc::string::String;

/// Get the ephemeris of a geodate
pub fn get_ephemeris(timestamp: i64, longitude: f64, latitude: f64) -> BTreeMap<i64, String> {
pub fn ephemeris(timestamp: i64, longitude: f64, latitude: f64) -> BTreeMap<i64, String> {
let mut events = BTreeMap::new();

let day_begin_at = get_midnight(timestamp, longitude);
let day_end_at = get_midnight(day_begin_at + 86400 + 10000, longitude);
let day_begin_at = midnight(timestamp, longitude);
let day_end_at = midnight(day_begin_at + 86400 + 10000, longitude);

events.insert(timestamp, "Current".to_string());

let es = vec![
("Equinox", get_next_march_equinox(day_begin_at)),
("Equinox", get_next_september_equinox(day_begin_at)),
("Solstice", get_next_december_solstice(day_begin_at)),
("Solstice", get_next_june_solstice(day_begin_at))
("Equinox", next_march_equinox(day_begin_at)),
("Equinox", next_september_equinox(day_begin_at)),
("Solstice", next_december_solstice(day_begin_at)),
("Solstice", next_june_solstice(day_begin_at))
];
for (name, e) in es {
if e < day_end_at {
events.insert(e, name.to_string());
}
}

let n = get_lunation_number(day_begin_at); // FIXME: Potential bug here
let n = lunation_number(day_begin_at); // FIXME: Potential bug here
let es = vec![
("New Moon", get_new_moon(n)),
("First Quarter Moon", get_first_quarter_moon(n + 0.25)),
("Full Moon", get_full_moon(n + 0.50)),
("Last Quarter Moon", get_last_quarter_moon(n + 0.75))
("New Moon", new_moon(n)),
("First Quarter Moon", first_quarter_moon(n + 0.25)),
("Full Moon", full_moon(n + 0.50)),
("Last Quarter Moon", last_quarter_moon(n + 0.75))
];
for (name, e) in es {
if day_begin_at < e && e < day_end_at {
events.insert(e, name.to_string());
}
}

if let Some(moonrise) = get_moonrise(timestamp, longitude, latitude) {
if moonrise < day_begin_at {
if let Some(moonrise) = get_moonrise(timestamp + 86400, longitude, latitude) {
if day_begin_at <= moonrise && moonrise <= day_end_at {
events.insert(moonrise, "Moonrise+1".to_string());
if let Some(event) = moonrise(timestamp, longitude, latitude) {
if event < day_begin_at {
if let Some(event) = moonrise(timestamp + 86400, longitude, latitude) {
if day_begin_at <= event && event <= day_end_at {
events.insert(event, "Moonrise+1".to_string());
} else {
//events.insert(moonrise, "Moonrise +1");
//events.insert(event, "Moonrise +1"); // FIXME?
}
}
} else if moonrise > day_end_at {
if let Some(moonrise) = get_moonrise(timestamp - 86400, longitude, latitude) {
if day_begin_at <= moonrise && moonrise <= day_end_at {
events.insert(moonrise, "Moonrise-1".to_string());
} else if event > day_end_at {
if let Some(event) = moonrise(timestamp - 86400, longitude, latitude) {
if day_begin_at <= event && event <= day_end_at {
events.insert(event, "Moonrise-1".to_string());
} else {
//events.insert(moonrise, "Moonrise -1");
//events.insert(event, "Moonrise -1"); // FIXME?
}
}
} else {
events.insert(moonrise, "Moonrise".to_string());
events.insert(event, "Moonrise".to_string());
}
}

if let Some(moonset) = get_moonset(timestamp, longitude, latitude) {
if moonset < day_begin_at {
if let Some(moonset) = get_moonset(timestamp + 86400, longitude, latitude) {
if day_begin_at <= moonset && moonset <= day_end_at {
events.insert(moonset, "Moonset".to_string());
if let Some(event) = moonset(timestamp, longitude, latitude) {
if event < day_begin_at {
if let Some(event) = moonset(timestamp + 86400, longitude, latitude) {
if day_begin_at <= event && event <= day_end_at {
events.insert(event, "Moonset".to_string());
}
}
} else if moonset > day_end_at {
if let Some(moonset) = get_moonset(timestamp - 86400, longitude, latitude) {
if day_begin_at <= moonset && moonset <= day_end_at {
events.insert(moonset, "Moonset".to_string());
} else if event > day_end_at {
if let Some(event) = moonset(timestamp - 86400, longitude, latitude) {
if day_begin_at <= event && event <= day_end_at {
events.insert(event, "Moonset".to_string());
}
}
} else {
events.insert(moonset, "Moonset".to_string());
events.insert(event, "Moonset".to_string());
}
}

if let Some(sunrise) = get_sunrise(timestamp, longitude, latitude) {
events.insert(sunrise, "Sunrise".to_string());
if let Some(event) = sunrise(timestamp, longitude, latitude) {
events.insert(event, "Sunrise".to_string());
}

if let Some(sunset) = get_sunset(timestamp, longitude, latitude) {
events.insert(sunset, "Sunset".to_string());
if let Some(event) = sunset(timestamp, longitude, latitude) {
events.insert(event, "Sunset".to_string());
}

events
Expand Down
Loading