两小球围绕大球做大圆匀速运动,自始至终,小球球心与大球球心距离都是10,小球半径是1,球1沿着赤道运动,速度为1,初始位置在(0,10,0)位置,但运动方向未知从东半球开始还是西半球开始,球2沿着90度经线圈,速度为2,初始位置北极极点(0,0,10),运动方向亦是未知从东半球还是西半球开始。
问:1、这两球会相撞吗?
2、如果相撞,他们成立的条件是什么?各个运动方向要经过多少时间?他们的相撞一刹那坐标是多少?
问:1、这两球会相撞吗?
2、如果相撞,他们成立的条件是什么?各个运动方向要经过多少时间?他们的相撞一刹那坐标是多少?
1、数学,立体几何,这是主要的。
2、物理,只要会v=s/t。
小球2的相位就是 fai = PI/2 + n2 * PI 对应 2 * t n2 和 n1为整数 这个方程组无解
同理在相位为 3*PI/2的地方相撞 也是无解回帖比较少 考虑欠佳 希望指正
n2 + 1.5 = 2n1 + 3的样子
反正方程左边肯定是小数 方程右边肯定是整数 所以n1 n2无解 所以不可能
N1 N2是想撞的时候 走过了多少圈。
有才.
1.先建立球1和球2的球坐标运动方程,未知量为运行时间t,还有两球角速度关系系数设为w;
2.再通过空间两点间距离公式求出两球随时间变化的球心距离d(d是t的函数),
则两小球球面间最小距离是(d-1*2)---因小球半径为1,
当两球碰撞时,有条件d=0可得一个方程;
3.联立上面两个条件所得的方程,应该能解出t。
a.如果t无解,说明不会相撞。
b.如果t是一个表达式,就是说有无穷解,可以知道在什么条件下相碰。
c.如果t唯一,则只有一次碰撞机会。
这时通过运行时间t可以求出两球的坐标。上面说的只是大概的解题方向,具体答案还得靠达人,这种东西也就考研的时候琢磨过。上面的是数学解法,但耐心想一想它的整个运行过程,觉得他们不会碰一起。球1到90度经线的时候才有机会碰撞,但每次球1到90度经线的时候,球2总在南极点!!!
(10*PI*(n+1/4)/1=(10*PI*(m+1/4)/2 或 (10*PI*(n+3/4)/1=(10*PI*(m+1/4)/2
n、m为圈数,可以不一样,两球到达交点时的时间相同即可
由此得解,4m=8n+1, 4m=8n+5, 无解,所以不会发生碰撞
球一跑n个1/2圈时候球二必须跑奇数个1/4圈才可能相撞
假设球一跑了n圈则跑动距离 2n个1/2圈 ,球二距离8n个1/4圈,
因为 8n 不能等于 奇数,所以不能相撞!可能考虑不周,这是我的计算结果!
或者:(-10cos(t/10),-10 sin(t/10),0)
球二的每一时刻坐标为:(10cos(t/5),0,10 sin(t/5))
或者:(-10cos(t/5),0,-10 sin(t/5))二者要相撞只能在(10,0,0)和(-10,0,0)处接下来的事就有计算机来完成了
球一的每一时刻坐标为:东半球开始:(10cos(t/10) ,10 sin(t/10) ,0)
或者:西半球开始:(-10cos(t/10),-10 sin(t/10),0)
球二的每一时刻坐标为:东半球开始:(10cos(t/5) ,0 ,10 sin(t/5) )
或者:西半球开始:(-10cos(t/5) ,0 , -10 sin(t/5))
二者要相撞只能在(10,0,0)和(-10,0,0)处
即sin(t/10)=0且,sin(t/5)=0 得:t=10×k×PI k=0,1,2,3,4 ……
代入t得:10cos(t/5)=10,-10cos(t/5)=-10
有四种可能组合:
一东二东:10cos(t/10)= 10cos(t/5)=10 得:t=10×k×PI k=0,2,4,6,8 ……
一东二西:10cos(t/10)= -10cos(t/5)=-10 得:t=10×k×PI k=1,3,5,7,9 ……
一西二东:-10cos(t/10)= 10cos(t/5)=10 得:t=10×k×PI k=1,3,5,7,9 ……
一西二西:-10cos(t/10)= -10cos(t/5)=-10 得:t=10×k×PI k=0,2,4,6,8 ……
对应组合对应时间 t 会相撞
小球2的相位就是 fai = PI/2 + n2 * PI 对应 2 * t n2 和 n1为整数 这个方程组无解
同理在相位为 3*PI/2的地方相撞 也是无解
球一的时刻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
解此不等式,如果有解,则那个最小解即为所求,然后根据其求出坐标(有兴趣的朋友可以试着解一下)。但是,根据题意大概想一下的话,两个球的运动规律和自身的大小决定了它们不会相交。所以此不等式应该也没有解。
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;也到不了。
所以相遇不了。
另一个相遇地点是一样的。
http://www.cnki.com.cn/Article/CJFDTotal-GSGS200702028.htm
球心1的轨迹:(R*cosθ*cos(t/2*pi*R),R*cosθ*sin(t/2*pi*R),0) θ=0,半径R是10
同理,球心2的轨迹:(R*cos(t/2*pi*R-pi/2)*cos&,R*cos(t/2*pi*R-pi/2)*sin&,R*sinθ)
&=[0,2*pi];
这只是球心,考虑球半径为1的话,就比较麻烦了。我只理解了这么些,其余的就请教高手吧。
首先定义一个小球的对象Ball,实现一个获取坐标的方法getPoint(int speed,int timenum),然后每秒循环计算两个小球的坐标之间的距离是否会小于2就行了,至于方法怎么实现那就要数学功底,这也是数学问什么重要的原因吧;
然后结果是否会碰撞和时间都不是你要考虑的,那是计算机的事;
http://www.xiaochuncnjp.com/bbs/viewthread.php?tid=922016&extra=page%3D1看图就会有思路了球1,2 在转第一圈的时候绝对不会碰撞, 但是感觉在n圈之后就有可能碰撞 因为第一圈之后 两个球产生了时间差 有空的时候模拟一下
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("不会相撞");
}
}
因此球1跑到(0,10,0),(0,-10,0)的时间应该是0,20,40,60,80......{y=20*(n-1)}(n为整数)
球2跑到(0,10,0),(0,-10,0)的时间应该是5,15,25,35,45......{y=5+(n-1)*10}(n为整数)
当20*(n-1)=5+(n-1)*10时,得到n等于1.5,所以不满足 (n为整数),故不能相撞