题目描述
在平面直角坐标系下,台球桌是一个左下角在(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
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int L = sc.nextInt(), W = sc.nextInt(),
x = sc.nextInt(), y = sc.nextInt(),
r = sc.nextInt(), a = sc.nextInt(),
v = sc.nextInt(), s = sc.nextInt();
if(L == 0 && W == 0 && x == 0 && y == 0 &&r == 0 && a == 0 && v == 0 && s == 0){
break;
}
int dis = v * s;
double radians = Math.toRadians(a);
//球心在Y轴和X轴移动的总距离
double disY = Math.abs(Math.sin(radians) * dis), disX = Math.abs(Math.cos(radians) * dis);
double rsX = r, rsY = 0; //表示球心的落点
//Y轴处理
int maxDisY = W - r;
boolean flagUp = (a >= 0 && a <= 180);
while(true){
if(flagUp){ //上升
if(y + disY <= maxDisY){
rsY = y + disY;
break;
}else{
disY = disY - (maxDisY - y);
y = maxDisY;
flagUp = false;
}
}else{ //下降
if(disY <= y){
rsY = y - disY;
break;
}else{
disY = disY - (y - r);
y = r;
flagUp = true;
}
}
}
//X轴处理
int maxDisX = L - r;
flagUp = (a <= 90 || a>= 270);
while(true){
if(flagUp){ //上升
if(x + disX <= maxDisX){
rsX = x + disX;
break;
}else{
disX = disX - (maxDisX - x);
x = maxDisX;
flagUp = false;
}
}else{ //下降
if(disX <= x){
rsX = x - disX;
break;
}else{
disX = disX - (x - r);
x = r;
flagUp = true;
}
}
}
System.out.printf("%.2f %.2f\n", rsX, rsY);
}
sc.close();
}
}
C语言:
#include<stdio.h>
#include<math.h>
int main(){
double L,W,x,y,R,a,v,s;
double dx,dy;
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x,&y,&R,&a,&v,&s)&&(L+W+x+y+R+a+v+s)){
x-=R;
y-=R;
L-=2*R;
W-=2*R;
a*=acos(0.0)/90.0;
dx=fmod(fmod(s*v*cos(a),2*L)+2*L,2*L);
dy=fmod(fmod(s*v*sin(a),2*W)+2*W,2*W);
if(x+dx<=L)
x+=dx;
else if(x+dx<=2*L)
x=L-(x+dx-L);
else
x=x+dx-2*L;
if(y+dy<=W)
y+=dy;
else if(y+dy<=2*W)
y=W-(y+dy-W);
else
y=y+dy-2*W;
printf("%.2f %.2f\n",x+R,y+R);
}
return 0;
}
C++:
#include<iostream>
#include<string>
#include<math.h>
#include<stdio.h>
using namespace std;
int main(){
double l, w, x, y, r, a, v,s;
while(cin>>l>>w>>x>>y>>r>>a>>v>>s){
if(l== 0&&w== 0)
break;
l-= r;
w-= r;
a= a/180*acos(-1.0);
double Sx= v*cos(a)*s+ x;
double Sy= v*sin(a)*s+ y;
while(Sx< r||Sx> l){
if(Sx< r)
Sx= r* 2- Sx;
if(Sx> l)
Sx= l*2- Sx;
}
while(Sy< r|| Sy> w){
if(Sy< r)
Sy= r*2- Sy;
if(Sy> w)
Sy= w*2- Sy;
}
printf("%.2lf %.2lf\n", Sx, Sy);
}
return 0;
}