POJ 2641 Billiard(计算几何)

Description
在a*b的台球桌上打台球,球的初始位置在球桌中心,现在球与长度为a的边(水平方向)碰撞了m次,与长度为b的边(竖直方向)碰撞了n次经过s又回到起点,问球的初速度和方向
Input
多组用例,每组用例包括五个整数a,b,s,m,n分别表示球桌尺寸,碰撞次数以及运动时间,以0 0 0 0 0结束输入
Output
对于每组用例,输出球的初速度和方向
Sample Input
100 100 1 1 1
200 100 5 3 4
201 132 48 1900 156
0 0 0 0 0
Sample Output
45.00 141.42
33.69 144.22
3.09 7967.81
Solution
反射问题,其实就是球在水平方向位移为a*m,竖直方向位移为b*n,用时为t,所以初始运动方向为angle=atan((b*n)/(a*m)),初速度为v=b*n/s/sin(angle)
Code

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
double a,b,s,m,n;
int main()
{
    while(scanf("%lf%lf%lf%lf%lf",&a,&b,&s,&m,&n),a||b||s||m||n)
    {
        double angle=atan((b*n)/(a*m));
        double v=b*n/(s*sin(angle));
        printf("%.2lf %.2lf\n",angle/acos(-1.0)*180,v);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值