台球碰撞

在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角)。

如果球的速率为vs个时间单位之后球心在什么地方?

输入

输入文件最多包含25组测试数据,每个数据仅一行,包含8个正整数L,W,x,y,R,a,v,s(100<=L,W<=105,1<=R<=5,
R<=x<=L-R, R<=y<=W-R,0<=a<360, 1<=v,s<=105),含义见题目描述。L=W=x=y=R=a=v=s=0表示输入结束,你的程序不应当处理这一行。

输出

对于每组数据,输出仅一行,包含两个实数x, y,表明球心坐标为(x,y)。xy应四舍五入保留两位小数。


样例输入


样例输出


100 100 80 10 5 90 2 23

110 100 70 10 5 180 1 9999

0 0 0 0 0 0 0 0


80.00 56.00

71.00 10.00

# include <cstdio>
# include <cmath>
# include <iostream>
using namespace std;

int main()
{
    double L,W,x,y,R,a,v,s;
    while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x,&y,&R,&a,&v,&s)!=EOF)
    {
        if(L==0)    break;
        //将球看成一个点;
        x-=R,y-=R,L-=2*R,W-=2*R;
        //将角度换为弧度;
        a*=acos(0.0)/90;
        //计算经过多少个来回,fmod函数求模;
        //速度分解;
        double dx = fmod(fmod(v*s*cos(a), L*2)+L*2, L*2);  //防止出现负数,所以先加上L*2;
		double dy = fmod(fmod(v*s*sin(a), W*2)+W*2, W*2);
		//dx,dy都是大于零的;
		if(x+dx <= L)     x += dx;

		else if(x+dx <= L*2)   x = L-(x+dx-L);

		else    x = x+dx-L*2;

		if(y+dy <= W)      y += dy;

		else if(y+dy <= W*2)      y = W-(y+dy-W);

		else    y = y+dy-W*2;

		printf("%.2lf %.2lf\n", x+R, y+R);
    }
    return 0;
}
时间: 2024-10-19 13:44:29

台球碰撞的相关文章

NYOJ 665 台球碰撞

台球碰撞 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角). 如果球的速率为v,s个时间单位之后球心在什么地方? 输入 输入文件最多包含25组测试数据,每个数据仅一行,包

HPU1166 台球碰撞

1166: 台球碰撞 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 21  Solved: 5 [Submit][Status][Web Board] [Edit] Description 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹

2544: 台球碰撞

2544: 台球碰撞 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 98  Solved: 22[Submit][Status][Web Board] Description 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率

基于Seajs的可控台球碰撞游戏

前言 不记得哪个黑色星期五,贪吃鱼基本完工的时候,产品突然增加需求,要求金币扔出去后不消失,互相可碰撞,其最终结果还要由服务器控制(没错,至今做的所有游戏都有幕后黑手,=W=). 对于碰撞以前只写过一个球到处碰墙壁的,小球之间的碰撞倒是没有接触,想到他们碰撞过程中的角度变化.速度分配,就不敢往下想了,于是马上想到box2d这个牛逼哄哄的引擎. 但是,使用物理引擎虽然高效.逼真,但所有碰撞都是不可控,包括最终的落点.所以引擎不能解决这次遇到的需求. 不能用引擎,咱自己写也不怕,反正当年物理和高数都

湖南省第6届程序大赛第4题

题目D 台球碰撞 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形.有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内).受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角). 如果球的速率为v,s个时间单位之后球心在什么地方? 输入 输入文件最多包含25组测试数据,每个数据仅一行,包含8个正整数L,W,x,y,R,a,v,s(100<=L,W<=10

javascript运动系列第九篇——碰撞运动

× 目录 [1]碰撞检测 [2]无损碰撞 [3]有损碰撞 前面的话 碰撞可以分为碰壁和互碰两种形式,上篇介绍了碰壁运动,本文将从浅入深地介绍碰撞运动的互碰形式 碰撞检测 对于互碰形式的碰撞运动来说,首先要解决的是碰撞检测.对于矩形元素的碰撞检测前面的博文已经详细介绍过,下面主要介绍圆形元素的碰撞检测 矩形元素的碰撞检测利用九宫格分析法,而圆形元素的碰撞检测则简单很多,判断两个圆形元素的半径之和是否大于两个圆形元素的圆心点坐标之间的距离即可 由示意图可知,元素一的圆心位置为(x1,y1),半径为r

台球游戏的核心算法和AI(2)

前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合html5的学习笔记: • box2dweb 学习笔记--sample讲解  这篇文章, 具体讲解台球游戏的box2d模型抽象, 并给出一个初步版本. 演示: 台球游戏的雏形如下所示: 该台球游戏, 改编自box2dweb的demo程序, 可用鼠标拖动球来移动. 代码的下载链接: http://pan.b

台球游戏的核心算法和AI(1)

前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见当时的JAVA水平真的不咋地, 时过进迁, 还是一样的不咋地. 这边是当时的CSDN下载链接: java(台球游戏), 实现比较简单. 后来写过一个版本, 比这个要强大许多, 可惜源码丢失了. 效果展示入下图所示: 本文想讲述下台球游戏中核心算法的实现, 以及游戏AI的设计技巧. 当然自己也有个小愿望,

人工智能与斯诺克的碰撞,会产生什么样的化学反应呢?

人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学.其实简单说,就是让机器模拟人的各种能力,完成原来只有人类才能完成的任务.人工智能在多个领域已经带给我们非常便捷的生活体验,那么人工智能与斯诺克这项运动又会碰撞出怎样的火花?-在此之前我们先来探讨一个问题为什么斯诺克这项运动对于大多数人来说只是用来"看的"??我想对于非常多的台球爱好者来说,在球房打斯诺克的体检感非常差.传统