给定一点Q(x,y),连接OQ,取距离Q为d的两点A,B(丨AB丨=2d),过A,B点分别作垂线交圆O于点E,F。EF长度即为题目所求(证明略)
#include <bits/stdc++.h>
using namespace std;
const double pi=3.141592654;
int main()
{ int N;cin>>N;
double r,x,y,d;
while(N--)
{
cin>>r>>x>>y>>d;
double l=sqrt(x*x+y*y);
//l=OQ
double c=acos((l-d)/r)*180/pi-acos((l+d)/r)*180/pi;
//β=acos((l-d)/r)*180/pi α=acos((l+d)/r)*180/pi
cout<<fixed<<setprecision(12)<<r*pi*2*c/360<<endl;
}
}