Add moonrisedir and moonsetdir functions.

This commit is contained in:
Dianne Skoll
2025-03-19 11:57:01 -04:00
parent a22c674846
commit 190dfa3a8f
3 changed files with 60 additions and 6 deletions

View File

@@ -126,7 +126,9 @@ static int FMoondate (func_info *);
static int FMoondatetime (func_info *);
static int FMoonphase (func_info *);
static int FMoonrise (func_info *);
static int FMoonrisedir (func_info *);
static int FMoonset (func_info *);
static int FMoonsetdir (func_info *);
static int FMoontime (func_info *);
static int FMultiTrig (func_info *);
static int FNDawn (func_info *);
@@ -289,7 +291,9 @@ BuiltinFunc Func[] = {
{ "moondatetime", 1, 3, 0, FMoondatetime, NULL },
{ "moonphase", 0, 2, 0, FMoonphase, NULL },
{ "moonrise", 0, 1, 0, FMoonrise, NULL },
{ "moonrisedir", 0, 1, 0, FMoonrisedir, NULL },
{ "moonset", 0, 1, 0, FMoonset, NULL },
{ "moonsetdir", 0, 1, 0, FMoonsetdir, NULL },
{ "moontime", 1, 3, 0, FMoontime, NULL },
{ "multitrig", 1, NO_MAX, 0, FMultiTrig, NULL },
{ "ndawn", 0, 1, 0, FNDawn, NULL },
@@ -3344,6 +3348,30 @@ static int FMoonset(func_info *info)
return OK;
}
static int FMoonrisedir(func_info *info)
{
int start = DSEToday;
if (Nargs >= 1) {
if (!HASDATE(ARG(0))) return E_BAD_TYPE;
start = DATEPART(ARG(0));
}
RetVal.type = INT_TYPE;
RETVAL = GetMoonrise_angle(start);
return OK;
}
static int FMoonsetdir(func_info *info)
{
int start = DSEToday;
if (Nargs >= 1) {
if (!HASDATE(ARG(0))) return E_BAD_TYPE;
start = DATEPART(ARG(0));
}
RetVal.type = INT_TYPE;
RETVAL = GetMoonset_angle(start);
return OK;
}
static int MoonStuff(int type_wanted, func_info *info)
{
int startdate, starttim;

View File

@@ -896,31 +896,55 @@ calculate_moonrise_moonset(double latitude, double longitude, time_t t,
Returns 0 if no moonrise could be computes */
#define ME_SEARCH_DAYS 180
static int GetMoonevent(int dse, int is_rise)
static int GetMoonevent(int dse, int is_rise, int want_angle)
{
int i;
int angle;
struct MoonInfo mi;
time_t t = time_t_from_dse(dse);
for (i=0; i<ME_SEARCH_DAYS; i++) {
calculate_moonrise_moonset(Latitude, Longitude, t + i * 86400, &mi);
if (is_rise) {
if (mi.hasRise && mi.riseTime >= t) {
return datetime_from_time_t(mi.riseTime);
if (want_angle) {
angle = (int) (mi.riseAz + 0.5);
return angle;
} else {
return datetime_from_time_t(mi.riseTime);
}
}
} else {
if (mi.hasSet && mi.setTime >= t) {
return datetime_from_time_t(mi.setTime);
if (want_angle) {
angle = (int) (mi.setAz + 0.5);
return angle;
} else {
return datetime_from_time_t(mi.setTime);
}
}
}
}
return 0;
if (want_angle) {
return -1;
} else {
return 0;
}
}
int GetMoonrise(int dse)
{
return GetMoonevent(dse, 1);
return GetMoonevent(dse, 1, 0);
}
int GetMoonset(int dse)
{
return GetMoonevent(dse, 0);
return GetMoonevent(dse, 0, 0);
}
int GetMoonrise_angle(int dse)
{
return GetMoonevent(dse, 1, 1);
}
int GetMoonset_angle(int dse)
{
return GetMoonevent(dse, 0, 1);
}

View File

@@ -287,3 +287,5 @@ void WriteJSONInfoChain(TrigInfo *ti);
char const *line_range(int lineno_start, int lineno);
int GetMoonrise(int dse);
int GetMoonset(int dse);
int GetMoonrise_angle(int dse);
int GetMoonset_angle(int dse);