]> pd.if.org Git - isea/blob - t/cities.c
Initial checkin.
[isea] / t / cities.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4 #include <string.h>
5
6 #include "isea.h"
7 #include "hex.h"
8
9 void die(char *s) {
10         fprintf(stderr, "%s\n", s);
11         exit(EXIT_FAILURE);
12 }
13
14 static int verbose = 0;
15 static int precision = 10;
16
17 int
18 main(int ac, char *av[])
19 {
20         struct isea_dgg dgg;
21         struct isea_geo in;
22         struct isea_pt  out, coord;
23         int             tri,calctri;
24         int             graticule = 0;
25         int     quad = 0;
26
27         char            line[1024];
28         char           *rest, *nl;
29
30         isea_grid_init(&dgg);
31         dgg.output = ISEA_PLANE;
32         dgg.radius = 0.8301572857837594396028083;
33
34         options(ac, av, &dgg);
35
36         if (0) {
37                 printf("isea lat = %lf, lon = %lf, az = %lf\n",
38                        dgg.o_lat * 180.0 / M_PI, dgg.o_lon * 180.0 / M_PI,
39                        dgg.o_az * 180.0 / M_PI);
40         }
41
42         while (fgets(line, sizeof line, stdin)) {
43                 if (line[0] == '#') {
44                         continue;
45                 }
46                 if (!strncmp(line, "ENDPOLY", 7)) {
47                         printf("%s", line);
48                         continue;
49                 }
50                 in.lon = strtod(line, &rest);
51                 in.lat = strtod(rest, &rest);
52
53                 nl = strchr(rest, '\n');
54                 if (nl) *nl = 0;
55
56                 in.lon *= M_PI / 180.0;
57                 in.lat *= M_PI / 180.0;
58
59                 out = isea_forward(&dgg, &in);
60                 tri = dgg.triangle;
61                 quad = ((tri - 1) % 5) + ((tri - 1) / 10) * 5 + 1;
62                 coord = out;
63
64                 if (dgg.output == ISEA_PLANE) {
65                         calctri = isea_xy_triangle(&coord,
66                                 dgg.output == ISEA_PLANE ? dgg.radius : 1.0);
67                         if (tri != calctri) {
68                                 fprintf(stderr,
69                                         "got %d (%f, %f), expected %d\n",
70                                         calctri, out.x, out.y, tri);
71                         }
72                 }
73
74                 in.lon *= 180.0 / M_PI;
75                 in.lat *= 180.0 / M_PI;
76
77                 switch (dgg.output) {
78                 case ISEA_PLANE:
79                         printf("%d %.*f %.*f%s\n", tri, precision, out.x, precision, out.y, rest);
80                         break;
81                 case ISEA_PROJTRI:
82                         printf("%d %.*f %.*f%s\n", tri-1, precision, out.x,
83                                precision, out.y, rest);
84                         break;
85                 case ISEA_VERTEX2DD:
86                         printf("%d %d %.*f %.*f%s\n", quad, tri-1, precision,
87                                         out.x, precision, out.y, rest);
88                         break;
89                 case ISEA_Q2DD:
90                         /* Same as above, we just don't print as much */
91                         printf("%d %.*f %.*f%s\n", quad, precision,
92                                         out.x, precision, out.y, rest);
93                         break;
94                 case ISEA_Q2DI:
95                         printf("%d %.0lf %.0lf%s\n", dgg.quad, coord.x, coord.y, rest);
96                         break;
97                 case ISEA_SEQNUM:
98                         quad = isea_ptdi(&dgg, tri, &out, &coord);
99                         printf("%d%s\n", isea_disn(&dgg, quad, &coord), rest);
100                         break;
101                 }
102                 fflush(stdout);
103         }
104
105         if (graticule) {
106                 
107         }
108
109         exit(EXIT_SUCCESS);
110 }