D-Mocha and Railgun
题意:给定一原点为(0,0)的圆,其中有一点Q,以点Q为中心的宽度为2d矩形自由旋转,与圆相交的一侧的最大弧 代码:
思路:
过原点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的最大值
如图,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;
}