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;
}

你可能感兴趣的:(POJ 2641 Billiard(计算几何))