Pagini recente » Cod sursa (job #1524553) | Cod sursa (job #3188832) | Cod sursa (job #260906) | Cod sursa (job #274514) | Cod sursa (job #72887)
Cod sursa(job #72887)
#include<stdio.h>
#include<math.h>
#define Nmax 2005
#define eps .000001
int N,X[Nmax],Y[Nmax],N1,N2;
double X1[Nmax],Y1[Nmax],X2[Nmax],Y2[Nmax];
double ang[Nmax];
int main()
{
FILE *fin=fopen("camera.in","r"),
*fout=fopen("camera.out","w");
int i,j,k,Xmin=100000,Xmax=-100000,Ymin=100000,Ymax=-100000;
double aux;
fscanf(fin,"%d",&N);
for(i=1;i<=N;i++)
fscanf(fin,"%d%d",&X[i],&Y[i]);
/*
for(i=1;i<=N/2;i++)
{
X[i]^=X[N-i+1], X[N-i+1]^=X[i], X[i]^=X[N-i+1];
Y[i]^=Y[N-i+1], Y[N-i+1]^=Y[i], Y[i]^=Y[N-i+1];
}
*/
//solve
for(i=1;i<=N;i++)
{
if(X[i] < Xmin) Xmin=X[i];
if(X[i] > Xmax) Xmax=X[i];
if(Y[i] < Ymin) Ymin=Y[i];
if(Y[i] > Ymax) Ymax=Y[i];
}
//init
N1=4;
X1[1]=(double)Xmin; Y1[1]=(double)Ymax;
X1[2]=(double)Xmin; Y1[2]=(double)Ymin;
X1[3]=(double)Xmax; Y1[3]=(double)Ymin;
X1[4]=(double)Xmax; Y1[4]=(double)Ymax;
X[N+1]=X[1],Y[N+1]=Y[1];
//aflare poligon intersectie
double Xi,Yi,A1,B1,C1,vc,vu,A2,B2,C2,det;
for(i=1;i<=N;i++)
{
A1=(double)Y[i+1] - Y[i];
B1=(double)X[i] - X[i+1];
C1=A1*X[i]+B1*Y[i];
//pentru a fi in interior -> <0
N2=0;
X1[N1+1]=X1[1]; Y1[N1+1]=Y1[1];
for(j=1;j<=N1;j++)
{
vc=A1*X1[j]+B1*Y1[j]-C1;
vu=A1*X1[j+1]+B1*Y1[j+1]-C1;
if(vc<=eps && vu<=eps)
{
X2[++N2]=X1[j];
Y2[N2]=Y1[j];
}
else
if(vc<=eps && vu > eps)
{
X2[++N2]=X1[j];
Y2[N2]=Y1[j];
if( -vc > eps )
{//punctul de intersectie
A2=Y1[j+1]-Y1[j];
B2=X1[j]-X1[j+1];
C2=A2*X1[j] + B2*Y1[j];
det= A1*B2 - A2*B1;
Xi= (B2*C1 - B1*C2) / det;
Yi= (A1*C2 - A2*C1) / det;
X2[++N2]=Xi;
Y2[N2]=Yi;
}
}
else
if(vc >= eps && vu <= eps)
{//doar punctul de intersectie
A2=Y1[j+1]-Y1[j];
B2=X1[j]-X1[j+1];
C2=A2*X1[j] + B2*Y1[j];
det= A1*B2 - A2*B1;
Xi= (B2*C1 - B1*C2) / det;
Yi= (A1*C2 - A2*C1) / det;
X2[++N2]=Xi;
Y2[N2]=Yi;
}
}
N1=N2;
for(j=1;j<=N1;j++)
X1[j]=X2[j], Y1[j]=Y2[j];
}
// aria poligonului rezultat
double area=0.0;
for(i=2;i<N1;i++)
{
A1= X1[i] - X1[1];
B1= Y1[i] - Y1[1];
A2= X1[i+1] - X1[1];
B2= Y1[i+1] - Y1[1];
area+= A1*B2 - A2*B1;
}
if(area>0.0)
area /= 2.0;
else
area /= -2.0;
fprintf(fout,"%.2f\n",area);
fclose(fin);
fclose(fout);
return 0;
}