HDU 6559 The Tower(计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6559
参考:https://www.cnblogs.com/Dillonh/p/11196418.html
题意:给定圆锥,以及一个点位置和初始速度,求点和圆锥相撞时间。保证点和圆锥可以相撞。
题解:解方程,详见参考博客,注意找出的两个点要check一下,并取最小值。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const double eps=1e-8;
const ll inf=0x3f3f3f3f3f3f3f3f;

double r,h,x,y,z,vx,vy,vz;
bool check(double t){
    double xx=x+vx*t;
    double yy=y+vy*t;
    double zz=z+vz*t;
    double R=(h-zz)*r/h;
    return sqrt(xx*xx+yy*yy)-R<=eps;
}
int main(){
    int t,cas=1;scanf("%d",&t);
    while(t--){
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&r,&h,&x,&y,&z,&vx,&vy,&vz);
        double a=vx*vx+vy*vy-r*r*vz*vz/h/h;
        double b=2*(vx*x+vy*y-z*vz*r*r/h/h+vz*r*r/h);
        double c=x*x+y*y-r*r/h/h*(h-z)*(h-z);
        double ans1=(-b+sqrt(b*b-4*a*c))/(2*a);
        double ans2=(-b-sqrt(b*b-4*a*c))/(2*a);
        double ans=inf;
        if(check(ans1)) ans=ans1;
        if(check(ans2)) ans=min(ans,ans2);
        printf("Case %d: %.10f\n",cas++,ans);
    }
    return 0;
}

发布了71 篇原创文章 · 获赞 1 · 访问量 2829

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/103008153
今日推荐