#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;