Created get_moon_phase() to calculate exact moon phase
This commit is contained in:
parent
0942290599
commit
82c45bc336
84
src/gradix.c
84
src/gradix.c
@ -8,6 +8,9 @@
|
|||||||
#define IMAGEDIR "/home/polesz/Projektek/c/gradix/images"
|
#define IMAGEDIR "/home/polesz/Projektek/c/gradix/images"
|
||||||
#define EPHEDIR "/home/polesz/Projektek/c/gradix/swe/data"
|
#define EPHEDIR "/home/polesz/Projektek/c/gradix/swe/data"
|
||||||
|
|
||||||
|
#define SYNODIC 29.53058867
|
||||||
|
#define MSPERDAY 86400000
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SIGN_ARIES = 1,
|
SIGN_ARIES = 1,
|
||||||
SIGN_TAURUS,
|
SIGN_TAURUS,
|
||||||
@ -23,6 +26,23 @@ typedef enum {
|
|||||||
SIGN_PISCES
|
SIGN_PISCES
|
||||||
} zodiacSign;
|
} zodiacSign;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MOON_STATE_NEW,
|
||||||
|
MOON_STATE_WAXING_CRESCENT,
|
||||||
|
MOON_STATE_WAXING_HALF,
|
||||||
|
MOON_STATE_WAXING_GIBBOUS,
|
||||||
|
MOON_STATE_FULL,
|
||||||
|
MOON_STATE_WANING_GIBBOUS,
|
||||||
|
MOON_STATE_WANING_HALF,
|
||||||
|
MOON_STATE_WANING_CRESCENT,
|
||||||
|
MOON_STATE_DARK
|
||||||
|
} moonState;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
moonState phase;
|
||||||
|
double visiblePercentage;
|
||||||
|
} moonPhase;
|
||||||
|
|
||||||
//RsvgHandle *svgHandle[SE_CHIRON + SIGN_PISCES + 1];
|
//RsvgHandle *svgHandle[SE_CHIRON + SIGN_PISCES + 1];
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -123,6 +143,69 @@ set_location_and_time(double lon, double lat, double alt, int year, int month, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
moonPhase *
|
||||||
|
get_moon_phase(gint year, gint month, gint day, gint hour, gint min, gint sec)
|
||||||
|
{
|
||||||
|
GDateTime *baseDate,
|
||||||
|
*gds;
|
||||||
|
GTimeSpan diff;
|
||||||
|
gdouble phasePercent,
|
||||||
|
realPercent;
|
||||||
|
moonState state;
|
||||||
|
moonPhase *ret;
|
||||||
|
|
||||||
|
baseDate = g_date_time_new_utc(2005, 5, 8, 8, 48, 0);
|
||||||
|
// TODO: this should use the time zone used at the birth place
|
||||||
|
gds = g_date_time_new_local(year, month, day, 0, 0, 0);
|
||||||
|
diff = g_date_time_difference(gds, baseDate) / 1000;
|
||||||
|
|
||||||
|
g_date_time_unref(gds);
|
||||||
|
g_date_time_unref(baseDate);
|
||||||
|
|
||||||
|
// The current phase of the moon, between 0 and 100 (both 0 and 100 are new moon, 50 is full moon)
|
||||||
|
phasePercent = fmod((diff * 100) / (SYNODIC * MSPERDAY), 100);
|
||||||
|
|
||||||
|
if (phasePercent < 0) {
|
||||||
|
phasePercent += 100.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((phasePercent < 0) || (phasePercent > 100)) {
|
||||||
|
fprintf(stderr, "Error during moon phase calculation!\n");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The real percentage is a number around the illumination percentage of the moon
|
||||||
|
realPercent = (50.0 - fabs(phasePercent - 50.0)) * 2;
|
||||||
|
|
||||||
|
// Uuuugly!
|
||||||
|
if (phasePercent == 0) {
|
||||||
|
state = MOON_STATE_NEW;
|
||||||
|
} else if (phasePercent < 25) {
|
||||||
|
state = MOON_STATE_WAXING_CRESCENT;
|
||||||
|
} else if (phasePercent == 25) {
|
||||||
|
state = MOON_STATE_WAXING_HALF;
|
||||||
|
} else if (phasePercent < 50) {
|
||||||
|
state = MOON_STATE_WAXING_GIBBOUS;
|
||||||
|
} else if (phasePercent == 50) {
|
||||||
|
state = MOON_STATE_FULL;
|
||||||
|
} else if (phasePercent < 75) {
|
||||||
|
state = MOON_STATE_WANING_GIBBOUS;
|
||||||
|
} else if (phasePercent == 75) {
|
||||||
|
state = MOON_STATE_WANING_HALF;
|
||||||
|
} else if (phasePercent < 100) {
|
||||||
|
state = MOON_STATE_WANING_CRESCENT;
|
||||||
|
} else {
|
||||||
|
state = MOON_STATE_DARK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = g_new0(moonPhase, 1);
|
||||||
|
ret->phase = state;
|
||||||
|
ret->visiblePercentage = realPercent;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#if !CLUTTER_CHECK_VERSION(1, 3, 6)
|
#if !CLUTTER_CHECK_VERSION(1, 3, 6)
|
||||||
@ -159,6 +242,7 @@ main(int argc, char *argv[])
|
|||||||
printf("House %2d..: %2.0f (%f)\n", p, ceilf(cusps[p] / 30.0), cusps[p]);
|
printf("House %2d..: %2.0f (%f)\n", p, ceilf(cusps[p] / 30.0), cusps[p]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_moon_phase(year, month, day, hour, min, sec);
|
||||||
printf("Asc.......: %.0f\n", ceilf(ascmc[0] / 30.0));
|
printf("Asc.......: %.0f\n", ceilf(ascmc[0] / 30.0));
|
||||||
printf("MC........: %.0f\n", ceilf(ascmc[1] / 30.0));
|
printf("MC........: %.0f\n", ceilf(ascmc[1] / 30.0));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user