// Compile with: gcc OffsetKML.c -Wall -Werror -lm -o OffsetKML #include #include #include struct offset_s { double from_x; double from_y; double to_x; double to_y; double offset_x; double offset_y; }; struct offset_s offsets[100]; int nr_offsets = 0; double dist(double dx, double dy) { return sqrt(dx*dx + dy*dy); } int main(int argc, char *argv[]) { FILE *f = fopen("diffs.kml", "r"); if (f == NULL) { printf("Failed to open diffs.kml\n"); return 1; } char buffer[4000]; while (fgets(buffer, 3999, f)) { //printf("Read: %s", buffer); if (strstr(buffer, "") != 0) { //printf("%s", buffer); for (;;) { fgets(buffer, 3999, f); if (strstr(buffer, "") != 0) break; double z; sscanf(buffer, "%lf,%lf,%lf %lf,%lf,0", &offsets[nr_offsets].from_x, &offsets[nr_offsets].from_y, &z, &offsets[nr_offsets].to_x, &offsets[nr_offsets].to_y); offsets[nr_offsets].offset_x = offsets[nr_offsets].to_x - offsets[nr_offsets].from_x; offsets[nr_offsets].offset_y = offsets[nr_offsets].to_y - offsets[nr_offsets].from_y; fprintf(stderr, "Offset %lf,%lf\n", offsets[nr_offsets].offset_x, offsets[nr_offsets].offset_y); nr_offsets++; } } //printf("%s", buffer); } fclose(f); fprintf(stderr, "nr offsets: %d\n", nr_offsets); while (fgets(buffer, 3999, stdin)) { if (strstr(buffer, "") != 0) { printf("%s", buffer); for (;;) { fgets(buffer, 3999, stdin); if (strstr(buffer, "") != 0) break; double x, y; sscanf(buffer, "%lf,%lf", &x, &y); double offset_x = 0; double offset_y = 0; double weight = 0; for (int i = 0; i < nr_offsets; i++) { double d = dist(offsets[i].from_x - x, offsets[i].from_y - y); if (d < 0.00000001) d = 0.00000001; double rev_d = 1/d; offset_x += rev_d * offsets[i].offset_x; offset_y += rev_d * offsets[i].offset_y; weight += rev_d; } printf(" %lf,%lf,0\n", x + offset_x / weight, y + offset_y / weight); } } printf("%s", buffer); } return 0; }