#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include"sortq1.h"
#include"creadrpt.h"
#include"initgraf.h"
long st=0;//aria totala
//*****************functii main****************************
short apart(int,int *,int);
//verifica daca o coordonata a fost luata in calcul pt sortare
pcts cit_t(void);//citeste datele din fisier
short into(pct,pct,int,int,int,int);
//verifica daca o hasura se afla in unul din dreptunghiuri
long area(int,int,int,int);//calculeza aria unui dreptunghi
long common_area(pcts);
//calculeaza si marcheaza aria comuna a dreptunghiurilor
//*********************************************************
void main(void)
{
  char c;
  long s;
  pcts dr;
  clrscr();
  printf("actualizare:breakspace/non: enter");
  c=getch();
  printf("\n");
  if(c==32)
      crea();
    else
     {
     dr=cit_t();
     qs(dr.x,0,dr.nx-1);
     qs(dr.y,0,dr.ny-1);
     s=common_area(dr);
     getch();
     closegraph();
     printf("\nscomm=%8ld,stot=%8ld",s,st);
     getch();
     free(dr.x);
     free(dr.y);
     free(dr.u);
     free(dr.d);
     }
 }
short apart(int w,int *q,int h)
 {
  int i,bl=0;
  for(i=0;i<h;i++)
         if(w==q[i])bl=1;
  return bl;
 }
pcts cit_t(void)
{
   int i;
   FILE *f;
   pcts dr;
   pct up;
   char s[13];
   short bool,bool1,j1,j2,j;
   printf("nume fisier sursa:");
   scanf("%s",&s);
   if((f=fopen(s,"rb"))==NULL)
       printf("nu pot sa deschid sau nu exista");
   fread(&up,sizeof(pct),1,f);
   n1=up.x;
   dr.x=(int *)malloc(2*n1*sizeof(int));
   dr.y=(int *)malloc(2*n1*sizeof(int));
   dr.u=(pct *)malloc(n1*sizeof(pct));
   dr.d=(pct *)malloc(n1*sizeof(pct));
   for(i=0,j1=j2=0;(i<n1)&&(!feof(f));i++)
     {
     fread(&dr.d[i],sizeof(pct),1,f);
     fread(&dr.u[i],sizeof(pct),1,f);
     st+=area(dr.d[i].x,dr.d[i].y,dr.u[i].x,dr.u[i].y);
     if(!apart(dr.d[i].x,dr.x,j1)) dr.x[j1++]=dr.d[i].x;
     if(!apart(dr.u[i].x,dr.x,j1)) dr.x[j1++]=dr.u[i].x;
     if(!apart(dr.d[i].y,dr.y,j2)) dr.y[j2++]=dr.d[i].y;
     if(!apart(dr.u[i].y,dr.y,j2)) dr.y[j2++]=dr.u[i].y;
     }
   dr.nx=j1;dr.ny=j2;
   constr(dr);//******************************************
   if(fclose(f))
          printf("disk error");
   return dr;
}
short into(pct u,pct d,int xd,int yd,int xu,int yu)
  {
   short bool=0;
   if((d.x<=xd)&&(xu<=u.x)&&(d.y<=yd)&&(yu<=u.y))bool=1;
  return bool;
  }
long area(int xd,int yd,int xu,int yu)
 {
  long a;
   a=(xu-xd)*(yu-yd);
  return a;
 }
long common_area(pcts dr)
{
 long s=0;
 int i,j,k;int *poli;
 short bl=0;
 setfillstyle(6,3);
 for(i=0;i<dr.ny-1;i++)
    for(j=0;j<dr.nx-1;j++)
     {
     bl=0;
     for(k=0;(k<n1)&&(!bl);k++)
           bl=into(dr.u[k],dr.d[k],dr.x[j],dr.y[i],dr.x[j+1],dr.y[i+1]);
      if(bl)
        {
          s+=area(dr.x[j],dr.y[i],dr.x[j+1],dr.y[i+1]);
          poli=trans(dr.x[j],dr.y[i],dr.x[j+1],dr.y[i+1],0);
          fillpoly(4,poli);
          free(poli);
         }
      }
 return s;
}
