#include<bits/stdc++.h> using namespace std; #define N 2005 typedef double db; const db eps=1e-6; const db pi=acos(-1); int sign(db k){if (k>eps) return 1; else if (k<-eps) return -1; return 0;} int cmp(db k1,db k2){return sign(k1-k2);} struct point{ db x,y; point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};} point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};} point operator * (db k1) const{return (point){x*k1,y*k1};} point operator / (db k1) const{return (point){x/k1,y/k1};} db abs(){return sqrt(x*x+y*y);} db dis(point k1){return ((*this)-k1).abs();} }; db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;} db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;} struct circle{ point o;db r; db area(){return r*r*pi;} }; circle c[N]; int n; //两圆关系:5相离,4外切,3相交,2内切,1内含 int relationcircle(circle k1,circle k2){ db d=k1.o.dis(k2.o); if(sign(d-k1.r-k2.r)>0)return 5; if(sign(d-k1.r-k2.r)==0)return 4; db l=fabs(k1.r-k2.r); if(sign(d-k1.r-k2.r)<0 && sign(d-l)>0)return 3; if(sign(d-l)==0)return 2; if(sign(d-l)<0)return 1; } db areacircle(circle k1,circle k2){ int rel=relationcircle(k1,k2); if(rel>=4)return 0.0; if(rel<=2)return min(k1.area(),k2.area()); db d=k1.o.dis(k2.o); db hf=(k1.r+k2.r+d)/2.0; db ss=2*sqrt(hf*(hf-k1.r)*(hf-k2.r)*(hf-d)); db a1=acos((k1.r*k1.r+d*d-k2.r*k2.r)/(2.0*k1.r*d)); a1=a1*k1.r*k1.r; db a2=acos((k2.r*k2.r+d*d-k1.r*k1.r)/(2.0*k2.r*d)); a2=a2*k2.r*k2.r; return a1+a2-ss; } int check(circle k1){//和每个圆求面积交 for(int i=1;i<=n;i++) if(areacircle(k1,c[i])*2<c[i].area())return 0; return 1; } int judge(db r){ for(int i=1;i<=n;i++){ circle k1=c[i]; k1.r=r; if(check(k1))return 1; } return 0; } int main(){ int t;cin>>t; while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&c[i].o.x,&c[i].o.y,&c[i].r); db L=0,R=1e10,mid,ans; while(R-L>eps){ mid=(L+R)/2; if(judge(mid)) ans=mid,R=mid; else L=mid; } printf("%.4lf\n",ans); } }
两圆面积交——hdu3264
猜你喜欢
转载自www.cnblogs.com/zsben991126/p/12344798.html
今日推荐
周排行