链接
思路
-
当角 a a a 小于 π 2 \frac\pi2 2π 时,计算点到直线距离。
-
当角 b b b 小于 π 2 \frac\pi2 2π 时,分两种情况:
-
垂足在线段上,计算点到直线距离。
-
垂足在线段延长线上,计算两点间距离(红色部分)。
-
-
当角 b b b 大于 π 2 \frac\pi2 2π 时,计算点到直线距离:
-
当角 a a a 和角 b b b 都小于 π 2 \frac\pi2 2π 时,分两种情况:
-
当角 α \alpha α 小于 π 2 \frac\pi2 2π 时,计算点到直线距离(红色部分)
-
当角 α \alpha α 大于 π 2 \frac\pi2 2π 时,不做处理
将上面这些值与 2 R 2R 2R 、 w w w 、 l l l 求最小值,再除以 2 2 2 就是答案。
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-1);
double a,b,r,l,w,ans;
void solve(){
cin>>a>>b;
ans=min({r+r,l,w});
if(a<pi/2){ ans=min(ans,l*sin(a)); }
if(b<pi/2){
double t=w*sin(pi/2-b);
if(t*t>w*w-l*l) ans=min(ans,t);
else ans=min(ans,sqrt(l*l+w*w-2*l*w*cos(pi/2-b)));
}
if(b>pi/2){ ans=min(ans,w-l*sin(b)); }
if(a<pi/2&&b<pi/2){
double x=l*cos(b),y=w-l*sin(b);
double alp=atan(y/x)+a;
if(alp<pi/2) ans=min(ans,sqrt(x*x+y*y)*sin(alp));
}
cout<<setprecision(10)<<fixed<<ans/2<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin>>r>>l>>w;
int T;
for(cin>>T;T;T--) solve();
}