您的位置:首页 > 其它

圆弧并 uva 10969 && LA 2572

2015-02-26 02:17 295 查看
inline double ensure_angle(double v){while (v<-eps)v+=pi*2;return v;}
Circle p[105];
int topmost(Point q,int t=0)
{
int ans=-1;
for(int i=n-1;i>=t;i--)//下界必须为0,为了减少计算量会出错
{
if((length(q-p[i].c)<p[i].r))
{
ans=i;
break;
}
}
return ans;
}
int gcci(Circle c1,Circle c2,vector<d_ >&sol)
{
d_ d=length(c1.c-c2.c);
if (dcmp(d)==0)
{
if (dcmp(c1.r-c2.r)==0) return -1;
return 0;
}
if (dcmp(c1.r+c2.r-d)<0) return 0;
if (dcmp(fabs(c1.r-c2.r)-d)>0) return 0;

d_ a=angle(c2.c-c1.c);
d_ da=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));
sol.pb(ensure_angle(a-da));
if (dcmp(da)==0) return 1;
sol.pb(ensure_angle(a+da));
return 2;
}
set<int >re;
vector<d_ > rad;
void doit()
{   scanf("%d",&n);double ans=0;
fr(i,0,n-1) scanf("%lf%lf%lf",&p[i].r,&p[i].c.x,&p[i].c.y);
re.clear();
for (int i=0;i<n;i++)
{   rad.clear();
for (int j=0;j<n;j++)if (i!=j)//不能j=i+1
gcci(p[i],p[j],rad);
rad.push_back(0);
rad.push_back(pi*2);
int sz=rad.size();
sort(rad.begin(), rad.end());

for(int j=0;j<sz-1;j++)
{
d_  mid=(rad[j]+rad[j+1])/2;
int f=0;
for(int d=-1;d<=1;d+=2)
{

d_  r2=p[i].r+eps*d;
Point q=Point(p[i].c.x+r2*cos(mid),p[i].c.y+r2*sin(mid));

int t=topmost(q);
if(t>=0)  re.insert(t);
if (t==i&&!f) {ans+=(rad[j+1]-rad[j])*p[i].r;f=1;}
}
}
}
//printf("%d\n",re.size());
printf("%.3lf\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: