[hamradio-commits] [gcb] 01/02: Imported Upstream version 1.07
Iain Learmonth
irl-guest at moszumanska.debian.org
Wed Aug 12 17:29:34 UTC 2015
This is an automated email from the git hooks/post-receive script.
irl-guest pushed a commit to branch master
in repository gcb.
commit 0b86d666d7dbb11872a53519c0a0daa235984bfd
Author: Iain R. Learmonth <irl at fsfe.org>
Date: Wed Aug 12 18:22:29 2015 +0100
Imported Upstream version 1.07
---
README | 12 +++
gc.c | 271 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 283 insertions(+)
diff --git a/README b/README
new file mode 100644
index 0000000..8b8f917
--- /dev/null
+++ b/README
@@ -0,0 +1,12 @@
+I used this program a lot to give me a quick and dirty
+bearing and range to a location. It is command-line
+oriented, and very easy to remember syntax.
+
+This version builds on the last version by incorporating
+the information in the ARRL Satellite Experimenters Handbook.
+Particularly the short path, long path, and antipodal data.
+
+If you have any questions, feel free to email me any time.
+
+Steve Sampson, N5OWK
+ssampson at oklahoma.net
diff --git a/gc.c b/gc.c
new file mode 100644
index 0000000..ebc2560
--- /dev/null
+++ b/gc.c
@@ -0,0 +1,271 @@
+/*
+ * gc.c
+ *
+ * Great Circle. This program is used to determine bearing
+ * and range to two stations given latitude and longitude.
+ *
+ * Ver 1.07 By S. R. Sampson, N5OWK
+ * Public Domain (p) June 1993
+ *
+ * Ref: "Air Navigation", Air Force Manual 51-40, 1 February 1987
+ * Ref: "ARRL Satellite Experimenters Handbook", August 1990
+ *
+ * Usage examples:
+ *
+ * gc n 35.19n97.27w 0s0e (Moore to Prime/Equator)
+ * gc n 35.19N97.27W 38.51n77.02W (Moore to Washington D.C., mixed case)
+ * gc n 33.56n118.24w 55.45n37.35e (L.A. to Moscow)
+ * gc n 35N70W 35N71W (No decimal points used, all uppercase)
+ *
+ * Modified the program to incorporate short and long path information
+ * from the Satellite Handbook. This version also takes into consideration
+ * the two points being close enough to be in the near-field, and the
+ * antipodal points, which are easily calculated. These last points were
+ * made in discussions with John Allison who makes the nice MAPIT program.
+ *
+ * Compile GNU C with: cc -O gc.c -o gc -lm
+ */
+
+/* Includes */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+/* Defines */
+
+#define RADIAN (180.0 / M_PI)
+
+/* Globals */
+
+struct {
+ double miles; /* arc length for 1 degree, various units of measure */
+ char *text;
+} Units[] = {
+ { 60.0, "Nautical Miles"},
+ { 111.2, "kilometers"},
+ { 69.1, "Statute Miles"}
+};
+
+/* Simple Declare, No Prototypes */
+
+/*
+ * Error routine
+ */
+
+void err(type)
+int type;
+{
+ switch(type) {
+ case 1:
+ printf("\007Latitude Out of Range (90N to 90S)\n");
+ break;
+ case 2:
+ printf("\007Longitude Out of Range (180W to 180E)\n");
+ break;
+ case 3:
+ printf("\007Minutes Out of Range (0 to 59)\n");
+ }
+
+ exit(-1);
+}
+
+/*
+ * Convert Degrees and Minutes to Decimal
+ */
+
+double dm2dec(n)
+double n;
+{
+ double t;
+
+ t = (int)n;
+ n -= t;
+ n /= .60;
+
+ if (n >= 1.0)
+ err(3);
+
+ return (n + t);
+}
+
+/*
+ * Parse the input line
+ *
+ * dd(.mm)[NnSs]ddd(.mm)[EeWw]
+ */
+
+void parse(s, lat, lon)
+char *s;
+double *lat, *lon;
+{
+ register char *i, *t, *e;
+
+ e = s + strlen(s);
+ for (i = s; i < e; ++i) {
+ switch (*i) {
+ case 'n':
+ case 'N':
+ *i = '\0';
+ t = i + 1;
+ *lat = atof(s);
+ break;
+ case 's':
+ case 'S':
+ *i = '\0';
+ t = i + 1;
+ *lat = -atof(s);
+ break;
+ case 'e':
+ case 'E':
+ *i = '\0';
+ *lon = -atof(t);
+ break;
+ case 'w':
+ case 'W':
+ *i = '\0';
+ *lon = atof(t);
+ }
+ }
+
+ *lat = dm2dec(*lat);
+ *lon = dm2dec(*lon);
+
+ if (*lat > 90.0 || *lat < -90.0)
+ err(1);
+
+ if (*lon > 180.0 || *lon < -180.0)
+ err(2);
+
+ /* Prevent ACOS() Domain Error */
+
+ if (*lat == 90.0)
+ *lat = 89.9;
+
+ if (*lat == -90.0)
+ *lat = -89.9;
+}
+
+void main(argc, argv)
+int argc;
+char **argv;
+{
+ double tmp, arc, cosaz, az, azsp, azlp, distsp, distlp;
+ double QTH_Lat, QTH_Long, DEST_Lat, DEST_Long, Delta_Long;
+ int units;
+
+ if (argc != 4) {
+ fprintf(stderr, "\nUsage: gc units station1 station2\n\n" \
+ "This program computes Great Circle Bearing and Range\n" \
+ "given the latitude and longitude (degrees and minutes).\n\n" \
+ "You must input the lat/long of the two stations.\n" \
+ "The output will then be relative from station1 to station2.\n\n" \
+ "Input the two station lat/longs using the following format:\n\n" \
+ "\tdd.mmHddd.mmG lead/lagging zeros can be left out.\n\n" \
+ "d = Degrees, m = Minutes, H = Hemisphere (N or S), " \
+ "G = Greenwich (W or E)\n\n" \
+ "units is 'n' for Nautical, 'k' for kilometers, and 's' for " \
+ "Statute.\n\n");
+
+ exit(1);
+ }
+
+ /* Process the command line data */
+
+ switch (argv[1][0]) {
+ case 'k':
+ case 'K':
+ units = 1;
+ break;
+ case 's':
+ case 'S':
+ units = 2;
+ break;
+ case 'n':
+ case 'N':
+ default:
+ units = 0;
+ }
+
+ parse(argv[2], &QTH_Lat, &QTH_Long);
+ parse(argv[3], &DEST_Lat, &DEST_Long);
+
+ QTH_Lat /= RADIAN; /* Convert variables to Radians */
+ QTH_Long /= RADIAN;
+ DEST_Lat /= RADIAN;
+ DEST_Long /= RADIAN;
+
+ Delta_Long = DEST_Long - QTH_Long;
+
+ tmp = (sin(QTH_Lat) * sin(DEST_Lat)) +
+ (cos(QTH_Lat) * cos(DEST_Lat) * cos(Delta_Long));
+
+ if (tmp > .999999) {
+ printf("Station points coincide, use an Omni!\n\n");
+ exit(0);
+ } else if (tmp < -.999999) {
+ /*
+ * points are antipodal, he's straight down.
+ * So take 180 Degrees of arc times 60 nm,
+ * and you get 10800 nm, or whatever units...
+ */
+
+ printf("Station is equal distance in all Azimuths " \
+ "(antipodal)\n%.0f %s\n\n",
+ (Units[units].miles) * 180.0,
+ Units[units].text);
+
+ exit(0);
+ } else {
+ arc = acos(tmp);
+
+ /*
+ * One degree of arc is 60 Nautical miles
+ * at the surface of the earth, 111.2 km, or 69.1 sm
+ * This method is easier than the one in the handbook
+ */
+
+ /* Short Path */
+
+ distsp = (Units[units].miles) * (arc * RADIAN);
+
+ /* Long Path */
+
+ distlp = ((Units[units].miles) * 360.0) - distsp;
+
+ }
+
+ cosaz = (sin(DEST_Lat) - (sin(QTH_Lat) * cos(arc))) /
+ (sin(arc) * cos(QTH_Lat));
+
+ if (cosaz > .999999)
+ az = 0.0;
+ else if (cosaz < -.999999)
+ az = 180.0;
+ else
+ az = acos(cosaz) * RADIAN;
+
+ /*
+ * Handbook had the test ">= 0.0" which looks backwards??
+ */
+
+ if (sin(Delta_Long) < 0.0) {
+ azsp = az;
+ azlp = 180.0 + az;
+ } else {
+ azsp = 360.0 - az;
+ azlp = 180.0 - az;
+ }
+
+ /* Computations complete, show answer */
+
+ printf("Short Path Bearing is %03.0f Degrees for %.0f %s\n",
+ azsp, distsp, Units[units].text);
+
+ printf(" Long Path Bearing is %03.0f Degrees for %.0f %s\n",
+ azlp, distlp, Units[units].text);
+
+ exit(0);
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/gcb.git
More information about the pkg-hamradio-commits
mailing list