| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
有点小恶心,附代码Source Code
Problem: 3947 User: JiaJunpeng
Memory: 216K Time: 16MS
Language: C++ Result: Accepted
Source Code
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;
double fenzi[2],fenmu,S,x,y,eps=1e-7,arg,delta,X,Y,pi=acos(-1.00),ansx,ansy,oox=1412.000,ooy=3756.000;
struct pp
{
char flag[11];
double x,y,r,arg,x0,y0;
};
pp aa[111];
int n,cnt;
double area(double x1,double y1,double x2,double y2,double x3,double y3)
{
return ((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))/2.00;
}
void G(double x1,double y1,double x2,double y2,double x3,double y3)
{
x=(x1+x2+x3)/3.00;
y=(y1+y2+y3)/3.00;
}
bool inter(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
double a1,b1,c1,a2,b2,c2;
a1=y2-y1;
b1=x1-x2;
c1=y1*x2-y2*x1;
a2=y4-y3;
b2=x3-x4;
c2=y3*x4-y4*x3;
if(a1*b2==a2*b1)
return false;
x=(c2*b1-c1*b2)/(a1*b2-a2*b1);
y=(c2*a1-c1*a2)/(b1*a2-b2*a1);
if(!((x<x1+eps&&x>x2-eps)||(x<x2+eps&&x>x1-eps)))
return false;
if(!((y<y1+eps&&y>y2-eps)||(y<y2+eps&&y>y1-eps)))
return false;
if(!((x<x3+eps&&x>x4-eps)||(x<x4+eps&&x>x3-eps)))
return false;
if(!((y<y3+eps&&y>y4-eps)||(y<y4+eps&&y>y3-eps)))
return false;
return true;
}
int main()
{
int i,j,s,p,q;
double a,b,c,A,B,C,k,arg1,arg2;
while(scanf("%s",aa[0].flag)&&strcmp(aa[0].flag,"end")!=0)
{
scanf("%lf%lf",&aa[0].x,&aa[0].y);
n=1;
while(true)
{
scanf("%s",aa[n].flag);
if(strcmp(aa[n].flag,"close")==0)
{
if(aa[n-1].x!=aa[0].x||aa[n-1].y!=aa[0].y)
{
strcpy(aa[n].flag,"line");
aa[n].x=aa[0].x;
aa[n++].y=aa[0].y;
}
break;
}
scanf("%lf%lf",&aa[n].x,&aa[n].y);
if(strcmp(aa[n].flag,"arc")==0)
scanf("%lf",&aa[n].r);
n++;
}
fenzi[0]=fenzi[1]=fenmu=0;
for(i=1;i<n;i++)
{
if(i+1<n)
{
S=area(aa[0].x,aa[0].y,aa[i].x,aa[i].y,aa[i+1].x,aa[i+1].y);
if(S!=0)
{
G(aa[0].x,aa[0].y,aa[i].x,aa[i].y,aa[i+1].x,aa[i+1].y);
fenzi[0]+=S*x;
fenzi[1]+=S*y;
fenmu+=S;
}
}
if(strcmp(aa[i].flag,"arc")==0)
{
a=2*(aa[i].x-aa[i-1].x);
b=2*(aa[i].y-aa[i-1].y);
c=aa[i].x*aa[i].x-aa[i-1].x*aa[i-1].x+aa[i].y*aa[i].y-aa[i-1].y*aa[i-1].y;
if(b==0)
{
x=c/a;
y=aa[i].y+sqrt(aa[i].r*aa[i].r-(x-aa[i].x)*(x-aa[i].x));
if((aa[i].r<0&&(aa[i].y-y)*(aa[i-1].x-x)<(aa[i-1].y-y)*(aa[i].x-x))||(aa[i].r>0&&(aa[i].y-y)*(aa[i-1].x-x)>(aa[i-1].y-y)*(aa[i].x-x)))
{
y=aa[i].y-sqrt(aa[i].r*aa[i].r-(x-aa[i].x)*(x-aa[i].x));
while((aa[i].y-y)*(aa[i-1].x-x)<(aa[i-1].y-y)*(aa[i].x-x));
}
}
else
{
A=a*a+b*b;
B=2*(b*aa[i].y-c)*a-2*b*b*aa[i].x;
C=b*b*aa[i].x*aa[i].x+(c-aa[i].y*b)*(c-aa[i].y*b)-aa[i].r*aa[i].r*b*b;
delta=B*B-4*A*C;
x=(-B+sqrt(delta))/(2*A);
y=(c-a*x)/b;
if((aa[i].r<0&&(aa[i].y-y)*(aa[i-1].x-x)<(aa[i-1].y-y)*(aa[i].x-x))||(aa[i].r>0&&(aa[i].y-y)*(aa[i-1].x-x)>(aa[i-1].y-y)*(aa[i].x-x)))
{
x=(-B-sqrt(delta))/(2*A);
y=(c-a*x)/b;
}
}
aa[i].x0=x;
aa[i].y0=y;
X=(aa[i].x+aa[i-1].x)/2.0;
Y=(aa[i].y+aa[i-1].y)/2.0;
arg=sqrt((aa[i].x-X)*(aa[i].x-X)+(aa[i].y-Y)*(aa[i].y-Y))/abs(aa[i].r);
arg=2*asin(arg);
aa[i].arg=arg;
S=aa[i].r*aa[i].r*(arg-sin(arg))/2.00;
if(aa[i].r>0)
S=-S;
double val=sin(arg/2.00);
double len1=2.0*abs(aa[i].r*aa[i].r*aa[i].r)*val*val*val/(3.0*abs(S)),len2=sqrt((aa[i].x0-X)*(aa[i].x0-X)+(aa[i].y0-Y)*(aa[i].y0-Y));
x=aa[i].x0+len1*(X-aa[i].x0)/len2;
y=aa[i].y0+len1*(Y-aa[i].y0)/len2;
fenzi[0]+=S*x;
fenzi[1]+=S*y;
fenmu+=S;
}
}
ansx=fenzi[0]/fenmu;
ansy=fenzi[1]/fenmu;
printf("%.4lf %.4lf",ansx+eps,ansy+eps);
cnt=0;
for(i=1;i<n;i++)
{
if(strcmp(aa[i].flag,"line")==0)
cnt+=inter(ansx,ansy,oox,ooy,aa[i-1].x,aa[i-1].y,aa[i].x,aa[i].y);
else if(strcmp(aa[i].flag,"arc")==0)
{
k=(ansy-ooy)/(ansx-oox);
b=(ansy*oox-ooy*ansx)/(oox-ansx);
A=1+k*k;
B=2*(b-aa[i].y0)*k-2*aa[i].x0;
C=aa[i].x0*aa[i].x0+(b-aa[i].y0)*(b-aa[i].y0)-aa[i].r*aa[i].r;
delta=B*B-4*A*C;
if(delta>=0)
{
x=(-B+sqrt(delta))/(2*A);
y=k*x+b;
if((x<oox+eps&&x>ansx-eps))
{
arg=aa[i].arg;
arg1=(x-aa[i].x0)*(aa[i-1].x-aa[i].x0)+(y-aa[i].y0)*(aa[i-1].y-aa[i].y0);
arg1/=(aa[i].r*aa[i].r);
arg1=acos(arg1);
arg2=(x-aa[i].x0)*(aa[i].x-aa[i].x0)+(y-aa[i].y0)*(aa[i].y-aa[i].y0);
arg2/=(aa[i].r*aa[i].r);
arg2=acos(arg2);
if(abs(arg1+arg2-arg)<eps)
cnt++;
}
x=(-B-sqrt(delta))/(2*A);
y=k*x+b;
if((x<oox+eps&&x>ansx-eps))
{
arg=aa[i].arg;
arg1=(x-aa[i].x0)*(aa[i-1].x-aa[i].x0)+(y-aa[i].y0)*(aa[i-1].y-aa[i].y0);
arg1/=(aa[i].r*aa[i].r);
arg1=acos(arg1);
arg2=(x-aa[i].x0)*(aa[i].x-aa[i].x0)+(y-aa[i].y0)*(aa[i].y-aa[i].y0);
arg2/=(aa[i].r*aa[i].r);
arg2=acos(arg2);
if(abs(arg1+arg2-arg)<eps)
cnt++;
}
}
}
}
if(cnt%2==0)
printf(" -\n");
else
printf(" +\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator