From 5dcd5cdd176df7a69543462df3281894826335c0 Mon Sep 17 00:00:00 2001 From: "Gergely Polonkai (W00d5t0ck)" Date: Fri, 4 Oct 2013 01:18:34 +0200 Subject: [PATCH] Outsourced Moon phase calculation to GsweMoonPhaseData --- docs/reference/swe-glib/swe-glib-sections.txt | 2 + src/gswe-moment.c | 54 +------------ src/gswe-moon-phase-data.c | 79 +++++++++++++++++++ src/gswe-moon-phase-data.h | 3 + 4 files changed, 87 insertions(+), 51 deletions(-) diff --git a/docs/reference/swe-glib/swe-glib-sections.txt b/docs/reference/swe-glib/swe-glib-sections.txt index 397293b..62441e1 100644 --- a/docs/reference/swe-glib/swe-glib-sections.txt +++ b/docs/reference/swe-glib/swe-glib-sections.txt @@ -45,6 +45,8 @@ gswe_moment_get_type gswe_moon_phase_data_new gswe_moon_phase_data_ref gswe_moon_phase_data_unref +gswe_moon_phase_data_calculate_by_timestamp +gswe_moon_phase_data_calculate_by_jd gswe_moon_phase_data_get_phase gswe_moon_phase_data_get_illumination GsweMoonPhaseData diff --git a/src/gswe-moment.c b/src/gswe-moment.c index b7e77b9..cc8ef5e 100644 --- a/src/gswe-moment.c +++ b/src/gswe-moment.c @@ -32,8 +32,6 @@ * one given point on Earth at a given time. */ -#define SYNODIC 29.53058867 - #define GSWE_MOMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GSWE_TYPE_MOMENT, GsweMomentPrivate)) /** @@ -972,62 +970,16 @@ gswe_moment_get_quality_points(GsweMoment *moment, GsweQuality quality) GsweMoonPhaseData * gswe_moment_get_moon_phase(GsweMoment *moment, GError **err) { - gdouble difference, - phase_percent, - jd, - jdb; - if (moment->priv->moon_phase_revision == moment->priv->revision) { return moment->priv->moon_phase; } - jd = gswe_timestamp_get_julian_day(moment->priv->timestamp, err); + gswe_moon_phase_data_calculate_by_timestamp(moment->priv->timestamp, err); - if ((err) && (*err)) { - return NULL; + if (!err || !*err) { + moment->priv->moon_phase_revision = moment->priv->revision; } - jdb = gswe_timestamp_get_julian_day(gswe_full_moon_base_date, err); - - if ((err) && (*err)) { - return NULL; - } - - difference = (jd - jdb); - phase_percent = fmod((difference * 100) / SYNODIC, 100); - - if (phase_percent < 0) { - phase_percent += 100.0; - } - - if ((phase_percent < 0) || (phase_percent > 100)) { - g_error("Error during Moon phase calculation!"); - } - - moment->priv->moon_phase->illumination = (50.0 - fabs(phase_percent - 50.0)) * 2; - - if (phase_percent == 0) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_NEW; - } else if (phase_percent < 25) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_WAXING_CRESCENT; - } else if (phase_percent == 25) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_WAXING_HALF; - } else if (phase_percent < 50) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_WAXING_GIBBOUS; - } else if (phase_percent == 50) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_FULL; - } else if (phase_percent < 75) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_WANING_GIBBOUS; - } else if (phase_percent == 75) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_WANING_HALF; - } else if (phase_percent < 100) { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_WANING_CRESCENT; - } else { - moment->priv->moon_phase->phase = GSWE_MOON_PHASE_DARK; - } - - moment->priv->moon_phase_revision = moment->priv->revision; - return gswe_moon_phase_data_ref(moment->priv->moon_phase); } diff --git a/src/gswe-moon-phase-data.c b/src/gswe-moon-phase-data.c index 6783ff3..1933112 100644 --- a/src/gswe-moon-phase-data.c +++ b/src/gswe-moon-phase-data.c @@ -15,10 +15,16 @@ * You should have received a copy of the GNU General Public License * along with this library; if not, see . */ +#include + #include "gswe-types.h" +#include "swe-glib-private.h" #include "gswe-moon-phase-data.h" #include "gswe-moon-phase-data-private.h" +#include "gswe-timestamp.h" + +#define SYNODIC 29.53058867 /** * SECTION:gswe-moon-phase-data @@ -82,6 +88,79 @@ gswe_moon_phase_data_unref(GsweMoonPhaseData *moon_phase_data) } } +/** + * gswe_moon_phase_data_calculate_by_timestamp: + * @moon_phase_data: a #GsweMoonPhaseData + * @timestamp: a #GsweTimestamp with a valid timestamp set + * @err: a #GError + * + * Calculates the moon at a given time, specified by @jd. + */ +void +gswe_moon_phase_data_calculate_by_jd(GsweMoonPhaseData *moon_phase_data, gdouble jd, GError **err) +{ + gdouble jdb, + phase_percent; + + jdb = gswe_timestamp_get_julian_day(gswe_full_moon_base_date, err); + + if ((err) && (*err)) { + return; + } + + if ((phase_percent = fmod(((jd - jdb) * 100) / SYNODIC, 100)) < 0) { + phase_percent += 100.0; + } + + if ((phase_percent < 0) || (phase_percent > 100)) { + g_error("Error during Moon phase calculation!"); + } + + moon_phase_data->illumination = (50.0 - fabs(phase_percent - 50.0)) * 2; + + if (phase_percent == 0) { + moon_phase_data->phase = GSWE_MOON_PHASE_NEW; + } else if (phase_percent < 25) { + moon_phase_data->phase = GSWE_MOON_PHASE_WAXING_CRESCENT; + } else if (phase_percent == 25) { + moon_phase_data->phase = GSWE_MOON_PHASE_WAXING_HALF; + } else if (phase_percent < 50) { + moon_phase_data->phase = GSWE_MOON_PHASE_WAXING_GIBBOUS; + } else if (phase_percent == 50) { + moon_phase_data->phase = GSWE_MOON_PHASE_FULL; + } else if (phase_percent < 75) { + moon_phase_data->phase = GSWE_MOON_PHASE_WANING_GIBBOUS; + } else if (phase_percent == 75) { + moon_phase_data->phase = GSWE_MOON_PHASE_WANING_HALF; + } else if (phase_percent < 100) { + moon_phase_data->phase = GSWE_MOON_PHASE_WANING_CRESCENT; + } else { + moon_phase_data->phase = GSWE_MOON_PHASE_DARK; + } +} + +/** + * gswe_moon_phase_data_calculate_by_timestamp: + * @moon_phase_data: a #GsweMoonPhaseData + * @timestamp: a #GsweTimestamp with a valid timestamp set + * @err: a #GError + * + * Calculates the moon at a given time, specified by @timestamp. + */ +void +gswe_moon_phase_data_calculate_by_timestamp(GsweMoonPhaseData *moon_phase_data, GsweTimestamp *timestamp, GError **err) +{ + gdouble jd; + + jd = gswe_timestamp_get_julian_day(timestamp, err); + + if (*err) { + return; + } + + gswe_moon_phase_data_calculate_by_jd(moon_phase_data, jd, err); +} + /** * gswe_moon_phase_data_get_phase: * @moon_phase_data: (in): a GsweMoonPhaseData diff --git a/src/gswe-moon-phase-data.h b/src/gswe-moon-phase-data.h index 22ef372..754b7f3 100644 --- a/src/gswe-moon-phase-data.h +++ b/src/gswe-moon-phase-data.h @@ -39,6 +39,9 @@ GsweMoonPhaseData *gswe_moon_phase_data_new(void); GsweMoonPhaseData *gswe_moon_phase_data_ref(GsweMoonPhaseData *moon_phase_data); void gswe_moon_phase_data_unref(GsweMoonPhaseData *moon_phase_data); +void gswe_moon_phase_data_calculate_by_jd(GsweMoonPhaseData *moon_phase_data, gdouble jd, GError **err); +void gswe_moon_phase_data_calculate_by_timestamp(GsweMoonPhaseData *moon_phase_data, GsweTimestamp *timestamp, GError **err); + GsweMoonPhase gswe_moon_phase_data_get_phase(GsweMoonPhaseData *moon_phase_data); gdouble gswe_moon_phase_data_get_illumination(GsweMoonPhaseData *moon_phase_data);