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 计算几何 2013长沙区现场赛题C题

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

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

Collision Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • Archger
  • Archger
  • 2017年06月27日 19:26
  • 100

HDU 4793 Collision + HDU 4798 Skycity 简单几何

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

hdu4793Collision

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

hdu-4793-Collision

计算几何、圆

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

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

hdu 4562 守护雅典娜(计算几何+dp)

守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Su...

HDU 4998 Rotate (几何变换——旋转)

Rotate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub...

HDU1798 简单高中的计算几何题= =。正余弦定理的综合应用么。。。

Tell me the area Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...

HDU 1086 计算几何 判断线段相交

题目: You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU-4793 几何
举报原因:
原因补充:

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