#include <stdio.h> #include <stdlib.h> #include <math.h> #include <assert.h> #include <stdbool.h> #include "common.h" /* distance : calcule la distance approchée entre deux villes à partir de leurs coordonnées géogrphiques */ float dist(node n, node m) { return 107 * sqrt(pow(n.x-m.x,2) + pow(n.y-m.y,2)); } node* lireFichier(const char* filename, int* n) { FILE* f = fopen(filename, "r"); if (f != NULL) { if (fscanf(f, "%d\n", n) == 1){ node* villes = malloc(*n * sizeof(node)); for (int i = 0; i < *n; i += 1) { node v; if (fscanf(f, "%s %d %f %f\n", v.nom, &v.hab, &v.x, &v.y) == 4) { villes[i] = v; } else { exit(0); // erreur de lecture return NULL; } } fclose(f); return villes; } } exit(0); // erreur de lecture return NULL; } edge* creerAretes(node* villes, int nv, int* na){ *na = (nv * (nv - 1)) / 2; edge* aretes = (edge*) malloc(*na * sizeof(edge)); assert(aretes != NULL); int c = 0; for (int i = 0; i < nv; i += 1){ for (int j = i + 1; j < nv; j += 1){ aretes[c].i = i; aretes[c].j = j; aretes[c].d = dist(villes[i], villes[j]); aretes[c].selected = false; c += 1; } } return aretes; } void exporter(const char* filename, edge* aretes, int na, node* villes, int nv){ FILE* f = fopen(filename, "w"); fprintf(f,"{\"type\": \"FeatureCollection\",\"features\": [\n"); bool first = true; for (int i = 0; i < na; i += 1) { edge e = aretes[i]; if (e.selected) { if (!first) { fprintf(f, ","); } fprintf(f, "{\"type\": \"Feature\", \"geometry\": {\"type\": \"LineString\","); fprintf(f, "\"coordinates\": [[%f, %f], [%f, %f]]}}\n", villes[e.i].x, villes[e.i].y, villes[e.j].x, villes[e.j].y); first = false; } } fprintf(f,"]}"); fclose(f); }