1. 程式人生 > >兩球碰撞的計算,有興趣的來看看

兩球碰撞的計算,有興趣的來看看

問題:
兩小球圍繞大球做大圓勻速運動,自始至終,小球球心與大球球心距離都是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.}