#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DIRECTORY "./filetxt/cerchi.txt"
#define N_MAX_PUNTI 1000000
#define STRLEN 1024

#define MIN(A,B) (((A)<(B))?(A):(B)) /*MAI METTERE PUNTI E VIRGOLA QUA!!! STUNATUUUU!!!!!!*/
#define MAX(A,B) (((A)>(B))?(A):(B))
#define ABS(A) (((A)<0)?(-A):(A))

typedef struct _cerchio
  {
    float x_c;
    float y_c;
    float raggio;
  } cerchio;

typedef struct _copoia
  {
    float x;
    float y;
  } coppia;

typedef cerchio* pcerchio;
typedef FILE* pfile;

float fmaxs(float a, float b)
  {
    return (a>b)?a:b;
  }

float fmins(float a, float b)
  {
    return (a<b)?a:b;
  }

float randminmax(float min, float max)
  {
    return ((((float)rand())/RAND_MAX)*(max-min))+min;
  }

int main(void)
  {
    unsigned numero_cerchi,i,n_hit,check,i_mc;
    pcerchio parray,p,pmax;
    coppia dot,sinistra,destra;
    pfile pf;
    float x_max,x_min,y_max,y_min,x_gn,y_gn,x_g,y_g,raggio,rq1,rq2,a,b,c,d;
    char s[STRLEN];

    if((pf=fopen(DIRECTORY,"r"))==NULL) goto err_file;
    fscanf(pf,"%s",s);
    numero_cerchi=atoi(s);

    if((parray=(pcerchio)malloc(sizeof(cerchio)*numero_cerchi))==NULL) goto err_mem;

    for (i=0,x_gn=y_gn=0;i<numero_cerchi;i++)
      {
        fscanf(pf,"%s",s);
        x_gn+=(parray[i].x_c=atof(s));
        fscanf(pf,"%s",s);
        y_gn+=(parray[i].y_c=atof(s));
        fscanf(pf,"%s",s);
        parray[i].raggio=atof(s);

        if (i>0)
          {
            x_min=fmins(x_min,(parray[i].x_c - parray[i].raggio));
            x_max=fmaxs(x_max,(parray[i].x_c + parray[i].raggio));
            y_min=fmins(y_min,(parray[i].y_c - parray[i].raggio));
            y_max=fmaxs(y_max,(parray[i].y_c + parray[i].raggio));
          }

        else
          {
            x_min=parray[i].x_c - parray[i].raggio;
            x_max=parray[i].x_c + parray[i].raggio;
            y_min=parray[i].y_c - parray[i].raggio; 
            y_max=parray[i].y_c + parray[i].raggio;
          }
      }
    fclose(pf);

    x_g=x_gn/numero_cerchi;
    y_g=y_gn/numero_cerchi;
    /*max1=MAX(abs(x_max - x_g),abs(x_min - x_g));
    max2=MAX(abs(y_max - y_g),abs(y_min - y_g));*/


    
    raggio=fmaxs(fmaxs(ABS(x_max - x_g),ABS(x_min - x_g)),fmaxs(ABS(y_max - y_g),ABS(y_min - y_g)));

    printf("baricentro: (%.3f, %.3f)\nxmin=%.3f\nxmax=%.3f\nymin=%.3f\nymax=%.3f\nraggio quadrato (R)=%.3f\n",x_g,y_g,x_min,x_max,y_min,y_max,raggio);
    
    sinistra.x=x_g - raggio;
    sinistra.y=y_g - raggio;
    destra.x=x_g + raggio;
    destra.y=y_g + raggio;
    rq=raggio*raggio;

    for(i_mc=0;i_mc<N_MAX_PUNTI;i_mc++)
      {
        dot.x=randminmax(sinistra.x,destra.x)-x_g;
        dot.y=randminmax(sinistra.y,destra.y)-y_g;
        if (((dot.x)*(dot.x))+((dot.y)*(dot.y))<rq1)
          {
            i=0;
            check=1;
            p=parray;
            pmax=p+numero_cerchi;
            
            do
              {
                a=dot.x-p->x_c;
                b=dot.y-p->y_c;
                rq2=(p->raggio)*(p->raggio);
                if (((dot.x-p->x_c)*(dot.x-p->x_c)+(dot.y-p->y_c)*(dot.y-p->y_c))<rq2)
                  {
                    n_hit++;
                    check=0;
                  }
                p++;
              }
            while ((p<pmax)&&(check));
          } 
      }



    free(parray);

    return 0;
    err_file:
        return 1;
    err_mem:
      return 1;
  }