mirror of
https://github.com/cosinekitty/astronomy.git
synced 2026-02-04 20:52:02 -05:00
This is the Python version of a demo to convert galactic coordinates to horizontal coordinates for a given time and geographic location.
163 lines
4.7 KiB
C
163 lines
4.7 KiB
C
/*
|
|
galactic.c - Don Cross - 2021-06-10
|
|
|
|
Example C program for Astronomy Engine:
|
|
https://github.com/cosinekitty/astronomy
|
|
|
|
This program illustrates how to convert a location
|
|
in the sky expressed in IAU 1958 galactic coordinates
|
|
into the local altitude and azimuth of someone wanting
|
|
to aim a radio dish at it.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include "astro_demo_common.h"
|
|
|
|
|
|
int GalaticToHorizontal(
|
|
astro_time_t time,
|
|
astro_observer_t observer,
|
|
double glat,
|
|
double glon,
|
|
double *altitude,
|
|
double *azimuth)
|
|
{
|
|
astro_rotation_t rot, adjust_rot;
|
|
astro_spherical_t gsphere, hsphere;
|
|
astro_vector_t gvec, hvec;
|
|
|
|
/*
|
|
Calculate a rotation matrix that converts
|
|
galactic coordinates to J2000 equatorial coordinates.
|
|
*/
|
|
rot = Astronomy_Rotation_GAL_EQJ();
|
|
|
|
/*
|
|
Adjust the rotation matrix to convert galatic to horizontal (HOR).
|
|
*/
|
|
adjust_rot = Astronomy_Rotation_EQJ_HOR(time, observer);
|
|
rot = Astronomy_CombineRotation(rot, adjust_rot);
|
|
|
|
/*
|
|
Convert the galactic coordinates from angles to a unit vector.
|
|
*/
|
|
gsphere.status = ASTRO_SUCCESS;
|
|
gsphere.lat = glat;
|
|
gsphere.lon = glon;
|
|
gsphere.dist = 1.0;
|
|
gvec = Astronomy_VectorFromSphere(gsphere, time);
|
|
if (gvec.status != ASTRO_SUCCESS)
|
|
{
|
|
fprintf(stderr, "Astronomy_VectorFromSphere returned error %d\n", gvec.status);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
Use the rotation matrix to convert the galactic vector to a horizontal vector.
|
|
*/
|
|
hvec = Astronomy_RotateVector(rot, gvec);
|
|
if (hvec.status != ASTRO_SUCCESS)
|
|
{
|
|
fprintf(stderr, "Astronomy_RotateVector returned error %d\n", hvec.status);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
Convert the horizontal vector back to angular coordinates: altitude and azimuth.
|
|
Assuming this is a radio source (not optical), do not correct for refraction.
|
|
*/
|
|
hsphere = Astronomy_HorizonFromVector(hvec, REFRACTION_NONE);
|
|
if (hsphere.status != ASTRO_SUCCESS)
|
|
{
|
|
fprintf(stderr, "Astronomy_HorizonFromVector returned error %d\n", hsphere.status);
|
|
return 1;
|
|
}
|
|
|
|
*altitude = hsphere.lat;
|
|
*azimuth = hsphere.lon;
|
|
return 0;
|
|
}
|
|
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
astro_observer_t observer;
|
|
astro_time_t time;
|
|
double glat, glon;
|
|
double azimuth, altitude;
|
|
|
|
if (argc < 5 || argc > 6)
|
|
{
|
|
fprintf(stderr,
|
|
"\n"
|
|
"USAGE: galactic olat olon glat glon [yyyy-mm-ddThh:mm:ssZ]\n"
|
|
"\n"
|
|
"where\n"
|
|
"\n"
|
|
" olat = observer's latitude on the Earth\n"
|
|
" olon = observer's longitude on the Earth\n"
|
|
" glat = IAU 1958 galatic latitude of the target\n"
|
|
" glon = IAU 1958 galatic longitude of the target\n"
|
|
" yyyy-mm-ddThh:mm:ssZ = optional UTC date/time\n"
|
|
"\n"
|
|
"Given the galactic coordinates of a point source in the sky,\n"
|
|
"this program calculates horizontal aiming coordinates for an\n"
|
|
"observer on or near the Earth's surface.\n"
|
|
"\n"
|
|
"If the date/time is given on the command line, it is used.\n"
|
|
"Otherwise, the computer's current date/time is used.\n"
|
|
"\n"
|
|
);
|
|
return 1;
|
|
}
|
|
|
|
observer.height = 0.0;
|
|
|
|
if (1 != sscanf(argv[1], "%lf", &observer.latitude) ||
|
|
observer.latitude < -90.0 ||
|
|
observer.latitude > +90.0)
|
|
{
|
|
fprintf(stderr, "ERROR: Invalid observer latitude '%s' on command line\n", argv[1]);
|
|
return 1;
|
|
}
|
|
|
|
if (1 != sscanf(argv[2], "%lf", &observer.longitude) ||
|
|
observer.longitude < -180.0 ||
|
|
observer.longitude > +180.0)
|
|
{
|
|
fprintf(stderr, "ERROR: Invalid observer longitude '%s' on command line\n", argv[2]);
|
|
return 1;
|
|
}
|
|
|
|
if (1 != sscanf(argv[3], "%lf", &glat) || glat < -90.0 || glat > +90.0)
|
|
{
|
|
fprintf(stderr, "ERROR: Invalid galatic latitude '%s' on command line\n", argv[3]);
|
|
return 1;
|
|
}
|
|
|
|
if (1 != sscanf(argv[4], "%lf", &glon) || glon <= -360.0 || glon >= +360.0)
|
|
{
|
|
fprintf(stderr, "ERROR: Invalid galatic longitude '%s' on command line\n", argv[3]);
|
|
return 1;
|
|
}
|
|
|
|
if (argc > 5)
|
|
{
|
|
/* Time is present on command line, so use it. */
|
|
if (ParseTime(argv[5], &time))
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
/* Time is absent on command line, so use current time. */
|
|
time = Astronomy_CurrentTime();
|
|
}
|
|
|
|
if (GalaticToHorizontal(time, observer, glat, glon, &altitude, &azimuth))
|
|
return 1;
|
|
|
|
printf("altitude = %10.3lf, azimuth = %10.3lf\n", altitude, azimuth);
|
|
return 0;
|
|
}
|