#include #include #include #define REARTH 6137 #define N 10000 #define DTHETA .1 int getData(char *fname, float data[], int n); void getOutputFile(char infile[], char outfile[]); void dump(char * outfile, float x[], int n, float dTheta); 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 */ int nMax = -1; do { printf("# Nome del file di dati: "); scanf("%s", filename); nMax = getData(filename, x, N); } while (nMax <= 0); /* costruisce il nome del file per gnuplot */ getOutputFile(filename, pfilename); /* 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) { dump(pfilename, x, nMax, DTHETA); /* 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); } } int getData(char *filename, float x[], int n) { int nMax = -1; FILE *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"); } else { /* 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 */ nMax = fread(x, sizeof(float), n, fp) / 2; fclose(fp); } return nMax; } void getOutputFile(char infile[], char outfile[]) { /* troviamo l'indice del punto che separa il nome dall'estensione */ int i = 0; while (infile[i] != '.') { outfile[i] = infile[i]; i++; } /* terminiamo la stringa al carattere che segue */ outfile[i] = 0; } void dump(char * outfile, float x[], int n, float dTheta) { int i; /* apro il file con i dati per gnuplot */ FILE *fp = fopen(outfile, "w"); for (i = 0; i < n; 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); }