几何题:
分析如下图:
三种边界情况:
碰撞
不碰撞但过大圆
不过大圆
尤其注意速度方向可能使得他远离原点
#include<bits/stdc++.h>
using namespace std;
const double eps =1e-8;
int sgn(double x)
{
if(fabs(x)<eps )return 0;
if(x>0) return 1;
return -1;
}
int main()
{
double Rm, R, r, x, y, vx ,vy;
double lo,A,B,C,at,lk,ans;
while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&Rm, &R, &r, &x, &y, &vx ,&vy))
{
A=vy;
B=-vx;
C=vx*y-vy*x;
lo=fabs(C/sqrt(A*A+B*B));
if( sgn(((-y)*vy-x*vx) )<=0 ) ans=0;
else if( sgn(lo-(R+r)) >=0) ans=0;
else if( sgn(lo-(Rm+r))>=0 )
{
at=sqrt((R+r)*(R+r)-lo*lo);
ans= (2.0*at)/sqrt(vx*vx+vy*vy);
}
else
{
at=sqrt((Rm+r)*(Rm+r)-lo*lo);
lk=R+r;
lk=sqrt(lk*lk- lo*lo);
lk-=at;
ans=(2.0*lk)/sqrt(vx*vx+vy*vy);
}
printf("%.6lf\n",ans);
}
return 0;
}