8fc #include #include #include #include "mapview.h" #include "mapgen.h" static POINT *pts; static int npts = 0; static int penup = TRUE; static EXTMAP *map; static MAPREC *recs, *prevrec; static void addrec(MGSEGDICT *sd) { MAPREC *rec = (MAPREC *)malloc(sizeof(MAPREC)); rec->pts = (POINT *)malloc(npts * sizeof(POINT)); rec->npts = npts; rec->minlat = sd->minlat; rec->maxlat = sd->maxlat; rec->minlon = sd->minlon; rec->maxlon = sd->maxlon; rec->next = NULL; memcpy(rec->pts, pts, npts * sizeof(POINT)); if (! recs) recs = rec; if (prevrec) prevrec->next = rec; prevrec = rec; } static void pendn(double lon, double lat, MGSEGDICT *sd) { double xm, ym; if (penup) { if (npts) addrec(sd); sd->minlat = 1000000.; sd->maxlat = -1000000.; sd->minlon = 1000000.; sd->maxlon = -1000000.; npts = 0; penup = FALSE; return; } if (lat < sd->minlat) sd->minlat = lat; if (lat > sd->maxlat) sd->maxlat = lat; if (lon < sd->minlon) sd->minlon = lon; if (lon > sd->maxlon) sd->maxlon = lon; if (fortrans[PROJECT](lon * D2R, lat * D2R, &xm, &ym)) exit(1); pts[npts].xm = (float)xm; pts[npts].ym = (float)ym; if (++npts == MAXPOINTS) { addrec(sd); sd->minlat = 1000000.; sd->maxlat = -1000000.; sd->minlon = 1000000.; sd->maxlon = -1000000.; npts = 0; } } EXTMAP *loadmapgen(char *name, unsigned long color, int width) { FILE *f; char s[80]; MGSEGDICT sd; double lastlon = 0.; double lon, lat; if (! (f = fopen(name, "r"))) { perror("fopen"); exit(1); } pts = (POINT *)malloc(MAXPOINTS * sizeof(POINT)); recs = prevrec = NULL; while (fgets(s, 80, f)) { if (*s == '*') continue; if (*s == '#') { penup = TRUE; pendn(lon, lat, &sd); continue; } sscanf(s, "%lf %lf", &lon, &lat); if (fabs(lastlon - lon) > 180.) penup = TRUE; pendn(lon, lat, &sd); lastlon = lon; } if (npts) addrec(&sd); free(pts); map = (EXTMAP *)malloc(sizeof(MAP)); map->color = color; map->width = width; map->recs = recs; map->next = NULL; return map; } . 0