原题链接:台球碰撞
参考 学明 的代码,他的判定方法看不太懂
解题思路:由于完全弹性碰撞,每次碰撞边界之后,小球只改变了速度方向,其他并没有改变。因此已知速度、入射角、时间之后,小球在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,此时球碰撞到左边界,运动方向改变,剩余运动路程为R-dx,重新计算dx=R+(R-dx)即2R-dx;
R<dx<L-R,此时球停在区域中,运动结束。
Y轴判定方法同X轴。
参考代码:
#include <stdio.h> #include <math.h> 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<R){ 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<R){ 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; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复