Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define FILE_IN "hits1.bin"
- #define STRLEN 256
- #define ALPHA_MIN -0.5*M_PI // alpha va da -pigreco mezzi (incluso) a pigreco mezzi (escluso)
- typedef FILE* pfile;
- typedef struct _hit
- {
- double x;
- double y;
- }hit;
- typedef hit* phit;
- int get_int_from_file(pfile pf)
- {
- int n_h;
- fread(&n_h, sizeof(int), 1, pf);
- return n_h;
- }
- hit get_double_from_file(phit ph, int n_h, pfile pf)
- {
- int i;
- fread(ph, sizeof(hit), n_h, pf);
- return ph[i];
- }
- int main(void)
- {
- pfile pf;
- phit ph;
- int n_h, n_r, i, j;
- char s[STRLEN];
- double alpha, d, dmin=0.0, alphamin=ALPHA_MIN, dmed, m;
- pf=fopen(FILE_IN, "rb");
- if(pf==NULL)
- {
- printf("errore di lettura file\n");
- return EXIT_FAILURE;
- }
- n_h=get_int_from_file(pf);
- //printf("il numero di hits è %d\n", n_h);
- ph=(phit)malloc(sizeof(hit)*n_h); //perchè ci sono coppie di dati (di dim hit) quindi 8 dati per 4 punti in questo file
- if(ph==NULL)
- {
- printf("errore di memoria\n");
- return EXIT_FAILURE;
- }
- ph[i]=get_double_from_file(ph, n_h, pf);//acquisisco su array i punti
- /*for(i=0; i<n_h; i++)
- {
- printf("i dati sono: %f, %f\n", ph[i].x, ph[i].y);
- }*/
- fclose(pf);
- printf("Ciao, sono il programma che fa il best fit dei tuoi dati, dammi il numero nr (intero!) di rette con le quali approssimare i dat\n");
- scanf("%s", s);
- n_r=atoi(s); //si potrebbe fare un controllo per essere sicuri che sia un intero
- if(n_r<=0) return EXIT_FAILURE;
- //printf("Il numero di rette che mi hai richiesto è %d\n", n_r);
- //generiamo i valori di alpha dentro un intervallo
- for(i=0; i<n_r; i++) //usiamo l'indice i per le rette
- {
- alpha=(-(double)(n_r/2)/n_r)+((double)i)/(n_r); //è la formuletta che proviene dall'esempio del compito per n_r=8 che si hanno 8 valori di alpha
- alpha*=M_PI; //questo per imporre che il numero sia moltiplicato per pigreco mezzi
- //printf("alpha è: %f\n", alpha);
- for(j=0, dmed=0.0; j<n_h; j++)//usiamo l'indice j per i punti: facciamo la distanza punto retta per la retta i-esima e per i j punti
- {
- m=tan(alpha);
- d=abs((m*ph[j].x)-ph[j].y)/sqrt((m*m)+1);//distanza punto retta
- dmed+=d;
- if(d<dmin)
- {
- dmin=dmed;//nel caso in cui siamo in presenza della retta migliore ci serve la distanza media dei punti
- alphamin=alpha;
- }
- }
- }
- free(ph);
- printf("La retta migliore e': ");
- if(alphamin==ALPHA_MIN)
- printf("x=0\n");
- else printf("y=%fx\n", alphamin);
- printf("La distanza media dalla retta e' %f", dmin/n_h);
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement