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);