alt

给定一点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;
    }
}