题意 :
- 给定一个圆心在原点的原,再给圆内一点,是一个严格在圆内的线段的中点,这个线段可以绕着这个中点任意旋转,垂直于这个线段向圆发射光波,求最大弧长
思路 :
- 考虑两种特殊位置:线段垂直于中点与圆心的连线;线段平行于中点与圆心的连线
- 要想弧长最大,就要弦长最大,画图后发现,垂直的情况下,弦长等于线段的长度;平行的情况下,弧长是斜边,必然大于线段的长度
- 弧长与角度的对应关系,弧长等于角度乘以半径
- 角度 ans = 90度 - a - b,这个90度是不好处理的,因此将它和-a合在一起
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int _; cin >> _;
while (_ -- ) {
double r, x, y, d;
cin >> r >> x >> y >> d;
double L = sqrt(x * x + y * y);
double a = asin((L + d) / r);
double b = asin((L - d) / r);
printf("%.6lf\n", (a - b) * r);
}
}