#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
double rx,ry,r,x,y;
double s;
double len1(double a,double b,double c,double d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double len2(double a,double b,double c,double d,double rr)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d)-rr*rr);
}
double jd(double k)
{
return asin(k)*180/pi;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%lf %lf %lf %lf %lf",&rx,&ry,&r,&x,&y);
s=0;
if(x<=rx-r)
{
s=pi*r/2+len1(x,y,rx-r,ry);
}
else if(x>=rx+r)
{
s=pi*r/2+len1(x,y,rx+r,ry);
}
else
{
double d1,d2,d3,sina,sinb,a,b;
d1=len1(x,y,rx,ry);
d2=len2(x,y,rx,ry,r);
d3=len1(x,y,x,ry);
sina=d2/d1;
sinb=d3/d1;
s=d2+(jd(sinb)-jd(sina))*pi*r/180+pi*r/2;
}
printf("%.4f\n",s);
}
return 0;
}
记一条数学公式
求角度
sina=对面/斜边;
角度=asin(sina)*180/pi;
弧长度=角度*pi*r/180;