Implemented C function Seasons, but not yet tested.

This commit is contained in:
Don Cross
2019-05-20 15:23:15 -04:00
parent 468319b71d
commit 87e65b43d7
3 changed files with 72 additions and 2 deletions

View File

@@ -1801,6 +1801,35 @@ static int QuadInterp(
return 1; /* success */
}
static astro_status_t FindSeasonChange(double targetLon, int year, int month, int day, astro_time_t *time)
{
astro_time_t startDate = Astronomy_MakeTime(year, month, day, 0, 0, 0.0);
astro_search_result_t result = Astronomy_SearchSunLongitude(targetLon, startDate, 4.0);
*time = result.time;
return result.status;
}
astro_seasons_t Astronomy_Seasons(int year)
{
astro_seasons_t seasons;
astro_status_t status;
seasons.status = ASTRO_SUCCESS;
status = FindSeasonChange( 0, year, 3, 19, &seasons.mar_equinox);
if (status != ASTRO_SUCCESS) seasons.status = status;
status = FindSeasonChange( 90, year, 6, 19, &seasons.jun_solstice);
if (status != ASTRO_SUCCESS) seasons.status = status;
status = FindSeasonChange(180, year, 9, 21, &seasons.sep_equinox);
if (status != ASTRO_SUCCESS) seasons.status = status;
status = FindSeasonChange(270, year, 12, 20, &seasons.dec_solstice);
if (status != ASTRO_SUCCESS) seasons.status = status;
return seasons;
}
#ifdef __cplusplus
}
@@ -1831,6 +1860,6 @@ static int QuadInterp(
X SearchRelativeLongitude
X SearchRiseSet
- SearchSunLongitude
X Seasons
- Seasons
- SunPosition
*/

View File

@@ -2857,6 +2857,35 @@ static int QuadInterp(
return 1; /* success */
}
static astro_status_t FindSeasonChange(double targetLon, int year, int month, int day, astro_time_t *time)
{
astro_time_t startDate = Astronomy_MakeTime(year, month, day, 0, 0, 0.0);
astro_search_result_t result = Astronomy_SearchSunLongitude(targetLon, startDate, 4.0);
*time = result.time;
return result.status;
}
astro_seasons_t Astronomy_Seasons(int year)
{
astro_seasons_t seasons;
astro_status_t status;
seasons.status = ASTRO_SUCCESS;
status = FindSeasonChange( 0, year, 3, 19, &seasons.mar_equinox);
if (status != ASTRO_SUCCESS) seasons.status = status;
status = FindSeasonChange( 90, year, 6, 19, &seasons.jun_solstice);
if (status != ASTRO_SUCCESS) seasons.status = status;
status = FindSeasonChange(180, year, 9, 21, &seasons.sep_equinox);
if (status != ASTRO_SUCCESS) seasons.status = status;
status = FindSeasonChange(270, year, 12, 20, &seasons.dec_solstice);
if (status != ASTRO_SUCCESS) seasons.status = status;
return seasons;
}
#ifdef __cplusplus
}
@@ -2887,6 +2916,6 @@ static int QuadInterp(
X SearchRelativeLongitude
X SearchRiseSet
- SearchSunLongitude
X Seasons
- Seasons
- SunPosition
*/

View File

@@ -134,6 +134,16 @@ typedef struct
}
astro_search_result_t;
typedef struct
{
astro_status_t status;
astro_time_t mar_equinox;
astro_time_t jun_solstice;
astro_time_t sep_equinox;
astro_time_t dec_solstice;
}
astro_seasons_t;
typedef double (* astro_search_func_t) (void *context, astro_time_t time);
/*---------- functions ----------*/
@@ -169,6 +179,8 @@ astro_search_result_t Astronomy_SearchSunLongitude(
astro_time_t dateStart,
double limitDays);
astro_seasons_t Astronomy_Seasons(int calendar_year);
#ifdef __cplusplus
}
#endif