An Easy Physics Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1430    Accepted Submission(s): 270

Problem Description
On an infinite smooth table, there's a big round fixed cylinder and a little ball whose volume can be ignored.

Currently the ball stands still at point A, then we'll give it an initial speed and a direction. If the ball hits the cylinder, it will bounce back with no energy losses.

We're just curious about whether the ball will pass point B after some time.

 
Input
First line contains an integer T, which indicates the number of test cases.

Every test case contains three lines.

The first line contains three integers Ox, Oy and r, indicating the center of cylinder is (Ox,Oy) and its radius is r.

The second line contains four integers Ax, Ay, Vx and Vy, indicating the coordinate of A is (Ax,Ay) and the initial direction vector is (Vx,Vy).

The last line contains two integers Bx and By, indicating the coordinate of point B is (Bx,By).

⋅ 1 ≤ T ≤ 100.

⋅ |Ox|,|Oy|≤ 1000.

⋅ 1 ≤ r ≤ 100.

⋅ |Ax|,|Ay|,|Bx|,|By|≤ 1000.

⋅ |Vx|,|Vy|≤ 1000.

⋅ Vx≠0 or Vy≠0.

⋅ both A and B are outside of the cylinder and they are not at same position.

 
Output
For every test case, you should output "Case #x: y", where x indicates the case number and counts from 1. y is "Yes" if the ball will pass point B after some time, otherwise y is "No".
 
Sample Input
2
0 0 1
2 2 0 1
-1 -1
0 0 1
-1 2 1 -1
1 2
 
Sample Output
Case #1: No
Case #2: Yes
 
Source
 

题意:有一个质点位于点(x,y),初速度为(vx,vy),有一个柱子位于(ox,oy)半径为r,假设质点碰到柱子后发生弹性碰撞,问是否质点能经过(bx,by)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <bitset>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set> #define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define CT continue
#define SC scanf const double eps=1e-8; int dcmp(double x)
{
if(fabs(x)<eps) return 0;
else return x>0?1:-1;
} struct Point {
double x,y;
void read()
{
SC("%lf%lf",&x,&y);
}
}; struct circle{
Point o;
int r;
void read()
{
SC("%lf%lf%d",&o.x,&o.y,&r);
}
}; Point operator-(Point a,Point b)
{
return (Point){a.x-b.x,a.y-b.y};
} Point operator+(Point a,Point b)
{
return (Point){a.x+b.x,a.y+b.y};
} Point operator*(double p,Point a)
{
return (Point){a.x*p,a.y*p};
} double dot(Point a,Point b)
{
return a.x*b.x+a.y*b.y;
} double dis(Point a)
{
return sqrt(dot(a,a));
} double cross(Point a,Point b)
{
return a.x*b.y-b.x*a.y;
} Point GetLineProjection(Point P,Point A,Point B)
{
Point v=B-A;
Point ans=A+(dot(v,P-A)/dot(v,v))*v;
return ans;
} Point jiaoa,jiaob,tou;double d;
void getjiaopoint(Point pa,Point pav,circle C)
{
Point A=pa,B=pa+pav;
if(dis(C.o-B)>dis(C.o-A)){
A=pa+pav;
B=pa;
}
tou=GetLineProjection(C.o,A,B); d=dis(tou-C.o);
if(dcmp(d-C.r)<0)
{
double l=sqrt((double)C.r*C.r-d*d);
jiaoa=tou+l/dis(B-A)*(B-A);
jiaob=tou-l/dis(B-A)*(B-A);
}
} int main()
{
int cas;SC("%d",&cas);
circle C;
int kk=0;
Point pa,pb,pav;
while(cas--)
{
C.read();
pa.read();pav.read();pb.read(); getjiaopoint(pa,pav,C);
if(dcmp(d-C.r)>=0)
{
if(dcmp(cross(pb-pa,pav))==0&&dcmp(dot(pb-pa,pav))>0)
printf("Case #%d: Yes\n",++kk);
else printf("Case #%d: No\n",++kk);
CT;
} Point chap;
if(dcmp(dis(jiaoa-pa)-dis(jiaob-pa))<0) chap=jiaoa;
else chap=jiaob; int flag=0;
if(dcmp(cross(pa-pb,chap-pb))==0&&dcmp(dot(pa-pb,chap-pb))<=0)
flag=1; Point I=GetLineProjection(pa,C.o,chap);
Point pa2=pa+2*(I-pa),pa2v=chap-pa2;
if(dcmp(cross(pb-chap,pa2v))==0&&dcmp(dot(pb-chap,pa2v))<=0)
flag=1;
if(flag) printf("Case #%d: Yes\n",++kk);
else printf("Case #%d: No\n",++kk);
}
return 0;
}

  分析:

1.直接根据向量求出角度再比大小容易错(精度),可做a点关于直线的对称点a2,再判断b点是否在chap与a2该条射线上

pa

hdu 5572 An Easy Physics Problem 圆+直线的更多相关文章

  1. HDU 5572 An Easy Physics Problem (计算几何+对称点模板)

    HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...

  2. 【HDU 5572 An Easy Physics Problem】计算几何基础

    2015上海区域赛现场赛第5题. 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意:在平面上,已知圆(O, R),点B.A(均在圆外),向量 ...

  3. HDU - 5572 An Easy Physics Problem (计算几何模板)

    [题目概述] On an infinite smooth table, there's a big round fixed cylinder and a little ball whose volum ...

  4. HDU 5572 An Easy Physics Problem【计算几何】

    计算几何的题做的真是少之又少. 之前wa以为是精度问题,后来发现是情况没有考虑全... 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意: ...

  5. HDU 5572--An Easy Physics Problem(射线和圆的交点)

    An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  6. 2015 ACM-ICPC 亚洲区上海站 A - An Easy Physics Problem (计算几何)

    题目链接:HDU 5572 Problem Description On an infinite smooth table, there's a big round fixed cylinder an ...

  7. ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem

    题意: 光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射. 学到了向量模板, ...

  8. HDU 4974 A simple water problem(贪心)

    HDU 4974 A simple water problem pid=4974" target="_blank" style="">题目链接 ...

  9. hdu 1040 As Easy As A+B

    As Easy As A+B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

随机推荐

  1. 剑指offer43:左旋转字符串(字符串):对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    1 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”a ...

  2. 关于centOS安装配置xampp那点事

    1.到官网下载centOS对应版本的xampp,应该是以tar.gz为后缀的 2.tar -zxf 下载的包 3.mv lampp /opt 4.service mysqld stop因xampp里自 ...

  3. Docker 常用命令和Dockerfile

    Docker 简介 官方的解释为:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现 ...

  4. 针对Web的信息搜集

    信息收集(Information Gathering),信息收集是指通过各种方式获取所需要的信息,在整个渗透测试环节中,信息搜集是整个渗透过程中最为重要的一环,信息搜集可占据整个渗透测试80%左右的工 ...

  5. [Vue]method与计算属性computed、侦听器watch与计算属性computed的区别

    一.方法method与计算属性computed的区别 方法method:每当触发重新渲染时,调用方法method将总会再次执行函数: 计算属性computed:计算属性computed是基于它们的响应 ...

  6. Advanced Installer 安装完成后,自动启动主程序。

    这个耗时2天,才研究测试通过.一定要记住了方法: =========================================================================== ...

  7. jquery.serializejson.min.js的妙用

    关于这个jquery.serializejson.min.js插件来看,他是转json的一个非常简单好用的插件. 前端在处理含有大量数据提交的表单时,除了使用Form直接提交刷新页面之外,经常碰到的需 ...

  8. TypeScript入门三:TypeScript函数类型

    TypeScript函数类型 TypeScript函数的参数 TypeScript函数的this与箭头函数 TypeScript函数重载 一.TypeScript函数类型 在上一篇博客中已经对声明Ty ...

  9. 三种定位+堆叠+li小黑点变图片

    定位: 定位分为三种: position:static(默认值) relation(相对定位):进行较小偏移,不会脱离文档流,原位置保留 absolute(绝对定位):脱离文档流,不占据页面空间,变成 ...

  10. Lab2 Report

    1.安装SeleniumIDE插件 a)安装Firefox 17.0 - 56.*版本的firefox,下载地址为:http://ftp.mozilla.org/pub/firefox/release ...