hdu 4793(嗷嗷水的计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793;

大意:在原点有一个平台,原点还有一个圆形木块,视为挡板,有一个圆形滑块在光滑坐标轴上摩擦,有初始位置和坐标轴方向分速度,求,在圆形平台上走多远。

分析:

本题所求是圆形滑块轨迹中两次与圆形平台外切之间的时间,利用圆形坐标轨迹(x+vx*t,y+vy*t)进行计算相切是的时刻,如果碰上挡板,则用时是与圆形平台第一次外切和与挡板相切时的时间差的二倍。

代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int Rm,R,r,x,y,vx,vy;

int main(){
    while(scanf("%d%d%d%d%d%d%d",&R,&Rm,&r,&x,&y,&vx,&vy)!=EOF){
        double a=vx*vx+vy*vy;
        double b=2*vx*x+2*vy*y;
        double c=x*x+y*y-(Rm+r)*(Rm+r);
        if((b*b-4*a*c)<=0){
            puts("0.000");
            continue;
        }
        double dert=sqrt(b*b-4*a*c);
        double t1=min((-b+dert)/(2*a),(-b-dert)/(2*a));
        double t2=max((-b+dert)/(2*a),(-b-dert)/(2*a));
        if(t1<0||t2<0){
            puts("0.000");
            continue;
        }
        c=x*x+y*y-(r+R)*(r+R);
        if((b*b-4*a*c)<0){
            printf("%.3f\n",t2-t1);
            continue;
        }
        double der=sqrt(b*b-4*a*c);
        double t3=min((-b+der)/(2*a),(-b-der)/(2*a));
        if(t3>=0){
            printf("%.3f\n",(t3-t1)*2);
        }
        else puts("0.000");
    }
    return 0;
}


你可能感兴趣的:(简单题,North--计算几何,北门的智慧——计算几何)