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

#define STRL     256
#define NOMEFILE "cerchi.txt"
#define NP       1000000

typedef struct _cerchio {float xc,yc,r;} cerchio;
typedef cerchio*                         pcerchio;
typedef FILE*                            pfile;

int get_int_from_file(pfile f)
 {char s[STRL]; 
  fscanf(f,"%s",s);
  return atoi(s);
 }

float get_float_from_file(pfile f)
 {char s[STRL]; 
  fscanf(f,"%s",s);
  return atof(s);
 }
 
int dentrocerchio(float x, float y, float xc,float yc,float r)
 {float dx,dy;
  dx=x-xc; dy=y-yc;
  return (dx*dx+dy*dy)<(r*r);
 }
 
float fabsmax(float a,float b) {a=fabs(a); b=fabs(b); return (a>b)?a:b;}

int main(void)
 {unsigned nc,i,j,nht;
  pfile    f;
  pcerchio pc,pc2;
  float    d,x,y,r,ymin,xmin,xmax,ymax,xb=0,yb=0;
  
  srand(time(NULL));
  
  xmax=ymax=-(xmin=ymin=FLT_MAX);
  
  if ((f=fopen(NOMEFILE,"r"))==NULL) goto file_err;
  nc=get_int_from_file(f);
  
  if ((pc=(pcerchio)malloc(sizeof(cerchio)*nc))==NULL) goto no_mem;
  
  for(i=0,pc2=pc;i<nc;i++,pc2++)
   {xb+=pc2->xc=x=get_float_from_file(f);
    yb+=pc2->yc=y=get_float_from_file(f);
        pc2->r =r=get_float_from_file(f);

    if (xmin>(x-r)) xmin=x-r;
    if (xmax<(x+r)) xmax=x+r;
    if (ymin>(y-r)) ymin=y-r;
    if (ymax<(y+r)) ymax=y+r;
   }
  
  printf("(xminr,yminr)=(%.3f,%.3f) (xmaxr,ymaxr)=(%.3f,%.3f)\n",xmin,ymin,xmax,ymax);
  printf("Baricentro=(%.3f,%.3f)\n",xb/=nc,yb/=nc);
  r=fabsmax(fabsmax(xmin-xb,xmax-xb),fabsmax(ymin-yb,ymax-yb));
  printf("(xminq,yminq)(%.3f,%.3f) (xmaxq,ymaxq)=(%.3f,%.3f)\n",xmin=xb-r,ymin=yb-r,xmax=xb+r,ymax=yb+r);
  printf("Raggio cercho inscritto=%.3f\n",r);
  
  for(nht=i=0,d=2*r;i<NP;i++)
   {x=(((float)rand())/RAND_MAX)*d+xmin;
    y=(((float)rand())/RAND_MAX)*d+ymin;
    if (dentrocerchio(x,y,xb,yb,r))
     {for(j=0,pc2=pc;j<nc;j++,pc2++)
       if (dentrocerchio(x,y,pc2->xc,pc2->yc,pc2->r)) break;     
      if (j<nc) nht++;
     }
   }
   
  printf("Area=%.3f\n",(4.0*r*r*nht)/NP);
  return EXIT_SUCCESS;
  
  file_err: printf("Errore file\n");           return EXIT_FAILURE;
  no_mem:   printf("Memoria insufficiente\n"); return EXIT_FAILURE; 
  
 }
