#include #include #include #define REARTH 6137 #define N 10000 #define DTHETA .1 int main() { float x[N]; char filename[255] = ""; char pfilename[255] = ""; FILE *fp; /* acquisisce il nome del file in input: il cancelletto all'inizio permettera' a gnuplot di ignorare questa riga di testo */ do { printf("# Nome del file di dati: "); scanf("%s", filename); fp = fopen(filename, "rb"); /* se il puntatore e' nullo il file non e' stato trovato (o comunque non e' stato possibile aprirlo */ if (fp == NULL) { printf("# file non trovato\n"); } } while (fp == NULL); /* apre il file in input e ne legge l'intero contenuto */ fp = fopen(filename, "rb"); /* fread restituisce il numero di oggetti letti di lunghezza pari al suo secondo parametro. In questo caso ci aspettiamo di leggere n float. Indichiamo a fread di leggerne al massimo N. Il numero di float letti corrisponde al doppio del numero di oggetti orbitanti, percio' dividiamo per due */ int nMax = fread(x, sizeof(float), N, fp) / 2; fclose(fp); /* troviamo l'indice del punto che separa il nome dall'estensione */ int i = 0; while (filename[i++] != '.') {} /* terminiamo la stringa al carattere che segue */ filename[i] = 0; /* aggiungiamo l'estensione gplt */ sprintf(pfilename, "%sgplt", filename); /* troviamo il primo indice dell'array x che contiene una coordinata y non nulla */ i = -1; while (x[2*++i + 1] == 0) {} float dTheta = DTHETA; /* comandi gnuplot da usare una sola volta */ printf("set xrange [-8e3:8e3]\nset yrange [-8e3:8e3]\nset nokey\nset size square\n" "set parametric\n"); /* loop infinito */ while (1) { /* apro il file con i dati per gnuplot */ fp = fopen(pfilename, "w"); for (i = 0; i < nMax; i++) { /* per ognuno dei corpi orbitanti, ne scrivo le coordinate e le aggiorno */ float xc = x[2*i]; float yc = x[2*i+1]; xc += -yc*dTheta; yc += xc*dTheta; x[2*i] = xc; x[2*i+1] = yc; fprintf(fp, "%f %f\n", xc, yc); } fclose(fp); /* scrivo sullo schermo il comando gnuplot per visualizzare i dati contenuti nel file */ // printf("set xrange [-8e3:8e3]\nset yrange [-8e3:8e3]\nset nokey\nset size square\n" // "set parametric\nplot %d*cos(t),%d*sin(t), '%s'\n", // REARTH, REARTH, pfilename); printf("plot %d*cos(t),%d*sin(t), '%s'\n", REARTH, REARTH, pfilename); /* impongo lo svuotamento del buffer */ fflush(NULL); /* ritardo di 0.1 s */ usleep(100000); } }