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. Block Breaker HDU - 6699(深搜,水,写下涨涨记性)

    Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...

  2. Thinking In Java 4th Chap4 控制执行流程

    Foreach语法: 例如:float f[]=new float [10]; for(float x:f){/*****/} for(char c:"Afaslkd aslfjala al ...

  3. 小木棒HDU1455(DFS+剪枝)

    题意:HDU1455 给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少. 思路: 见代码:https://www.cnblogs.com/fqfzs/p/9 ...

  4. 码云以及Git的使用

    码云以及Git的使用 码云就是一个远程管理的仓库,Git是用来上传和下载数据的工具. 首先访问网站 https://gitee.com/ 进行注册 注册完成后,进入如下页面 点击新建仓库 设置自己的仓 ...

  5. 【Python基础】15_Python中的变量-进阶

    1.引用的概念 2.可变类型和不可变类型 3.哈希

  6. tensorflow lite 之生成 tflite 模型文件

    下载最新的的tensorflow源码. 1.配置 tflite 文件转换所需环境 安装 bazel 编译工具 https://docs.bazel.build/versions/master/inst ...

  7. shell习题第18题:检查新文件

    [题目要求] 有一台服务器作为web应用,有一个目录(/data/web/attachment)不定时会被用户上传新的文件,但是不知道什么时候会被上传.所以,需要我们每5分钟做一次检测是否有新文件生成 ...

  8. JSP读取properties文件变量

    1.jsp代码 <%ResourceBundle res = ResourceBundle.getBundle("properties文件名"); %> 2.js代码 ...

  9. 09 redis中布隆过滤器的使用

    我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容.问题来了,新闻客户端推荐系统如何实现推送去重的? 会想到服务器记录了用户看过的所有历史记录,当推 ...

  10. django 函数和类实现分页案例

    方法一: 模拟分页from django.shortcuts import render,HttpResponse from app01 import models def hostnames(req ...