题目描述
http://192.168.49.228/upload/file/20180806/20180806122001_82603.pdf
题意,给你一个圆心在原点,半径为m的圆,如图即是黑色的大圆,黑色大圆的周长为sum,对于与它相交的圆,
例如右上角的小圆,sum需要减去绿色部分(相交部分自己的圆弧),加上红色部分(相交部分相交圆的圆弧)
如果是右下角蓝色小圆这种内切的情况,加直接加上内切圆的周长即可,如果是左下角黄色小圆这种内含的情况,就不需要改变
,求最后的sum的值
#include<stdio.h>
#include<string.h>
#include<math.h>
const double pai = acos(-1);
int main()
{
int n,x,y,f;
double m,r,u,v,sum,l;
scanf("%d",&f);
while(f--){
scanf("%d %lf",&n,&m);
sum= 2*pai*m;
for(int i = 1;i <= n;i++){
scanf("%d %d %lf",&x,&y,&r);
l=(double)sqrt((double)(x*x+y*y));
if(l>= r + m)
continue;
else if(l>fabs(m-r)){
u=2*acos((m*m+l*l-r*r)/(2*m*l));
v=2*acos((r*r+l*l-m*m)/(2*r*l));
sum=sum-u*m+v*r;
}
else if(l== fabs(m- r)&& m>= r)
sum+= 2*pai*r;
}
printf("%.10lf\n",sum);
}
return 0;
}