Outsourced Moon phase calculation to GsweMoonPhaseData
This commit is contained in:
parent
20a350eacc
commit
5dcd5cdd17
@ -45,6 +45,8 @@ gswe_moment_get_type
|
|||||||
gswe_moon_phase_data_new
|
gswe_moon_phase_data_new
|
||||||
gswe_moon_phase_data_ref
|
gswe_moon_phase_data_ref
|
||||||
gswe_moon_phase_data_unref
|
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_phase
|
||||||
gswe_moon_phase_data_get_illumination
|
gswe_moon_phase_data_get_illumination
|
||||||
GsweMoonPhaseData
|
GsweMoonPhaseData
|
||||||
|
@ -32,8 +32,6 @@
|
|||||||
* one given point on Earth at a given time.
|
* 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))
|
#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 *
|
GsweMoonPhaseData *
|
||||||
gswe_moment_get_moon_phase(GsweMoment *moment, GError **err)
|
gswe_moment_get_moon_phase(GsweMoment *moment, GError **err)
|
||||||
{
|
{
|
||||||
gdouble difference,
|
|
||||||
phase_percent,
|
|
||||||
jd,
|
|
||||||
jdb;
|
|
||||||
|
|
||||||
if (moment->priv->moon_phase_revision == moment->priv->revision) {
|
if (moment->priv->moon_phase_revision == moment->priv->revision) {
|
||||||
return moment->priv->moon_phase;
|
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)) {
|
if (!err || !*err) {
|
||||||
return NULL;
|
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);
|
return gswe_moon_phase_data_ref(moment->priv->moon_phase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,10 +15,16 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
* along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include "gswe-types.h"
|
#include "gswe-types.h"
|
||||||
|
|
||||||
|
#include "swe-glib-private.h"
|
||||||
#include "gswe-moon-phase-data.h"
|
#include "gswe-moon-phase-data.h"
|
||||||
#include "gswe-moon-phase-data-private.h"
|
#include "gswe-moon-phase-data-private.h"
|
||||||
|
#include "gswe-timestamp.h"
|
||||||
|
|
||||||
|
#define SYNODIC 29.53058867
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:gswe-moon-phase-data
|
* 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:
|
* gswe_moon_phase_data_get_phase:
|
||||||
* @moon_phase_data: (in): a GsweMoonPhaseData
|
* @moon_phase_data: (in): a GsweMoonPhaseData
|
||||||
|
@ -39,6 +39,9 @@ GsweMoonPhaseData *gswe_moon_phase_data_new(void);
|
|||||||
GsweMoonPhaseData *gswe_moon_phase_data_ref(GsweMoonPhaseData *moon_phase_data);
|
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_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);
|
GsweMoonPhase gswe_moon_phase_data_get_phase(GsweMoonPhaseData *moon_phase_data);
|
||||||
gdouble gswe_moon_phase_data_get_illumination(GsweMoonPhaseData *moon_phase_data);
|
gdouble gswe_moon_phase_data_get_illumination(GsweMoonPhaseData *moon_phase_data);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user