Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <float.h>
- #define FILE_PUNTI "hits.bin"
- #define FILE_RETTE "rette.bin"
- #define CONST 2.829
- typedef struct _dot
- {
- int x,y;
- }dot;
- typedef struct _retta
- {
- float a,b,c;
- }retta;
- typedef float* pfloat;
- typedef dot* pdot;
- typedef retta* pretta;
- typedef FILE* pfile;
- int main (void)
- {
- int i, j, n_r,n_d,n1=0,n2=0;
- dot d;
- float min1=FLT_MAX,min2=FLT_MAX;
- pfloat p_dist;
- pretta p_r;
- pfile pf;
- /*Immagino che i punti siano troppi per essere acquisiti con un fread tutti in una volta*/
- /*Apro file rette, acquisisco numero rette, faccio malloc per contenere le retta, le acquisisco e chiudo il file*/
- if((pf=fopen(FILE_RETTE,"rb"))==NULL) goto fopen_err;
- if((fread(&n_r,sizeof(int),1,pf))!=1) goto fread_err;
- if((p_r=(pretta)malloc(sizeof(retta)*n_r))==NULL) goto mem_err;
- if((fread(p_r,sizeof(retta),n_r,pf))!=n_r) goto fread_err;
- fclose(pf);
- /*
- for(i=0;i<n_r;i++)
- {
- printf("La retta %d e': (%f)x+(%f)y+(%f)=0\n",(i+1),p_r[i].a,p_r[i].b,p_r[i].c);
- }
- */
- /*Apro file punti, acquisisco il numero di punti*/
- if((pf=fopen(FILE_PUNTI,"rb"))==NULL) goto fopen_err;
- if((fread(&n_d,sizeof(int),1,pf))!=1) goto fread_err;
- /*Faccio malloc per contenere le distanze rette-punti*/
- if((p_dist=(pfloat)malloc(sizeof(float)*n_r))==NULL) goto mem_err;
- /*Inizializzo vettore distanze a zero*/
- for(i=0;i<n_r;i++)
- p_dist[i]=0;
- printf("Ti stampero' le rette la cui distanza media dai punti sia < %f\n",CONST);
- /*Ciclo grosso per leggere i punti uno alla volta, ciclo piccolo (che scorre fra le rette) per calcolare le distanze fra punto appena acquisito e le varie rette, metto le varie distanze nell'array p_dist sommandoci sopra, chiudo file rette*/
- for(i=0;i<n_d;i++)
- {
- if((fread(&d,sizeof(dot),1,pf))!=1) goto fread_err; //AVEVAMO SCRITTO (fread(&d,sizeof(int),1,pf))!=1)
- for (j=0;j<n_r;j++)
- {
- p_dist[j]+=fabs((p_r[j].a*d.x)+(p_r[j].b*d.y)+(p_r[j].c))/(sqrt((p_r[j].a)*(p_r[j].a)+(p_r[j].b)*(p_r[j].b)));
- }
- }
- fclose(pf);
- /*Ciclo per calcolare distanza media retta-punti che metto sempre in p_dist, con un if controllo p_dist<soglia in tal caso stampo retta e distanza, dentro cerco primo e secondo minimo*/
- for(i=0;i<n_r;i++)
- {
- p_dist[i]/=n_d;
- if (p_dist[i]<CONST)
- {
- printf("La retta %d:(%f)x+(%f)y+(%f)=0 ha distanza %f\n",(i+1),p_r[i].a,p_r[i].b,p_r[i].c,p_dist[i]);
- if (p_dist[i]<min1)
- {
- min2=min1;
- n2=n1;
- min1=p_dist[i];
- n1=i;
- }
- else
- if(p_dist[i]<min2)
- {
- min2=p_dist[i];
- n2=i;
- }
- }
- }
- printf ("La retta che meglio approssima i nostri dati e' %d\nseguita dalla %d\n",n1+1,n2+1);
- free(p_r);
- free(p_dist);
- return EXIT_SUCCESS;
- fopen_err: printf("C'e' un problema nell'apertura del file.\n"); return EXIT_FAILURE;
- fread_err: printf("Il numero acquisito non coincide con quello inserito.\n"); return EXIT_FAILURE;
- mem_err: printf("Non c'e' abbastanza spazio in memoria.\n"); return EXIT_FAILURE;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement