[HDU 5572] An Easy Physics Problem (点在线上判定+对称)

2024-06-21 19:38

本文主要是介绍[HDU 5572] An Easy Physics Problem (点在线上判定+对称),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HDU - 5572

给定一个圆和圆外两个点 A和 B
现在有一个质点在 A处,有速度方向 V
其与圆的碰撞是弹性碰撞,问质点是否能经过 B


分情况讨论

  1. 如果射线不与圆相交,直接判定点是否在射线上
  2. 如果射线与圆相交,那么列方程解出与原交点
    并得出反弹的法线方程,然后以法线方程作对称
    最后判断点是否在一条线段和一条射线上

作对称的话可以将点 A以法线作对称,然后再用撞击点和对称点得到撞后轨迹

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <string>
#include <complex>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define SQR(a) ((a)*(a))
#define PCUT puts("\n----------")const DBL eps = 1e-8;
int sgn(DBL x){return x<-eps?-1:(x>eps?1:0);}
struct Vector
{DBL x, y;Vector(DBL _x=0, DBL _y=0):x(_x),y(_y){}Vector operator + (const Vector &rhs) const {return Vector(x+rhs.x, y+rhs.y);}Vector operator - (const Vector &rhs) const {return Vector(x-rhs.x, y-rhs.y);}Vector operator * (const DBL &rhs) const {return Vector(x*rhs, y*rhs);}Vector operator / (const DBL &rhs) const {return Vector(x/rhs, y/rhs);}DBL operator * (const Vector &rhs) const {return x*rhs.x + y*rhs.y;}DBL operator ^ (const Vector &rhs) const {return x*rhs.y - y*rhs.x;}int read(){return scanf("%lf%lf", &x, &y);}int pri(){cout << x << " " << y << endl; return 0;}
};
typedef Vector Point;
struct Line
{Vector u,v,s;Line(){}Line(Point _u, Point _v):u(_u),v(_v),s(_v-_u){}
};struct Circle
{Point o; DBL r;Circle(){};void read(){o.read(); scanf("%lf", &r);}
};int N;
Point A, B, V;
Circle O;DBL Vlen(Vector);
Vector Normal(Vector);
Point SISC(Line,Circle);
bool PointOnHline(Point,Line);
bool PointOnSegment(Point,Line);
DBL PointToLine(Point,Line);int main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);#endifint T;scanf("%d", &T);for(int ck=1; ck<=T; ck++){O.read(); A.read(); V.read(); B.read();Line l1(A, A+V);DBL dist = PointToLine(O.o, l1);bool ok=0;if(sgn(dist-O.r)>=0 || sgn(V*(O.o-A))<=0) ok |= PointOnHline(B, l1);else{Line l2(O.o, SISC(l1,O));if(PointOnHline(O.o, l1)) ok |= PointOnHline(B, l2);else{Vector n = Normal(l2.s);if(sgn(n*V)<0) n=n*(-1);n = n/Vlen(n);ok |= PointOnSegment(B, Line(A, l2.v)) || PointOnHline(B, Line(l2.v, A+n*2*PointToLine(A, l2)));}}printf("Case #%d: %s\n", ck, ok?"Yes":"No");}return 0;
}DBL Vlen(Vector v) { return sqrt(SQR(v.x) + SQR(v.y));}
Vector Normal(Vector v) {return Vector(-v.y, v.x);}bool PointOnHline(Point p, Line l)
{Vector temp = p-l.u;return sgn(temp^l.s) == 0 && sgn(temp*l.s) >= 0;
}bool PointOnSegment(Point p, Line l)
{return sgn( (l.u-p)^(l.v-p) )==0 && sgn( (l.u-p)*(l.v-p) )<=0;
}DBL PointToLine(Point p, Line l)
{return abs((p-l.u)^l.s)/Vlen(l.s);
}Point SISC(Line L, Circle C)
{Vector ou = L.u-C.o, s=L.s;DBL a = SQR(s.x) + SQR(s.y);DBL b = 2*(ou*s);DBL c = SQR(ou.x) + SQR(ou.y) - SQR(C.r);DBL d = b*b - 4*a*c;DBL t = (-b-sqrt(d))/(a+a);return L.u + s*t;
}

这篇关于[HDU 5572] An Easy Physics Problem (点在线上判定+对称)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082152

相关文章

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,公告信息,论坛,装修,装修队 开发系统:Windows 架构模式:B/S JDK版本:Java JDK1.8 开发工具:IDEA(推荐) 数据库版本: mysql5.7 数据库可视化工具: navicat 服务器:SpringBoot自带 ap

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

比较学习难度:Adobe Illustrator、Photoshop和新兴在线设计平台

从入门设计开始,几乎没有人不知道 Adobe 公司两大设计软件:Adobe Illustrator和 Photoshop。虽然AI和PS很有名,有一定设计经验的设计师可以在早期探索和使用后大致了解AI和PS的区别,但似乎很少有人会系统地比较AI和PS。目前,设计软件功能多样,轻量级和网页设计软件已成为许多设计师的需求。对于初学者来说,一篇有针对性的AI和PS比较总结文章具有非常重要的指导意义。毕竟

安全科普:理解SSL(https)中的对称加密与非对称加密

今天刚好为站点的后台弄了下https,就来分享我了解的吧。 密码学最早可以追溯到古希腊罗马时代,那时的加密方法很简单:替换字母。 早期的密码学:   古希腊人用一种叫 Scytale 的工具加密。更快的工具是 transposition cipher—:只是把羊皮纸卷在一根圆木上,写下信息,羊皮纸展开后,这些信息就加密完成了。 虽然很容易被解密,但它确实是第一个在现实中应用加密的

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

电压互感器在线监测的原理

电压互感器在线监测的原理主要基于电磁感应、电场效应以及一系列先进的监测技术。以下是对其原理的详细解释: 一、电磁感应原理 电压互感器(Voltage Transformer,简称VT)本质上是一种降压变压器,它利用电磁感应的原理将高电压信号转换成低电压信号以便于测量和监测。具体来说,电压互感器包含两个主要线圈:主线圈和次级线圈。主线圈接在被测电路中,当交流电压通过主线圈时,会在其内部产生磁场。

玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析

最近做一个项目时,需要在dataGird中插入<input>,即文本输入框,当点击提交时,需要把文本框里填的数据返以及其他列的一些信息以json数组的格式返回到后台,虽然我实现了该功能,但一直没找到简便的方法,今天终于在一位版主的点拨下找到了非常简单的方法。   var all = $("#dg").datagrid("getData");var json =JSON.