【题目】
【题解】
题意:给定圆心rx,ry和半径r和终点位置x,y,Miyako位于圆的底部即(rx,ry-r),直线y=ry以下和圆外的部分是海,不能直接通过。输出Miyako从起点到终点的最短距离。
思路:画图,分类讨论即可。
【代码】
#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);
}
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+(asin(sinb)-asin(sina))*r+pi*r/2;
}
printf("%.4f\n",s);
}
return 0;
}