Files
StarStreet-Forecast/astronomy.pas
2026-03-23 09:15:23 +00:00

1096 lines
32 KiB
ObjectPascal

unit astronomy;
{$ifdef windows}
{$ifdef CPU64}
//linkare le dipende di mingw installate nel vostro pc
{$link astronomywin64.o} //il file astronomy.c compilato
{$endif}
{$ifdef CPU32}
//linkare le dipende di mingw installate nel vostro pc
{$link win32astronomy.o} //il file astronomy.c compilato
{$endif}
{$endif}
{$ifdef linux}
{$link astronomy_linux.o} //il file astronomy.c compilato
{$linklib libc}
{$linklib libm}
{$endif}
{$ifdef darwin}
{$link astronomydarwin64.o} //il file astronomy.c compilato
{$linklib libc}
{$linklib libm}
{$endif}
interface
uses
DateUtils, SysUtils;
{ Pointers to basic pascal types}
Type
PLongint = ^Longint;
PSmallInt = ^SmallInt;
PByte = ^Byte;
PWord = ^Word;
PDWord = ^DWord;
PDouble = ^Double;
const
C_AUDAY = 173.1446326846693;
KM_PER_AU = 1.4959787069098932e+8;
AU_PER_LY = 63241.07708807546;
DEG2RAD = 0.017453292519943296;
HOUR2RAD = 0.2617993877991494365;
RAD2DEG = 57.295779513082321;
RAD2HOUR = 3.819718634205488;
SUN_RADIUS_KM = 695700.0;
MERCURY_EQUATORIAL_RADIUS_KM = 2440.5;
MERCURY_POLAR_RADIUS_KM = 2438.3;
VENUS_RADIUS_KM = 6051.8;
EARTH_EQUATORIAL_RADIUS_KM = 6378.1366;
EARTH_FLATTENING = 0.996647180302104;
MOON_EQUATORIAL_RADIUS_KM = 1738.1;
MOON_POLAR_RADIUS_KM = 1736.0;
MARS_EQUATORIAL_RADIUS_KM = 3396.2;
MARS_POLAR_RADIUS_KM = 3376.2;
JUPITER_EQUATORIAL_RADIUS_KM = 71492.0;
JUPITER_POLAR_RADIUS_KM = 66854.0;
JUPITER_MEAN_RADIUS_KM = 69911.0;
IO_RADIUS_KM = 1821.6;
EUROPA_RADIUS_KM = 1560.8;
GANYMEDE_RADIUS_KM = 2631.2;
CALLISTO_RADIUS_KM = 2410.3;
SATURN_EQUATORIAL_RADIUS_KM = 60268.0;
SATURN_POLAR_RADIUS_KM = 54364.0;
URANUS_EQUATORIAL_RADIUS_KM = 25559.0;
URANUS_POLAR_RADIUS_KM = 24973.0;
NEPTUNE_EQUATORIAL_RADIUS_KM = 24764.0;
NEPTUNE_POLAR_RADIUS_KM = 24341.0;
PLUTO_RADIUS_KM = 1188.3;
type
Pastro_status_t = ^astro_status_t;
astro_status_t = Longint;
Const
ASTRO_SUCCESS = 0;
ASTRO_NOT_INITIALIZED = 1;
ASTRO_INVALID_BODY = 2;
ASTRO_NO_CONVERGE = 3;
ASTRO_BAD_TIME = 4;
ASTRO_BAD_VECTOR = 5;
ASTRO_SEARCH_FAILURE = 6;
ASTRO_EARTH_NOT_ALLOWED = 7;
ASTRO_NO_MOON_QUARTER = 8;
ASTRO_WRONG_MOON_QUARTER = 9;
ASTRO_INTERNAL_ERROR = 10;
ASTRO_INVALID_PARAMETER = 11;
ASTRO_FAIL_APSIS = 12;
ASTRO_BUFFER_TOO_SMALL = 13;
ASTRO_OUT_OF_MEMORY = 14;
ASTRO_INCONSISTENT_TIMES = 15;
type
Pastro_time_t = ^astro_time_t;
astro_time_t = record
ut : double;
tt : double;
psi : double;
eps : double;
st : double;
end;
Pastro_utc_t = ^astro_utc_t;
astro_utc_t = record
year : longint;
month : longint;
day : longint;
hour : longint;
minute : longint;
second : double;
end;
Pastro_vector_t = ^astro_vector_t;
astro_vector_t = record
status : astro_status_t;
x : double;
y : double;
z : double;
t : astro_time_t;
end;
Pastro_state_vector_t = ^astro_state_vector_t;
astro_state_vector_t = record
status : astro_status_t;
x : double;
y : double;
z : double;
vx : double;
vy : double;
vz : double;
t : astro_time_t;
end;
Pastro_spherical_t = ^astro_spherical_t;
astro_spherical_t = record
status : astro_status_t;
lat : double;
lon : double;
dist : double;
end;
Pastro_angle_result_t = ^astro_angle_result_t;
astro_angle_result_t = record
status : astro_status_t;
angle : double;
end;
Pastro_body_t = ^astro_body_t;
astro_body_t = Longint;
Const
BODY_INVALID = -(1);
BODY_MERCURY = (-(1))+1;
BODY_VENUS = (-(1))+2;
BODY_EARTH = (-(1))+3;
BODY_MARS = (-(1))+4;
BODY_JUPITER = (-(1))+5;
BODY_SATURN = (-(1))+6;
BODY_URANUS = (-(1))+7;
BODY_NEPTUNE = (-(1))+8;
BODY_PLUTO = (-(1))+9;
BODY_SUN = (-(1))+10;
BODY_MOON = (-(1))+11;
BODY_EMB = (-(1))+12;
BODY_SSB = (-(1))+13;
BODY_STAR1 = 101;
BODY_STAR2 = 102;
BODY_STAR3 = 103;
BODY_STAR4 = 104;
BODY_STAR5 = 105;
BODY_STAR6 = 106;
BODY_STAR7 = 107;
BODY_STAR8 = 108;
type
Pastro_observer_t = ^astro_observer_t;
astro_observer_t = record
latitude : double;
longitude : double;
height : double;
end;
Pastro_equatorial_t = ^astro_equatorial_t;
astro_equatorial_t = record
status : astro_status_t;
ra : double;
dec : double;
dist : double;
vec : astro_vector_t;
end;
Pastro_ecliptic_t = ^astro_ecliptic_t;
astro_ecliptic_t = record
status : astro_status_t;
vec : astro_vector_t;
elat : double;
elon : double;
end;
Pastro_horizon_t = ^astro_horizon_t;
astro_horizon_t = record
azimuth : double;
altitude : double;
ra : double;
dec : double;
end;
Pastro_rotation_t = ^astro_rotation_t;
astro_rotation_t = record
status : astro_status_t;
rot : array[0..2] of array[0..2] of double;
end;
Pastro_refraction_t = ^astro_refraction_t;
astro_refraction_t = Longint;
Const
REFRACTION_NONE = 0;
REFRACTION_NORMAL = 1;
REFRACTION_JPLHOR = 2;
type
Pastro_atmosphere_t = ^astro_atmosphere_t;
astro_atmosphere_t = record
status : astro_status_t;
pressure : double;
temperature : double;
density : double;
end;
Pastro_search_result_t = ^astro_search_result_t;
astro_search_result_t = record
status : astro_status_t;
time : astro_time_t;
end;
Pastro_seasons_t = ^astro_seasons_t;
astro_seasons_t = record
status : astro_status_t;
mar_equinox : astro_time_t;
jun_solstice : astro_time_t;
sep_equinox : astro_time_t;
dec_solstice : astro_time_t;
end;
Pastro_moon_quarter_t = ^astro_moon_quarter_t;
astro_moon_quarter_t = record
status : astro_status_t;
quarter : longint;
time : astro_time_t;
end;
Pastro_func_result_t = ^astro_func_result_t;
astro_func_result_t = record
status : astro_status_t;
value : double;
end;
astro_search_func_t = function (context:pointer; time:astro_time_t):astro_func_result_t;cdecl;
astro_deltat_func = function (ut:double):double;cdecl;
function Astronomy_DeltaT_EspenakMeeus(ut:double):double;cdecl;external;
function Astronomy_DeltaT_JplHorizons(ut:double):double;cdecl;external;
procedure Astronomy_SetDeltaTFunction(func:astro_deltat_func);cdecl;external;
type
Pastro_visibility_t = ^astro_visibility_t;
astro_visibility_t = Longint;
Const
VISIBLE_MORNING = 0;
VISIBLE_EVENING = 1;
type
Pastro_elongation_t = ^astro_elongation_t;
astro_elongation_t = record
status : astro_status_t;
time : astro_time_t;
visibility : astro_visibility_t;
elongation : double;
ecliptic_separation : double;
end;
Pastro_hour_angle_t = ^astro_hour_angle_t;
astro_hour_angle_t = record
status : astro_status_t;
time : astro_time_t;
hor : astro_horizon_t;
end;
Pastro_illum_t = ^astro_illum_t;
astro_illum_t = record
status : astro_status_t;
time : astro_time_t;
mag : double;
phase_angle : double;
phase_fraction : double;
helio_dist : double;
ring_tilt : double;
end;
Pastro_apsis_kind_t = ^astro_apsis_kind_t;
astro_apsis_kind_t = Longint;
Const
APSIS_PERICENTER = 0;
APSIS_APOCENTER = 1;
APSIS_INVALID = 2;
type
Pastro_apsis_t = ^astro_apsis_t;
astro_apsis_t = record
status : astro_status_t;
time : astro_time_t;
kind : astro_apsis_kind_t;
dist_au : double;
dist_km : double;
end;
Pastro_eclipse_kind_t = ^astro_eclipse_kind_t;
astro_eclipse_kind_t = Longint;
Const
ECLIPSE_NONE = 0;
ECLIPSE_PENUMBRAL = 1;
ECLIPSE_PARTIAL = 2;
ECLIPSE_ANNULAR = 3;
ECLIPSE_TOTAL = 4;
type
Pastro_lunar_eclipse_t = ^astro_lunar_eclipse_t;
astro_lunar_eclipse_t = record
status : astro_status_t;
kind : astro_eclipse_kind_t;
obscuration : double;
peak : astro_time_t;
sd_penum : double;
sd_partial : double;
sd_total : double;
end;
Pastro_global_solar_eclipse_t = ^astro_global_solar_eclipse_t;
astro_global_solar_eclipse_t = record
status : astro_status_t;
kind : astro_eclipse_kind_t;
obscuration : double;
peak : astro_time_t;
distance : double;
latitude : double;
longitude : double;
end;
Pastro_eclipse_event_t = ^astro_eclipse_event_t;
astro_eclipse_event_t = record
time : astro_time_t;
altitude : double;
end;
Pastro_local_solar_eclipse_t = ^astro_local_solar_eclipse_t;
astro_local_solar_eclipse_t = record
status : astro_status_t;
kind : astro_eclipse_kind_t;
obscuration : double;
partial_begin : astro_eclipse_event_t;
total_begin : astro_eclipse_event_t;
peak : astro_eclipse_event_t;
total_end : astro_eclipse_event_t;
partial_end : astro_eclipse_event_t;
end;
Pastro_transit_t = ^astro_transit_t;
astro_transit_t = record
status : astro_status_t;
start : astro_time_t;
peak : astro_time_t;
finish : astro_time_t;
separation : double;
end;
Pastro_aberration_t = ^astro_aberration_t;
astro_aberration_t = Longint;
Const
ABERRATION = 0;
NO_ABERRATION = 1;
type
Pastro_equator_date_t = ^astro_equator_date_t;
astro_equator_date_t = Longint;
Const
EQUATOR_J2000 = 0;
EQUATOR_OF_DATE = 1;
type
Pastro_direction_t = ^astro_direction_t;
astro_direction_t = Longint;
Const
DIRECTION_RISE = +(1);
DIRECTION_SET = -(1);
(* Const before type ignored *)
(* Const before type ignored *)
type
Pastro_constellation_t = ^astro_constellation_t;
astro_constellation_t = record
status : astro_status_t;
symbol : Pchar;
name : Pchar;
ra_1875 : double;
dec_1875 : double;
end;
Pastro_time_format_t = ^astro_time_format_t;
astro_time_format_t = Longint;
Const
TIME_FORMAT_DAY = 0;
TIME_FORMAT_MINUTE = 1;
TIME_FORMAT_SECOND = 2;
TIME_FORMAT_MILLI = 3;
type
Pastro_libration_t = ^astro_libration_t;
astro_libration_t = record
elat : double;
elon : double;
mlat : double;
mlon : double;
dist_km : double;
diam_deg : double;
end;
Pastro_axis_t = ^astro_axis_t;
astro_axis_t = record
status : astro_status_t;
ra : double;
dec : double;
spin : double;
north : astro_vector_t;
end;
const
TIME_TEXT_BYTES = 28;
type
Pastro_jupiter_moons_t = ^astro_jupiter_moons_t;
astro_jupiter_moons_t = record
io : astro_state_vector_t;
europa : astro_state_vector_t;
ganymede : astro_state_vector_t;
callisto : astro_state_vector_t;
end;
Pastro_node_kind_t = ^astro_node_kind_t;
astro_node_kind_t = Longint;
Const
INVALID_NODE = 0;
ASCENDING_NODE = +(1);
DESCENDING_NODE = -(1);
type
Pastro_node_event_t = ^astro_node_event_t;
astro_node_event_t = record
status : astro_status_t;
time : astro_time_t;
kind : astro_node_kind_t;
end;
{
astro_grav_sim_s = astro_grav_sim_t;
}
procedure Astronomy_Reset;cdecl;external;
function Astronomy_VectorLength(vector:astro_vector_t):double;cdecl;external;
function Astronomy_AngleBetween(a:astro_vector_t; b:astro_vector_t):astro_angle_result_t;cdecl;external;
function Astronomy_BodyName(body:astro_body_t):Pchar;cdecl;external;
function Astronomy_BodyCode(name:Pchar):astro_body_t;cdecl;external;
function Astronomy_MakeObserver(latitude:double; longitude:double; height:double):astro_observer_t;cdecl;external;
function Astronomy_CurrentTime:astro_time_t;cdecl;external;
function Astronomy_MakeTime(year:longint; month:longint; day:longint; hour:longint; minute:longint; second:double):astro_time_t;cdecl;external;
function Astronomy_TimeFromUtc(utc:astro_utc_t):astro_time_t;cdecl;external;
function Astronomy_UtcFromTime(time:astro_time_t):astro_utc_t;cdecl;external ;
function Astronomy_TimeFromDays(ut:double):astro_time_t;cdecl;external ;
function Astronomy_TerrestrialTime(tt:double):astro_time_t;cdecl;external ;
function Astronomy_AddDays(time:astro_time_t; days:double):astro_time_t;cdecl;external;
function Astronomy_SiderealTime(var time:astro_time_t):double;cdecl;external;
function Astronomy_HelioDistance(body:astro_body_t; time:astro_time_t):astro_func_result_t;cdecl;external;
function Astronomy_HelioVector(body:astro_body_t; time:astro_time_t):astro_vector_t;cdecl;external;
function Astronomy_GeoVector(body:astro_body_t; time:astro_time_t; aberration:astro_aberration_t):astro_vector_t;cdecl;external ;
function Astronomy_GeoMoon(time:astro_time_t):astro_vector_t;cdecl;external;
function Astronomy_EclipticGeoMoon(time:astro_time_t):astro_spherical_t;cdecl;external;
function Astronomy_GeoMoonState(time:astro_time_t):astro_state_vector_t;cdecl;external;
function Astronomy_GeoEmbState(time:astro_time_t):astro_state_vector_t;cdecl;external;
function Astronomy_Libration(time:astro_time_t):astro_libration_t;cdecl;external;
function Astronomy_BaryState(body:astro_body_t; time:astro_time_t):astro_state_vector_t;cdecl;external;
function Astronomy_HelioState(body:astro_body_t; time:astro_time_t):astro_state_vector_t;cdecl;external;
function Astronomy_MassProduct(body:astro_body_t):double;cdecl;external;
function Astronomy_PlanetOrbitalPeriod(body:astro_body_t):double;cdecl;external;
function Astronomy_LagrangePoint(point:longint; time:astro_time_t; major_body:astro_body_t; minor_body:astro_body_t):astro_state_vector_t;cdecl;external;
function Astronomy_LagrangePointFast(point:longint; major_state:astro_state_vector_t; major_mass:double; minor_state:astro_state_vector_t; minor_mass:double):astro_state_vector_t;cdecl;external ;
function Astronomy_JupiterMoons(time:astro_time_t):astro_jupiter_moons_t;cdecl;external;
function Astronomy_Equator(body:astro_body_t; var time:astro_time_t; observer:astro_observer_t; equdate:astro_equator_date_t; aberration:astro_aberration_t):astro_equatorial_t;cdecl;external;
function Astronomy_ObserverVector(var time:astro_time_t; observer:astro_observer_t; equdate:astro_equator_date_t):astro_vector_t;cdecl;external;
function Astronomy_ObserverState(var time:astro_time_t; observer:astro_observer_t; equdate:astro_equator_date_t):astro_state_vector_t;cdecl;external;
function Astronomy_VectorObserver(var vector:astro_vector_t; equdate:astro_equator_date_t):astro_observer_t;cdecl;external;
function Astronomy_ObserverGravity(latitude:double; height:double):double;cdecl;external;
function Astronomy_SunPosition(time:astro_time_t):astro_ecliptic_t;cdecl;external;
function Astronomy_Ecliptic(eqj:astro_vector_t):astro_ecliptic_t;cdecl;external;
function Astronomy_EclipticLongitude(body:astro_body_t; time:astro_time_t):astro_angle_result_t;cdecl;external;
function Astronomy_Horizon(var time:astro_time_t; observer:astro_observer_t; ra:double; dec:double; refraction:astro_refraction_t):astro_horizon_t;cdecl;external;
function Astronomy_AngleFromSun(body:astro_body_t; time:astro_time_t):astro_angle_result_t;cdecl;external;
function Astronomy_Elongation(body:astro_body_t; time:astro_time_t):astro_elongation_t;cdecl;external;
function Astronomy_SearchMaxElongation(body:astro_body_t; startTime:astro_time_t):astro_elongation_t;cdecl;external;
function Astronomy_PairLongitude(body1:astro_body_t; body2:astro_body_t; time:astro_time_t):astro_angle_result_t;cdecl;external;
function Astronomy_SearchRelativeLongitude(body:astro_body_t; targetRelLon:double; startTime:astro_time_t):astro_search_result_t;cdecl;external;
function Astronomy_MoonPhase(time:astro_time_t):astro_angle_result_t;cdecl;external;
function Astronomy_SearchMoonPhase(targetLon:double; startTime:astro_time_t; limitDays:double):astro_search_result_t;cdecl;external;
function Astronomy_SearchMoonQuarter(startTime:astro_time_t):astro_moon_quarter_t;cdecl;external;
function Astronomy_NextMoonQuarter(mq:astro_moon_quarter_t):astro_moon_quarter_t;cdecl;external ;
function Astronomy_SearchLunarEclipse(startTime:astro_time_t):astro_lunar_eclipse_t;cdecl;external;
function Astronomy_NextLunarEclipse(prevEclipseTime:astro_time_t):astro_lunar_eclipse_t;cdecl;external;
function Astronomy_SearchGlobalSolarEclipse(startTime:astro_time_t):astro_global_solar_eclipse_t;cdecl;external;
function Astronomy_NextGlobalSolarEclipse(prevEclipseTime:astro_time_t):astro_global_solar_eclipse_t;cdecl;external;
function Astronomy_SearchLocalSolarEclipse(startTime:astro_time_t; observer:astro_observer_t):astro_local_solar_eclipse_t;cdecl;external;
function Astronomy_NextLocalSolarEclipse(prevEclipseTime:astro_time_t; observer:astro_observer_t):astro_local_solar_eclipse_t;cdecl;external;
function Astronomy_SearchTransit(body:astro_body_t; startTime:astro_time_t):astro_transit_t;cdecl;external;
function Astronomy_NextTransit(body:astro_body_t; prevTransitTime:astro_time_t):astro_transit_t;cdecl;external;
function Astronomy_SearchMoonNode(startTime:astro_time_t):astro_node_event_t;cdecl;external;
function Astronomy_NextMoonNode(prevNode:astro_node_event_t):astro_node_event_t;cdecl;external;
function Astronomy_Search(func:astro_search_func_t; context:pointer; t1:astro_time_t; t2:astro_time_t; dt_tolerance_seconds:double):astro_search_result_t;cdecl;external;
function Astronomy_SearchSunLongitude(targetLon:double; startTime:astro_time_t; limitDays:double):astro_search_result_t;cdecl;external;
function Astronomy_SearchHourAngleEx(body:astro_body_t; observer:astro_observer_t; hourAngle:double; startTime:astro_time_t; direction:longint):astro_hour_angle_t;cdecl;external;
function Astronomy_HourAngle(body:astro_body_t; var time:astro_time_t; observer:astro_observer_t):astro_func_result_t;cdecl;external;
function Astronomy_SearchRiseSetEx(body:astro_body_t; observer:astro_observer_t; direction:astro_direction_t; startTime:astro_time_t; limitDays:double;
metersAboveGround:double):astro_search_result_t;cdecl;external ;
function Astronomy_SearchAltitude(body:astro_body_t; observer:astro_observer_t; direction:astro_direction_t; startTime:astro_time_t; limitDays:double;
altitude:double):astro_search_result_t;cdecl;external;
function Astronomy_Atmosphere(elevationMeters:double):astro_atmosphere_t;cdecl;external;
function Astronomy_RotationAxis(body:astro_body_t; var time:astro_time_t):astro_axis_t;cdecl;external;
function Astronomy_Seasons(year:longint):astro_seasons_t;cdecl;external;
function Astronomy_Illumination(body:astro_body_t; time:astro_time_t):astro_illum_t;cdecl;external;
function Astronomy_SearchPeakMagnitude(body:astro_body_t; startTime:astro_time_t):astro_illum_t;cdecl;external;
function Astronomy_SearchLunarApsis(startTime:astro_time_t):astro_apsis_t;cdecl;external;
function Astronomy_NextLunarApsis(apsis:astro_apsis_t):astro_apsis_t;cdecl;external;
function Astronomy_SearchPlanetApsis(body:astro_body_t; startTime:astro_time_t):astro_apsis_t;cdecl;external;
function Astronomy_NextPlanetApsis(body:astro_body_t; apsis:astro_apsis_t):astro_apsis_t;cdecl;external;
function Astronomy_IdentityMatrix:astro_rotation_t;cdecl;external;
function Astronomy_InverseRotation(rotation:astro_rotation_t):astro_rotation_t;cdecl;external;
function Astronomy_CombineRotation(a:astro_rotation_t; b:astro_rotation_t):astro_rotation_t;cdecl;external;
function Astronomy_Pivot(rotation:astro_rotation_t; axis:longint; angle:double):astro_rotation_t;cdecl;external;
function Astronomy_VectorFromSphere(sphere:astro_spherical_t; time:astro_time_t):astro_vector_t;cdecl;external;
function Astronomy_SphereFromVector(vector:astro_vector_t):astro_spherical_t;cdecl;external;
function Astronomy_EquatorFromVector(vector:astro_vector_t):astro_equatorial_t;cdecl;external;
function Astronomy_VectorFromHorizon(sphere:astro_spherical_t; time:astro_time_t; refraction:astro_refraction_t):astro_vector_t;cdecl;external;
function Astronomy_HorizonFromVector(vector:astro_vector_t; refraction:astro_refraction_t):astro_spherical_t;cdecl;external;
function Astronomy_RotateVector(rotation:astro_rotation_t; vector:astro_vector_t):astro_vector_t;cdecl;external;
function Astronomy_RotateState(rotation:astro_rotation_t; state:astro_state_vector_t):astro_state_vector_t;cdecl;external;
function Astronomy_Rotation_EQD_EQJ(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQD_ECL(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQD_ECT(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQD_HOR(var time:astro_time_t; observer:astro_observer_t):astro_rotation_t;cdecl;external ;
function Astronomy_Rotation_EQJ_EQD(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQJ_ECT(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQJ_ECL:astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQJ_HOR(var time:astro_time_t; observer:astro_observer_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_ECL_EQD(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_ECL_EQJ:astro_rotation_t;cdecl;external;
function Astronomy_Rotation_ECL_HOR(var time:astro_time_t; observer:astro_observer_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_ECT_EQJ(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_ECT_EQD(var time:astro_time_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_HOR_EQD(var time:astro_time_t; observer:astro_observer_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_HOR_EQJ(var time:astro_time_t; observer:astro_observer_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_HOR_ECL(var time:astro_time_t; observer:astro_observer_t):astro_rotation_t;cdecl;external;
function Astronomy_Rotation_EQJ_GAL:astro_rotation_t;cdecl;external;
function Astronomy_Rotation_GAL_EQJ:astro_rotation_t;cdecl;external;
function Astronomy_Refraction(refraction:astro_refraction_t; altitude:double):double;cdecl;external;
function Astronomy_InverseRefraction(refraction:astro_refraction_t; bent_altitude:double):double;cdecl;external;
function Astronomy_Constellation(ra:double; dec:double):astro_constellation_t;cdecl;external;
type
astro_position_func_t = function (context:pointer; time:astro_time_t):astro_vector_t;cdecl;
type
TCrepuscolo = (civildawn, civildusk, nauticaldawn, nauticaldusk, astronomicaldawn, astronomicaldusk);
type
TDatiLuna= record
distanzakm:integer;
diametrogradi:double;
end;
function Astronomy_CorrectLightTravel(context:pointer; func:astro_position_func_t; time:astro_time_t):astro_vector_t;cdecl;external;
function Astronomy_BackdatePosition(time:astro_time_t; observerBody:astro_body_t; targetBody:astro_body_t; aberration:astro_aberration_t):astro_vector_t;cdecl;external ;
function Astronomy_DefineStar(body:astro_body_t; ra:double; dec:double; distanceLightYears:double):astro_status_t;cdecl;external;
//funzioni personali non di astronomy.h
function AstroTimeToTDateTime(tempo:astro_time_t):TDateTime;
function FaseLunare(tempo:TDateTime):double;
function TDateTimeToAstroTime(data:TDateTime):astro_time_t;
function IlluminazioneLuna(FaseLunare:double):double;
function TrovaTramontoOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempoinizio:TDateTime; giornilimite:Double):TDateTime;
function TrovaSorgereOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempoinizio:TDateTime; giornilimite:Double):TDateTime;
function AltitudineOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempo:TDateTime):double;
//ancora incompleta continuare qua
function Crepuscolo(lat, long, altezza, giornilimite:double; tempoinizio:TDateTime; tipocrepuscolo:TCrepuscolo):TDateTime;
function DistanzaLuna(Tempo:TDateTime):TDatiLuna;
function DistanzaOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempo:TDateTime):double;
function Illuminazione(oggetto:astro_body_t;Tempo:TDateTime):astro_illum_t;
implementation
function Crepuscolo(lat, long, altezza, giornilimite:double; tempoinizio:TDateTime; tipocrepuscolo:TCrepuscolo):TDateTime; //tipocrepuscolo civildawn (alba), civildusk, nauticaldawn, nauticaldusk, astronomicaldawn, astronomicaldusk
var
Time:astro_time_t;
location:astro_observer_t;
TimeResult:astro_search_result_t;
direzione:astro_direction_t;
angolo:integer;
begin
Time:= TDateTimeToAstroTime(tempoinizio);
location.height:=altezza;
location.latitude:=lat;
location.longitude:=long;
case tipocrepuscolo of
civildawn, civildusk: angolo:=-6; //il crepuscolo civile ha angolo 6
nauticaldawn, nauticaldusk: angolo:=-12; //crepuscolo nautico
astronomicaldawn, astronomicaldusk: angolo:=-18 //crepuscolo astronomico
end;
case tipocrepuscolo of //decide in base al tipo di crepuscolo se bisogna calcolarlo all'alba o al tramonto
civildawn, nauticaldawn, astronomicaldawn: direzione:=DIRECTION_SET;
civildusk, nauticaldusk, astronomicaldusk: direzione:=DIRECTION_RISE;
end;
TimeResult:= Astronomy_SearchAltitude(BODY_SUN, location, direzione, Time, 1, angolo);
Crepuscolo:=AstroTimeToTDateTime(TimeResult.time);
end;
function TrovaTramontoOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempoinizio:TDateTime; giornilimite:Double):TDateTime;
var
Time:astro_time_t;
location:astro_observer_t;
TimeResult:astro_search_result_t;
begin
Time:= TDateTimeToAstroTime(LocalTimeToUniversal(tempoinizio));
location.height:=altezza;
location.latitude:=lat;
location.longitude:=long;
TimeResult:= Astronomy_SearchRiseSetEx(oggetto,location, DIRECTION_SET,Time, giornilimite, 0);
{ if TimeResult.status= ASTRO_SUCCESS then
TrovaTramontoOggetto:=(AstroTimeToTDateTime(TimeResult.time))
else raise Exception.Create('Set not found'); }
try
if TimeResult.status= ASTRO_SUCCESS then
TrovaTramontoOggetto:=(AstroTimeToTDateTime(TimeResult.time))
else raise Exception.Create('Set not Found');
except
on E: Exception do
begin
raise Exception.Create('Set not Found');
end;
end;
// else TrovaTramontoOggetto:=UniversalTimeToLocal(tempoinizio);
end;
function TrovaSorgereOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempoinizio:TDateTime; giornilimite:Double):TDateTime;
var
Time:astro_time_t;
location:astro_observer_t;
TimeResult:astro_search_result_t;
begin
Time:= TDateTimeToAstroTime(LocalTimeToUniversal(tempoinizio));
location.height:=altezza;
location.latitude:=lat;
location.longitude:=long;
TimeResult:= Astronomy_SearchRiseSetEx(oggetto,location, DIRECTION_RISE,Time, giornilimite, 0);
//TrovaSorgereOggetto:=AstroTimeToTDateTime(TimeResult.time);
try
if TimeResult.status= ASTRO_SUCCESS then
TrovaSorgereOggetto:=(AstroTimeToTDateTime(TimeResult.time))
else raise Exception.Create('Rise not Found');
except
on E: Exception do
begin
raise Exception.Create('Rise not Found');
end;
end;
{
if TimeResult.status= ASTRO_SUCCESS then
TrovaSorgereOggetto:=(AstroTimeToTDateTime(TimeResult.time))
else {TrovaSorgereOggetto:=tempoinizio; } raise Exception.Create('Rise not Found'); }
end;
function AltitudineOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempo:TDateTime):double;
var
Time:astro_time_t;
location:astro_observer_t;
TimeResult:astro_search_result_t;
CEquatoriali:astro_equatorial_t;
CAltzimutali:astro_horizon_t;
begin
Time:= TDateTimeToAstroTime(tempo);
location.height:=altezza;
location.latitude:=lat;
location.longitude:=long;
CEquatoriali:=Astronomy_Equator(oggetto, Time, location, EQUATOR_OF_DATE, NO_ABERRATION);
CAltzimutali:=Astronomy_Horizon(Time, location, CEquatoriali.ra, CEquatoriali.dec, NO_ABERRATION );
result:=CAltzimutali.altitude;
end;
function DistanzaOggetto(oggetto:astro_body_t; lat:double; long:double; altezza: double; tempo:TDateTime):double;
var
Time:astro_time_t;
location:astro_observer_t;
TimeResult:astro_search_result_t;
CEquatoriali:astro_equatorial_t;
begin
Time:= TDateTimeToAstroTime(tempo);
location.height:=altezza;
location.latitude:=lat;
location.longitude:=long;
CEquatoriali:=Astronomy_Equator(oggetto, Time, location, EQUATOR_OF_DATE, NO_ABERRATION);
result:= CEquatoriali.dist;
end;
function AstroTimeToTDateTime(tempo:astro_time_t):TDateTime;
var
risultato:astro_utc_t;
begin
risultato:= Astronomy_UtcFromTime(tempo);
try
AstroTimeToTDateTime:=UniversalTimeToLocal(EncodeDateTime(risultato.year, risultato.month, risultato.day, risultato.hour, risultato.minute, trunc(risultato.second), 0));
except
on E:Exception do Exception.Create('Conversion Error');
end;
end;
function TDateTimeToAstroTime(data:TDateTime):astro_time_t;
begin
TDateTimeToAstroTime:=Astronomy_MakeTime(YearOf(data), MonthOf(data), DayOf(data), HourOf(data), MinuteOf(data), SecondOf(data))
end;
function FaseLunare(tempo:TDateTime):double;
var
angolo:astro_angle_result_t;
begin
angolo:= Astronomy_MoonPhase(TDateTimeToAstroTime(tempo));
FaseLunare:=angolo.angle;
end;
function IlluminazioneLuna(FaseLunare:double):double;
begin
if FaseLunare<=180 then IlluminazioneLuna:=(FaseLunare/1.8);
if FaseLunare>180 then IlluminazioneLuna:=(360-FaseLunare)/1.8;
end;
function DistanzaLuna(Tempo:TDateTime):TDatiLuna;
var
librazione:astro_libration_t;
begin
librazione:=Astronomy_Libration(TDateTimeToAstroTime(Tempo));
DistanzaLuna.distanzakm:=round(librazione.dist_km); //questa distanza corrisponde alla distanza centro centro luna terra ed è usata dalla nasa come distanza
DistanzaLuna.diametrogradi:=librazione.diam_deg;
end;
function Illuminazione(oggetto:astro_body_t;Tempo:TDateTime):astro_illum_t;
var
Time:astro_time_t;
begin
Time:= TDateTimeToAstroTime(Tempo);
result:=Astronomy_Illumination(oggetto, Time);
end;
end.