参考 学明 的代码,他的判定方法看不太懂
解题思路:由于完全弹性碰撞,每次碰撞边界之后,小球只改变了速度方向,其他并没有改变。因此已知速度、入射角、时间之后,小球在X、Y轴上行走的总路程是确定的,且X、Y轴独立互不干扰。
所以可以先考虑在X轴上小球的运动,再推广到Y轴上即可。
判定方法:球心在X轴上的移动范围为[R,L-R], 先计算出在X方向的运动总路程vx*s(带方向),并将球心运动后坐标计算得dx=x+vx*s,dx分为三种情况考虑:
dx>L-R,此时球碰撞到右边界,运动方向改变,剩余运动路程为dx-(L-R),重新计算dx=(L-R)-[dx-(L-R)]即2L-2R-dx;
dx
R
Y轴判定方法同X轴。
参考代码:#include
#include
void hit(double L,double W, double x, double y, double R, double a, double v, double s)
{
double vx, vy;
a = a*asin(1)/90;//角度转换为弧度
vy = v*sin(a);
vx = v*cos(a);
double dx, dy;
dx = x + vx*s;
dy = y + vy*s;
while(1){
if(dx>=R&&dx<=L-R) break;
else if(dx>L-R){
dx = 2*L-2*R-dx;
}
else if(dx
dx = 2*R-dx;
}
}
while(1){
if(dy>=R&&dy<=W-R) break;
else if(dy>W-R){
dy = 2*W-2*R-dy;
}
else if(dy
dy = 2*R-dy;
}
}
printf("%.2lf %.2lf\n", dx, dy);
}
int main()
{
double L, W, x, y, R, a, v, s;
scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &L, &W, &x, &y, &R, &a, &v, &s);
while(!(L==0&&W==0&&x==0&&y==0&&R==0&&a==0&&v==0&&s==0)){
hit(L, W, x, y, R, a, v, s);
scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &L, &W, &x, &y, &R, &a, &v, &s);
}
return 0;
}