测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A41070. 台球碰撞

填空题 较难

题目描述

台球碰撞

题目描述

在平面直角坐标系下,台球桌是一个左下角在(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<=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)。x和y应四舍五入保留两位小数。

样例输入

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 <stdio.h> #include <math.h> int main() { double L,W,x,y,R,a,v,s; double Dx=0,Dy=0; for(int l,w,x0,y0;;) { scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x,&y,&R,&a,&v,&s); if(L==0 && W==0 && x==0 && y==0) break; //输入终止条件 a=a/180.0*acos(-1); //角度转弧度,arccos(-1)==PI l=L-2*R; w=W-2*R; x0=x-R; y0=y-R; //球转化为质点,缩小球台建立新坐标系 Dx=fabs(cos(a)*v*s+x0); Dy=fabs(sin(a)*v*s+y0); //求出在新坐标系中质点相对于左下角原点的偏移量Dx,Dy for(;Dx>2*l;) Dx-=2*l; for(;Dy>2*w;) Dy-=2*w; //去除偏移量中可能存在的周期部分 if(Dx>l && Dx<2*l) Dx=2*l-Dx; else; if(Dy>w && Dy<2*w) Dy=2*w-Dy; else; //求出新坐标系中质点的最终坐标 printf("%.2lf %.2lf\n",Dx+R,Dy+R); //将坐标加上R转化为原坐标系坐标输出 } return 0; }
上一题 下一题