johnf@apollo.COM (John Francis) (09/29/88)
Since a lot of people have indicated that they would like a program that reorganises map data, I include the program that I used to do this. It is written for an Apollo, and the scaling is set for a 1280 x 1024 display, but the main grouping code (under conditional GROUP) should run on any machine. #define BOUND 0 #define GRAPH 0 #define GROUP 1 #define WRITE 1 #include <stdio.h> #if GRAPH #include <math.h> #include <apollo/base.h> #include <apollo/gpr.h> #include <apollo/time.h> #endif #if BOUND static struct { float xmin,xmax,ymin,ymax; } lbounds, tbounds; #endif #if GROUP static struct { float x,y; short int partner; short int padding; } vector[12600][2], *point; #endif main() { FILE *chan,*dump; float x, y; int n, m, count; int inner,outer; short int link1,link2; long int links = 0; int segnum,seglen; #if GRAPH status_$t status; gpr_$coordinate_t ix, iy; gpr_$bitmap_desc_t bitmap; gpr_$offset_t xysize; time_$clock_t delay; #endif #if BOUND lbounds.xmin = 5000.0; lbounds.xmax = -5000.0; lbounds.ymin = 5000.0; lbounds.xmax = -5000.0; tbounds.xmin = 5000.0; tbounds.xmax = -5000.0; tbounds.ymin = 5000.0; tbounds.xmax = -5000.0; #endif chan = fopen("usa.dat","r"); #if WRITE dump = fopen("usa.dmp","wb"); #endif #if GRAPH xysize.x_size = 0x500; xysize.y_size = 0x400; gpr_$init(gpr_$borrow,1,xysize,7,&bitmap,&status); gpr_$set_draw_value(2,&status); #endif for (count = 0 ; ; count++) for (n = 0, m = 0; n < 2; n++) { fscanf(chan,"%f%f",&x,&y); if (feof(chan)) goto done; if (x == 0.0) { long int cv; char buffer[80]; if ((cv = y) == 0) goto done; #if GRAPH if (cv > 0) gpr_$set_draw_value((gpr_$pixel_value_t) cv,&status); #endif fgets(&buffer[0],80,chan); fscanf(chan,"%f%f",&x,&y); } #if WRITE fwrite(&x,sizeof(float),1,dump); fwrite(&y,sizeof(float),1,dump); #endif #if GROUP vector[count][n].x = x; vector[count][n].y = y; vector[count][n].partner = -1; #endif #if BOUND if (lbounds.xmin > x) lbounds.xmin = x; if (lbounds.xmax < x) lbounds.xmax = x; if (lbounds.ymin > y) lbounds.ymin = y; if (lbounds.ymax < y) lbounds.ymax = y; #endif #if GRAPH x *= 3.1415927/180.0; y *= 3.1415927/180.0; x = (1.95548 + x)*cos(y); y = (0.84890 - y); if (tbounds.xmin > x) tbounds.xmin = x; if (tbounds.xmax < x) tbounds.xmax = x; if (tbounds.ymin > y) tbounds.ymin = y; if (tbounds.ymax < y) tbounds.ymax = y; ix = 640 + 1000.0*x; iy = 512 + 1000.0*y; if (n == m) { if (n == 0) gpr_$move(ix,iy,&status); else gpr_$line(ix,iy,&status); m++; } #endif } done: fclose(chan); #if WRITE fclose(dump); #endif #if BOUND printf("%5d vectors, spread = %8.3f %8.3f\nBounds = %8.3f %8.3f %8.3f %8.3f\n", count,lbounds.xmax-lbounds.xmin,lbounds.ymax-lbounds.ymin, lbounds.xmin,lbounds.xmax,lbounds.ymin,lbounds.ymax); #if GRAPH printf(" %8.5f %8.5f %8.5f %8.5f\n", tbounds.xmin,tbounds.xmax,tbounds.ymin,tbounds.ymax); #endif #endif #if GROUP #if GRAPH gpr_$terminate(0,&status); #endif point = &vector[0][0]; for (outer = 1; outer < (count << 1); outer++) for (inner = 0; inner < (outer & -2); inner++) if ( (point[inner].partner < 0) && (point[inner].x == point[outer].x) && (point[inner].y == point[outer].y) ) { point[inner].partner = outer; point[outer].partner = inner; if ( (++links % 250) == 0 ) printf("%5d: Outer = %5d, Inner = %5d\n",links,outer,inner); inner = outer; } chan = fopen("usa.new","w"); segnum = 0; for (outer = 0; outer < 2*count; outer++) if ( point[outer].partner == ((short int) -1) ) { seglen = 0; link1 = outer; while ( link1 >= 0 ) { seglen++; link2 = link1 ^ 1; fprintf(chan,"%8.3f%7.3f%10.3f%7.3f\n",point[link1].x,point[link1].y,point[link2].x,point[link2].y); point[link1].partner = 0x8000; link1 = point[link2].partner; point[link2].partner = 0x8000; } printf("Segment %3d(O), length %5d\n",++segnum,seglen); fprintf(chan,"\n"); } for (outer = 0; outer < 2*count; outer++) if ( point[outer].partner >= 0 ) { seglen = 0; link2 = point[link1 = outer].partner; point[link1].partner = 0x8000; point[link2].partner = 0x8000; while ( link1 >= 0 ) { seglen++; link2 = link1 ^ 1; fprintf(chan,"%8.3f%7.3f%10.3f%7.3f\n",point[link1].x,point[link1].y,point[link2].x,point[link2].y); point[link1].partner = 0x8000; link1 = point[link2].partner; point[link2].partner = 0x8000; } printf("Segment %3d(C), length %5d\n",++segnum,seglen); fprintf(chan,"\n"); } fclose(chan); #endif #if GRAPH #if GROUP #else delay.high16 = 5; delay.low32 = 1; while (1) time_$wait(time_$relative,delay,&status); #endif #endif }