首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

两球碰撞的计算,有兴趣的来看看,该如何解决

2012-03-26 
两球碰撞的计算,有兴趣的来看看两小球围绕大球做大圆匀速运动,自始至终,小球球心与大球球心距离都是10,小

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

[解决办法]
上面的答案理解错误,下面是更正的:

球在t时刻转过的角度:a=vt/r 
球一的时刻t的坐标为:东半球开始:(10cos(t/10) ,10sin(t/10) ,0) 
或者:西半球开始:(-10cos(t/10),-10sin(t/10),0) 
球二的时刻t的坐标为:东半球开始:(0 ,10cos(t/5) ,10 sin(t/5)) 
或者:西半球开始:(0 ,-10cos(t/5) ,-10 sin(t/5)) 
二者要相撞只能在(0,10,0)和(0,-10,0)处 
即sin(t/10)=0且,cos(t/5)=0 得:t=5k×PI k=1,3,5,7,9 …… 
代入t得:10cos(t/5)=-10,-10cos(t/5)=10 
有四种可能组合: 
一东二东:10sin(t/10)=10cos(t/5)=-10 得:t=5k×PI k=3,7,11,15,19 …… 
一东二西:10sin(t/10)=-10cos(t/5)=10 得:t=5k×PI k=1,5, 9,13,17 …… 
一西二东:-10sin(t/10)=10cos(t/5)=-10 得:t=5k×PI k=1,5, 9,13,17 …… 
一西二西:-10sin(t/10)=-10cos(t/5)=10 得:t=5k×PI k=3,7,11,15,19 …… 
对应组合对应时间 t 会相撞
[解决办法]
设:
R为大球半径
r为小球半径
t为经过的时间
w为小球角速度
则有以下不等式
((Sin(2wt))2 + (Cos(wt))^2 + (Cos(2wt)-Sin(wt))^2) < ((2*r)/(R+r))^2
化简一下就是
((Sin(t)2 + (Cos(t))^2 + (Cos(2t)-Sin(t))^2) < ((2*1)/(10+1))^2
解此不等式,如果有解,则那个最小解即为所求,然后根据其求出坐标(有兴趣的朋友可以试着解一下)。

但是,根据题意大概想一下的话,两个球的运动规律和自身的大小决定了它们不会相交。所以此不等式应该也没有解。
[解决办法]
根据俩球的运动轨迹,他们可以相遇的地方有2个(10,0,0)和(-10,0,0)
A(0,0,10)B(0,10,0)
根据相遇地点可以分为2种情况;(A球在北极,B球在赤道)
1)相遇在(10,0,0)。此种情况又可以各自选择运动方向分为4种情况。
第一种:A和B全部往西(左西右动,均以A,B开始位置切线为准),以1/4圆周为1,时间T后相撞,那么A球运动的距离为T,设T=X+1。X必为4的倍数。B球运动的距离为2T,2T=2X+2;2X为4的倍数(一圈)。剩下2,为半圈,根本就到不了(10,0,0);
第2种:A往西,B往东。对于A来说。时间T=X+1;B:2T=2X+2=M+3;M应该为4的倍数;2X,M都是4的倍数,他们相减是不可能为1的。所以也到不了。
第3种:全部往东,可以和第一种类比,也是到不了的。
第4种:A往东,B往西。时间T。A:T=X+3;B:2X+6=2X+4+2;也到不了。
所以相遇不了。
另一个相遇地点是一样的。
[解决办法]
package test;

import java.text.DecimalFormat;

public class Ball {
private static final double pi = Math.PI;
private static final double CR = 10; //大球半径


private double plansAngle;//两球轨迹平面所成角度
private double startPoint;//起始位置的角度
private int speed;
private int forward;//顺时针-1,逆时针1

public Ball(double plansAngle,double startPoint,int speed,int forward){
this.plansAngle = plansAngle;
this.startPoint = startPoint;
this.speed = speed;
this.forward = forward;
}
//获取坐标
public double[] getPoint(long timenum){
DecimalFormat mydf = new DecimalFormat("#0.00");
double[] point = new double[3];
double nowPoint = startPoint+(forward*speed*timenum)/CR;//现在位置角度
point[0] = Double.parseDouble(mydf.format(CR*Math.cos(nowPoint)*Math.cos(plansAngle)));
point[1] = Double.parseDouble(mydf.format(CR*Math.sin(nowPoint)));
point[2] = Double.parseDouble(mydf.format(CR*Math.cos(nowPoint)*Math.sin(plansAngle)));
return point;
}
//获取两点之间距离
public static double getLine(double[] d1,double[] d2){
double l0 = Math.abs(d1[0]-d2[0]);
double l1 = Math.abs(d1[1]-d2[1]);
double l2 = Math.abs(d1[2]-d2[2]);
return Math.sqrt(l0*l0+l1*l1+l2*l2);
}
//获取一个循环所用时间
public static int gettimeOneCircle(int num,int speed){
return (int)(2*pi*CR*num/speed)+1;
}

//以慢的小球运动轨迹建立坐标的xy平面,该球初始角度为pi/2;
//快的小球的运动轨迹平面与xy平面所成角度为pi/2;该球起始角度为0;
public static void main(String[] args){
boolean ping = false;
Ball sb = new Ball(0,pi/2,1,1);
Ball bb = new Ball(pi/2,0,2,1);
//获取一个循环的时间,即慢的球走一圈,快的球走两圈,正好回到原来位置
int maxtime = gettimeOneCircle(1,1);


for(int i=0;i<maxtime;i++){
double[] d1 = sb.getPoint(i);
double[] d2 = bb.getPoint(i);
double rd = getLine(d1, d2);
if(rd<=2){
System.out.println(i+"秒相撞,距离"+rd);
System.out.println("sb"+d1[0]+"-"+d1[1]+"-"+d1[2]);
System.out.println("bb"+d2[0]+"-"+d2[1]+"-"+d2[2]);
ping = true;
break;
}
if(i%86400==0)
System.out.println(i/86400+"天未相撞");
}
if(!ping)
System.out.println("不会相撞");
}

}

热点排行