hdu 5572 An Easy Physics Problem 圆+直线
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
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.
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.
0 0 1
2 2 0 1
-1 -1
0 0 1
-1 2 1 -1
1 2
Case #2: Yes
题意:有一个质点位于点(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 圆+直线的更多相关文章
- HDU 5572 An Easy Physics Problem (计算几何+对称点模板)
HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...
- 【HDU 5572 An Easy Physics Problem】计算几何基础
2015上海区域赛现场赛第5题. 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意:在平面上,已知圆(O, R),点B.A(均在圆外),向量 ...
- HDU - 5572 An Easy Physics Problem (计算几何模板)
[题目概述] On an infinite smooth table, there's a big round fixed cylinder and a little ball whose volum ...
- HDU 5572 An Easy Physics Problem【计算几何】
计算几何的题做的真是少之又少. 之前wa以为是精度问题,后来发现是情况没有考虑全... 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意: ...
- HDU 5572--An Easy Physics Problem(射线和圆的交点)
An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- 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 ...
- ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem
题意: 光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射. 学到了向量模板, ...
- HDU 4974 A simple water problem(贪心)
HDU 4974 A simple water problem pid=4974" target="_blank" style="">题目链接 ...
- 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 ...
随机推荐
- 阿里巴巴矢量图标库(iconfont)批量全选的方法
阿里巴巴矢量图标库: https://www.iconfont.cn/ 浏览器打开调试面板,进入 console 调试面板(Google浏览器快捷键F12)或者在页面空白处,点击右键->审查元素 ...
- PHP搭建B2C分销商城系统需要考虑哪些因素?(一)
在网购日渐繁盛的今天,传统线下门店和代理分销越发显示出其弊端.此种情况下,进入互联网市场是最好的选择.入驻第三方平台成本太高,无法掌握自己的流量,所以搭建自己的分销平台成为众多企业的首选.搭建B2C分 ...
- fiddler笔记:与Web Session的交互
Decode Selected Session 解决响应体显示乱码的问题. AutoScroll Session List 决定Fiddler是否会自动将新增的Session添加到web sessio ...
- hdu 1068 最大子序列和变形,,,
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- 正则表达式 第五篇:C# 正则表达式
原文:正则表达式 第五篇:C# 正则表达式 本文整理C#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符.普通字符是指字面含义不变 ...
- SIP 3pcc
3PCC全称Third Party Call Control,中文即第三方电话呼叫控制,指的是由第三方控制者在另外两者之间建立一个会话,由控制者负责会话双方的媒体协商.3PCC是一种非常灵活的会话控制 ...
- JavaScript-->基础类型和引用类型的区别
先了解一下数组的基础知识:附代码(数组属于引用类型的对象) <!DOCTYPE html> <html lang="en"> <head> &l ...
- 使用高德地图JS获取当前位置和经纬度
先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...
- mybatis+oracle 批量插入,若数据库中有则做更新操作
1.只批量插入: insert into WXPAY_ACCOUNT(id ,out_trade_no ,transaction_id)select SEQ_WXPAY_ACCOUNT.nextval ...
- 使用私有api统计ios app运行时间及次数
利用<iphone SprintBoard部分私有API总结>中提到的私有API,可以做很多越狱以前实现不了的事情. 比如,利用一个后台运行的app,监控该iphone上所有app的运行次 ...