#include <stdio.h>
#include <stdlib.h>
#define MAX 25
typedef enum {FALSE,TRUE}boolean;
typedef struct coord
{
float x[2];
float y[2];
struct coord *prox;
}punto;
FILE *pfile;
float appoggiox[MAX],appoggioy[MAX];
void ordina_vett(float* vettorex,float* vettorey,int numpt,punto **pttesta);
void inserisci_coord(punto **pttesta,int *numpt);
void carica_in_vett(punto **pttesta,int numpt,float *vettorex, float *vettorey);
float calcola_area(float* vettorex,float* vettorey,int numpt);
int main()
{
int numeropt,indice;
punto *punt_testa;
float *vettx, *vetty;
float area;
punt_testa=NULL;
inserisci_coord(&punt_testa,&numeropt);
vettx=(float*)malloc((numeropt)*(sizeof(float)));
vetty=(float*)malloc((numeropt)*(sizeof(float)));
carica_in_vett(&punt_testa,numeropt,vettx,vetty);
for(indice=0;indice<(numeropt);indice++)
{
printf("%f\n",vettx[indice]);
printf("%f\n",vetty[indice]);
}
ordina_vett(vettx,vetty,numeropt,&punt_testa);
for(indice=0;indice<(numeropt);indice++)
{
printf("%f\n",vettx[indice]);
printf("%f\n",vetty[indice]);
}
area=calcola_area(vettx,vetty,numeropt);
printf("L'area totale è %f\n",area);
}
void inserisci_coord(punto**ptesta,int *numpt)
{
char nomefile[MAX];
punto *paux;
float x1,y1,x2,y2;
int indice;
indice=0;
printf("inserisci il nome file\n");
scanf("%s",nomefile,"r");
if((pfile=fopen(nomefile,"r"))!=NULL)
while(fscanf(pfile,"%f%f%f%f",&x1,&y1,&x2,&y2)!=EOF)
{
paux=(punto*)malloc(sizeof(punto));
(*paux).x[0]=x1;
(*paux).x[1]=x2;
(*paux).y[0]=y1;
(*paux).y[1]=y2;
(*paux).prox=*ptesta;
*ptesta=paux;
indice++;
}
fclose(pfile);
*numpt=indice-1;
return;
}
void carica_in_vett(punto**pttesta,int numpt,float*vettorex,float *vettorey)
{
punto* ptcorr;
int indice;
ptcorr= *pttesta;
for(indice=0;indice<(numpt);indice++)
{
vettorex[indice]=(*ptcorr).x[0];
vettorey[indice]=(*ptcorr).y[0];
vettorex[indice+1]=(*ptcorr).x[1];
vettorey[indice+1]=(*ptcorr).y[1];
ptcorr=(*ptcorr).prox;
}
return;
}
float calcola_area(float *vettorex,float* vettorey,int numpt)
{
int indice;
float base,altezza,arearett,area;
area=arearett=0.0;
for(indice=0;indice<(numpt);indice++)
{
if(vettorex[indice]<vettorex[indice+1])
base=vettorex[indice+1]-vettorex[indice];
else
base=vettorex[indice]-vettorex[indice];
if(vettorey[indice]>vettorey[indice+1])
altezza =vettorey[indice]-vettorey[indice+1];
else
altezza=vettorey[indice+1]-vettorey[indice];
area=base*altezza;
arearett=arearett+area;
}
return(arearett);
}
void ordina_vett(float* vettorex,float* vettorey,int numpt,punto **ptesta)
{
int indice,ind;
boolean ordinato1,ordinato2;
punto *ptcorr;
float provv;
ptcorr=*ptesta;
for(indice=0;indice<numpt;indice++)
{
appoggiox[indice]=vettorex[indice];
appoggioy[indice]=vettorey[indice];
}
ordinato1=ordinato2=FALSE;
while(!ordinato1)
{
ordinato1=TRUE;
for(indice=0;indice<(numpt);indice++)
{
if( appoggiox[indice]>appoggiox[indice+1])
{
provv=appoggiox[indice];
appoggiox[indice]=appoggiox[indice+1];
appoggiox[indice+1]=provv;
ordinato1=FALSE;
}
}
}
while(!ordinato2)
{
ordinato2=TRUE;
for(indice=0;indice<(numpt);indice++)
{
if(appoggioy[indice]> appoggioy[indice+1])
{provv=appoggioy[indice];
appoggioy[indice]=appoggioy[indice+1];
appoggioy[indice+1]=provv;
ordinato2=FALSE;
}}
}
ind=1;
for(indice=0;indice<(numpt);indice++)
{
while(ptcorr!=NULL)
{
if(((*ptcorr).x[0]<appoggiox[indice])&&((*ptcorr).x[1]>appoggiox[indice+1])
&&((*ptcorr).y[0]<appoggioy[indice])&&((*ptcorr).y[1]>appoggioy[indice+1]))
{
vettorex[indice]=(*ptcorr).x[0];
vettorex[indice+ind]=(*ptcorr).x[1];
vettorey[indice]=(*ptcorr).y[0];
vettorey[indice+ind]=(*ptcorr).y[1];
ind++;
}
else
ptcorr=(*ptcorr).prox;
}
}
return;
}