两球碰撞的计算,有兴趣的来看看

问题:
两小球围绕大球做大圆匀速运动,自始至终,小球球心与大球球心距离都是10,小球半径是1,球1沿着赤道运动,速度为1,初始位置在(0,10,0)位置,但运动方向未知从东半球开始还是西半球开始,球2沿着90度经线圈,速度为2,初始位置北极极点(0,0,10),运动方向亦是未知从东半球还是西半球开始。
问:1、这两球会相撞吗?
2、如果相撞,他们成立的条件是什么?各个运动方向要经过多少时间?他们的相撞一刹那坐标是多少?

我的解答:
根据题目的要求,两球肯定不会相撞;
但是由题目引申下去,两个球的速度不固定的情况该如何解决?其实只要建立坐标轴,知道坐标,然后计算两个坐标点的距离是不是小于两球半径之和就可以了;
这涉及到立体几何的知识,我觉得可以以两球运动轨迹的交点所在的直线为y轴,以慢的小球的所在的平面为xy平面建立坐标轴;

以下是用java实现的代码(如果高手看见,希望能够提点意见,包括编码规范等,先谢了):
1.package test;   
2.
3.import java.text.DecimalFormat;
4.
5.public class Ball {
6. private static final double pi = Math.PI;
7. private static final double CR = 10; //大球半径
8.
9.
10. private double plansAngle;//轨迹平面与xy平面所成角度
11. private double startPoint;//起始位置的角度
12. private int speed;
13. private int forward;//顺时针-1,逆时针1
14.
15. public Ball(double plansAngle,double startPoint,int speed,int forward){
16. this.plansAngle = plansAngle;
17. this.startPoint = startPoint;
18. this.speed = speed;
19. this.forward = forward;
20. }
21. //获取坐标
22. public double[] getPoint(long timenum){
23. DecimalFormat mydf = new DecimalFormat("#0.00");
24. double[] point = new double[3];
25. double nowPoint = startPoint+(forward*speed*timenum)/CR;//现在位置角度
26. point[0] = Double.parseDouble(mydf.format(CR*Math.cos(nowPoint)*Math.cos(plansAngle)));
27. point[1] = Double.parseDouble(mydf.format(CR*Math.sin(nowPoint)));
28. point[2] = Double.parseDouble(mydf.format(CR*Math.cos(nowPoint)*Math.sin(plansAngle)));
29. return point;
30. }
31. //获取两点之间距离
32. public static double getLine(double[] d1,double[] d2){
33. double l0 = Math.abs(d1[0]-d2[0]);
34. double l1 = Math.abs(d1[1]-d2[1]);
35. double l2 = Math.abs(d1[2]-d2[2]);
36. return Math.sqrt(l0*l0+l1*l1+l2*l2);
37. }
38. //获取一个循环所用时间
39. public static int gettimeOneCircle(int num,int speed){
40. return (int)(2*pi*CR*num/speed)+1;
41. }
42.
43. //以慢的小球运动轨迹建立坐标的xy平面,该球初始角度为pi/2;
44. //快的小球的运动轨迹平面与xy平面所成角度为pi/2;该球起始角度为0;
45. public static void main(String[] args){
46. boolean ping = false;
47. Ball sb = new Ball(0,pi/2,1,1);
48. Ball bb = new Ball(pi/2,0,2,1);
49. //获取一个循环的时间,即慢的球走一圈,快的球走两圈,正好回到原来位置
50. int maxtime = gettimeOneCircle(1,1);
51. for(int i=0;i<maxtime;i++){
52. double[] d1 = sb.getPoint(i);
53. double[] d2 = bb.getPoint(i);
54. double rd = getLine(d1, d2);
55. if(rd<=2){
56. System.out.println(i+"秒相撞,距离"+rd);
57. System.out.println("sb"+d1[0]+"-"+d1[1]+"-"+d1[2]);
58. System.out.println("bb"+d2[0]+"-"+d2[1]+"-"+d2[2]);
59. ping = true;
60. break;
61. }
62. if(i%86400==0)
63. System.out.println(i/86400+"天未相撞");
64. }
65. if(!ping)
66. System.out.println("不会相撞");
67. }
68.
69.}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值