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

#define STR_LENGTH 256
#define FILE_CIRCLE "circle.txt"
#define FILE_POINTS "arcs.bin"
#define NP          1000000

typedef FILE*   pfile;
typedef struct  _arc {float x0,y0,x1,y1;} arc;
typedef arc* parc;

float get_float_from_file(pfile f)
 {char s[STR_LENGTH]; 
  fscanf(f,"%s",s);
  return atof(s);
 }

int main(void)
 {pfile  f;
  float cx,cy,cr,m,q,x,y,v;
  int na,ia,ip,dentro;
  parc pa;

  if ((f=fopen(FILE_CIRCLE,"r"))==NULL) goto file_err;
  cx=get_float_from_file(f);cy=get_float_from_file(f);cr=get_float_from_file(f);
  fclose(f);

  if ((f=fopen(FILE_POINTS,"rb"))==NULL) goto file_err;
  fread(&na,sizeof(int),1,f);
  if ((pa=(parc)malloc(sizeof(arc)*na))==NULL) goto mem_err;
  fread(pa,sizeof(arc),na,f);
  fclose(f);

  for(ia=0;ia<na;ia++)
   {m=(pa[ia].y1-pa[ia].y0)/(pa[ia].x1-pa[ia].x0);
    q=pa[ia].y0-m*pa[ia].x0;
    v=m*cx+q-cy;
    for(dentro=ip=0;ip<NP;ip++)
     {x=(2.0*rand()/RAND_MAX-1.0)*cr+cx;
      y=(2.0*rand()/RAND_MAX-1.0)*cr+cy;
      if (((x-cx)*(x-cx)+(y-cy)*(y-cy)<cr*cr)&&((m*x+q-y)*v<0.0)) dentro++;
     }
    printf("L'area del segmento circolare n.%d e' pari a %f\n",ia+1,4*cr*cr*dentro/NP);
   }

  free(pa);
  return EXIT_SUCCESS;

  file_err: printf("Errore di apertura fil\n");  return EXIT_FAILURE;
  mem_err:  printf("Memoria insufficient\n");    return EXIT_FAILURE;
 }
