HDU-4793 几何

原创 2017年10月04日 16:11:28

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

题目大意 :有一个圆硬币半径为r,初始位置为x,y,速度矢量为vx,vy,有一个圆形区域(圆心在原点)半径为R,还有一个圆盘(圆心在原点)半径为Rm (Rm < R),圆盘固定不动,硬币撞到圆盘上会被反弹,不考虑能量损失,求硬币在圆形区域内运动的时间。

运动方程:

x’=x+t*vx;
y’=y+t*vy;
r’=r1+r2;
x’^2+y’^2=r’^2;

解法: 解方程,求 (x+vx*t,y+vy*t) 代入圆形区域方程是否有解,如果没解,说明硬币运动轨迹与圆形区域都不相交,答案为0

如果有解,再看代入圆盘有没有解,如果有解,即为两个解的差值*2, 如果没解,那么就是与圆形区域相交的两个点的t的差值。

难点在于如何构造出两个运动轨迹方程,为什么这么构造。

一共四种情况:

第一种:与外圆相离相切,输出0。

第二种:与外圆相交,与内圆相离相切,输出外圆两个解的差的绝对值。

第三种:与外圆相交,与内圆相交,输出外圆两个解的差的绝对值减去内圆两个解的差的绝对值。

第四种:与外圆相交即有两个解,但是两个解都是负的(要么都是负数要么都是正数),也就是说反向运动才能进入大圆,输出0。

#include<bits/stdc++.h>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define W(t) while(t)
using namespace std;
double eps=1e-10;
int sgn(double x)
{
    if(x > eps) return 1;
    if(x < -eps) return -1;
    return 0;
}
int main()
{
    double RM,R,r,x,y,vx,vy;
    while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&RM,&R,&r,&x,&y,&vx,&vy))
    {
        double A1=vx*vx+vy*vy;
        double B1=2*x*vx+2*y*vy;
        double C1=x*x+y*y-(R+r)*(r+R);
        double A2=A1;
        double B2=B1;
        double C2=x*x+y*y-(RM+r)*(RM+r);
        double detla1=B1*B1-4.0*A1*C1;
        double detla2=B2*B2-4.0*A2*C2;
        double s11=(-B1-sqrt(detla1))/(2.0*A1);
        double s12=(-B1+sqrt(detla1))/(2.0*A1);
        double s21=(-B2-sqrt(detla2))/(2.0*A2);
        double s22=(-B2+sqrt(detla2))/(2.0*A2);
        if(sgn(detla1)<=0) //不与圆相交
        {
            printf("0.000\n");
            continue;
        }
        if(sgn(s12)>=0)
        {
            if(sgn(detla2)<=0) //只与外面的圆相交
                printf("%.3f\n",fabs(s11-s12));
            else  //与内外两个圆相交
                printf("%.3f\n",2*fabs(s21-s11));
        }
        else  //反向
            printf("0.000\n");

    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 4793 Collision【计算机几何】【经典】

Collision Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

HDU 4793 计算几何 2013长沙区现场赛题C题

 思路:分三种情况讨论。1,碰撞;2,在其中;3,不飞进去; 注意碰撞的时候路径不是简单的半径乘以2。 思路:分三种情况讨论。1,碰撞;2,在其中;3,不飞进去; 注意碰撞...

HDU 4793 Collision + HDU 4798 Skycity 简单几何

HDU 4793 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793  题意:给一个以(0,0)为圆心半径为R的圆形区域,中间放着一个(0,0)为圆...

hdu4793Collision

2013年亚洲区域赛长沙站的几何题,就是告诉你两个圆(大圆和小圆),同心的,再告诉你一个小小圆在大圆外面,再告诉你小小圆的运动速度(矢量),如果碰到小圆就原路返回,如果碰不到就穿过大圆,问你小小圆在大...

hdu-4793-Collision

计算几何、圆

【几何】2011 regional Beijing Site B——Hou Yi's secret——hdu 4082

注意重点&三点共线的情况。还有蛋疼的精度! #define N 20 #define eps 1e-8 struct node { int x,y; }p[N]; struct edge {...

HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)

Convex Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot...

ACM-计算几何之You can Solve a Geometry Problem too——hdu1086

ACM 计算几何 You can Solve a Geometry Problem too hdu1086 线段相交

hdu 5738 多校2 Eureka 【几何计数】

思路: 满足题意的点集为共线点集和相同点集,一个集合至少两个点; 无重复枚举每个点,找出相同点个数m,共线点个数kik_i(多条线), 包含此点的点集个数为(2m−1−m)+sum((sm−1)...

计算几何 之 hdu 1077 poj 1981 O(n^2logn)

终于知道怎么回事了。。。 //  [7/10/2014 Sjm] // 题目: 用半径为 1 的圆,尽可能多的包含所给点。 /********************************...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)