D-Mocha and Railgun

题意:给定一原点为(0,0)的圆,其中有一点Q,以点Q为中心的宽度为2d矩形自由旋转,与圆相交的一侧的最大弧 代码:

思路: altaltalt

过原点O作两平行线垂线,垂点分别为C,D,设一侧与圆交点分别为A,B 所求弧对应圆心角a=∠AOD-∠BOD; 令OC=x,则OD=2d+x,则有a=acos(x/r)-acos((x+2d)/r); 求导知其导数恒大于0,则x最大时,a最大 接下来是求x的最大值 alt 如图,Q到线段的距离为d,O到线段的距离为X,OQ固定为L; 当两垂点不重合时,X+d<L(直角边小于斜边) X<L-d; 重合时 易得X=L-d为最大值 将X=L-d代入a关于X的表达式,得到对应圆心角 再乘以半径得到对应的最大弧长

using namespace std;
const double PI=acos(-1.0);
int main()
{
    int tt;cin>>tt;
    while(tt--)
    {
        double r,x,y,d;cin>>r>>x>>y>>d;
        double l=sqrt(x*x+y*y);
        double a=acos((l-d)/r),b=acos((l+d)/r);
        double ans=r*(a-b);
        printf("%.8f\n",ans);
    }
    return 0;
}