#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define STR_LENGTH 256
#define FILE_HITS "hits.bin"
#define ALPHA_MIN  -0.5*M_PI

typedef FILE*   pfile;
typedef struct  _hit {double x,y;} hit;
typedef hit* phit;

int get_int_from_kbd(char* msg)
 {char s[STR_LENGTH];
  printf("%s",msg); 
  scanf("%s",s);
  return atoi(s);
 }

int main(void)
 {pfile  f;
  int n_h,n_r,i;
  phit hits;
  double alpha,m,step,final_alpha,d,d_min=0.0,alpha_min=ALPHA_MIN;

  if ((f=fopen(FILE_HITS,"rb"))==NULL) goto file_err;
  fread(&n_h,sizeof(int),1,f);
  if ((hits=(phit)malloc(sizeof(hit)*n_h))==NULL) goto mem_err;
  fread(hits,sizeof(hit),n_h,f);
  fclose(f);

  if ((n_r=get_int_from_kbd("Numero di rette: "))<=0) goto dati_err;
  for(d_min=0.0,i=0;i<n_h;i++) d_min+=fabs(hits[i].x); /*Caso particolare per la retta x=0*/
  for(step=M_PI/n_r,alpha=ALPHA_MIN+step,final_alpha=-ALPHA_MIN;alpha<final_alpha;alpha+=step)
   {for(d=0,0,i=0,m=tan(alpha);i<n_h;i++) d+=fabs(m*hits[i].x-hits[i].y)/sqrt(m*m+1);
    if (d<d_min) {d_min=d; alpha_min=alpha;}
   }
  
  printf("La retta migliore e':        ");
  if (alpha_min==ALPHA_MIN) printf("x=0");
  else                      printf("y=%lfx",tan(alpha_min));
  printf("\nLa distanza media e' pari a: %lf\n",d_min/n_h);
  free(hits);
  return EXIT_SUCCESS;

  file_err: printf("Errore di apertura fil\n");  return EXIT_FAILURE;
  mem_err:  printf("Memoria insufficient\n");    return EXIT_FAILURE;
  dati_err: printf("Dati immessi non validi\n"); return EXIT_FAILURE;
 }
