[计算几何] zoj 3728 Collision

解决了一个关于硬币撞击固定圆饼和共享中心的较大圆环的问题,通过计算硬币从进入大圆开始到离开大圆的最短时间来求解。使用了简单的几何计算,包括向量、点集和叉积概念。

题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3728


Collision

Time Limit: 2 Seconds       Memory Limit: 65536 KB       Special Judge

There's a round medal fixed on an ideal smooth table, Fancy is trying to throw some coins and make them slip towards the medal to collide. There's also a round range which shares exact the same center as the round medal, and radius of the medal is strictly less than radius of the round range. Since that the round medal is fixed and the coin is a piece of solid metal, we can assume that energy of the coin will not lose, the coin will collide and then moving as reflect.

Now assume that the center of the round medal and the round range is origin ( Namely (0, 0) ) and the coin's initial position is strictly outside the round range. Given radius of the medal Rm, radius of coin r, radius of the round range R, initial position (xy) and initial speed vector (vxvy) of the coin, please calculate the total time that any part of the coin is inside the round range.

Please note that the coin might not even touch the medal or slip through the round range.

Input

There will be several test cases. Each test case contains 7 integers RmRrxyvx and vy in one line. Here 1 ≤ Rm < R ≤ 2000, 1 ≤ r ≤ 1000, R + r < |(xy)| ≤ 20000, 1 ≤ |(vxvy)| ≤ 100.

Output

For each test case, please calculate the total time that any part of the coin is inside the round range. Please output the time in one line, an absolute error not more than 1e-3 is acceptable.

Sample Input
5 20 1 0 100 0 -1
5 20 1 30 15 -1 0
Sample Output
30.000
29.394

Author:  FAN, Yuzhe
Contest:  The 2013 ACM-ICPC Asia Changsha Regional Contest
Submit     Status


题目意思:

给一个以原点(0,0)为圆

心,半径为Rm固定的圆饼。给一个以原点(0,0)为圆心,半径为R的大圆。有一个圆硬币,圆心为(x,y),半径为r,速度为vx,vy,硬币碰到圆饼后会以同样的能量从反射方向弹回。求硬币从进入大圆开始到离开大圆所花的时间。

解题思路:

简单计算几何。

先把圆饼和大圆的半径都加上硬币的半径,这样就可以把硬币看成是一个点。

假设硬币在A点,原点为B点,运动方向向量为AC,先用点集(AB,AC)判断硬币运动,如果向量AB,AC夹角大于等于90度,肯定不会经过大圆。

然后用叉积求出AB在AC方向上距离(高)d。

如果d>R 与大圆无交点

如果Rm<d<R说明是直线穿过大圆(在大圆里面的运行距离为sqrt(R*R-d*d))

如果d<Rm说明先射向圆饼然后反弹(在大圆里的运行距离为2*(sqrt(R*R-d*d)-sqrt(Rm*Rm-d*d))

代码:

//#include<CSpreadSheet.h>

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-9
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

struct Point
{
    double x,y;
}p0,p1;
double Rm,R,r,x0,yy0,v;

double dianji(Point a,Point b)
{
    return a.x*b.x+a.y*b.y;
}
double chaji(Point a,Point b)
{
    return a.x*b.y-a.y*b.x;
}

int main()
{
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   while(~scanf("%lf%lf%lf",&Rm,&R,&r))
   {
       Rm+=r,R+=r;
       scanf("%lf%lf",&x0,&yy0);
       scanf("%lf%lf",&p1.x,&p1.y);

       v=sqrt(p1.x*p1.x+p1.y*p1.y);

       p0.x=-x0,p0.y=-yy0;

       if(dianji(p0,p1)<eps)
       {
           printf("0.000\n");
           continue;
       }
       //system("pause");
       double d=fabs(chaji(p0,p1))/v;

       if(d-R>eps) //在外面
       {
           printf("0.000\n");
           continue;
       }
       if(d-Rm>eps)
       {
           printf("%.3lf\n",2*sqrt(R*R-d*d)/v);
           continue;
       }
       printf("%.3lf\n",(2*(sqrt(R*R-d*d)-sqrt(Rm*Rm-d*d)))/v);


   }
   return 0;
}



内容概要:本文围绕《【卫星信号】模拟卫星信号传播研究(Matlab代码实现)》这一技术资源展开,系统介绍了利用Matlab进行卫星信号传播过程建模与仿真的方法。该资源聚焦于构建卫星信号在复杂空间环境中的传播模型,综合考虑自由空间路径损耗、大气吸收、多径效应、多普勒频移、电离层闪烁及噪声干扰等多种物理因素,通过Matlab编程实现信号传输特性的动态仿真与可视化分析,帮助研究人员深入掌握卫星通信信道的关键特性与建模流程。; 适合人群:具备Matlab编程能力和通信原理基础知识的高校研究生、科研机构研究人员及从事卫星通信、导航定位、遥感遥测等领域的工程技术人员,特别适用于需要完成相关课题仿真、毕业设计或项目开发的初级与中级科研人员。; 使用场景及目标:①用于教学与课程设计中加深对卫星信号传播机制的理解;②支撑卫星通信系统链路预算、接收机灵敏度分析与抗干扰算法设计;③服务于学术论文撰写、科研项目申报中的仿真验证环节,提供可复用的代码框架与建模思路。; 阅读建议:建议读者结合经典通信理论教材同步学习,重点剖析代码中关于信号调制、信道建模、噪声叠加与接收端解调等模块的实现逻辑,动手运行并调整轨道参数、频率、环境条件等变量,观察信号质量变化,从而深化对卫星信道动态行为的认知。
内容概要:本文系统介绍了2024年最新提出的两种智能优化算法——青蒿素优化算法与霜冰优化算法(RIME),并通过Matlab代码实现对二者进行了深入对比研究。文档不仅阐述了两种算法的核心原理与数学模型,还全面展示了其在电力系统优化、新能源调度、路径规划、机器学习参数调优等复杂工程问题中的应用性能差异。文中涵盖了微电网调度、电动汽车充电优化、无人机三维路径规划、风光互补制氢系统调度等多个前沿科研方向的典型案例,并配套提供了完整的Matlab仿真代码与模型资源,便于读者复现高水平学术论文成果并开展创新性研究。; 适合人群:具备一定编程基础,熟练掌握Matlab/Simulink环境,正在从事智能优化算法相关研究的研究生、高校教师及工程技术人员,尤其适用于专注于能源系统优化、智能交通、智能制造、自动化控制等领域的科研工作者。; 使用场景及目标:①深入理解青蒿素算法与RIME算法的基本思想、迭代机制与收敛特性;②通过实际代码复现EI、顶刊级别论文中的优化模型;③在具体科研项目中对比两类算法的寻优能力、稳定性与计算效率,完成算法选型与改进;④拓展新型优化算法在多能互补系统、智能路径规划、分布式调度等交叉学科中的创新应用。; 阅读建议:建议读者结合网盘提供的完整代码资源,按照文档中给出的应用实例循序渐进地实践操作,重点关注不同场景下的参数设置策略、算法收敛曲线分析与鲁棒性表现,同时关注公众号“荔枝科研社”获取持续的技术支持与更新资料。
内容概要:本文档聚焦于“直流电机双闭环控制Matlab仿真”,系统阐述了基于Matlab/Simulink平台的直流电机双闭环控制系统的设计与仿真方法。重点围绕电流环与转速环的协同控制策略,详细介绍了控制器结构设计、PI参数整定、系统建模及动态响应分析过程,实现了对电机速度和电流的高精度调控。文档充分展示了双闭环控制在提升系统稳定性、加快响应速度和增强抗干扰能力方面的优越性能,并结合电力电子变换器(如Buck电路)的双闭环控制案例,拓展了该技术在实际工程中的应用范围。资源配套完整,适用于理论学习与实践操作相结合的研究需求。; 适合人群:具备自动控制原理基础知识和Matlab/Simulink软件操作能力的高校本科生、研究生,以及从事电机控制、电力电子系统开发等相关领域的工程技术人员。; 使用场景及目标:①深入理解直流电机双闭环控制的核心原理与工程实现方法;②掌握利用Matlab/Simulink进行控制系统建模、仿真与性能评估的关键技能;③为课程设计、毕业论文、科研项目或工业控制系统开发提供可复用的技术方案与仿真参考。; 阅读建议:建议读者结合文档中的Simulink模型文件,边学习边动手实践,重点关注PID控制器的参数调节过程与系统阶跃响应特性,通过对比不同参数下的仿真结果,深化对控制性能影响因素的理解,从而全面提升系统设计与分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值