`
lvmlvy_1983
  • 浏览: 29567 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
问题:
两小球围绕大球做大圆匀速运动,自始至终,小球球心与大球球心距离都是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.} 
分享到:
评论

相关推荐

    C++小球碰撞C++ 小球碰撞

    C++ 小球碰撞 C++ 小球碰撞 C++ 小球碰撞

    VC++模拟小球碰撞

    利用VC++6.0 MFC 模拟小球碰撞过程,可设置两个小球的速度

    小球碰撞课程设计小球碰撞

    小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 ...

    C语言实现的小球碰撞程序

    用C语言写的两个小球碰撞后反弹的程序,可以稍加修改成为自己的程序,希望您能够继续完善算法。

    ege库实现物理小球碰撞V1.0

    使用ege库实现界面显示,自己编写的物理碰撞效果库,可以计算小球的碰撞后速度,并更新小球的状态,不过有些许BUG需要改进:比如给小球加上重力后小球的行为比较诡异,会粘连甚至重叠。

    面向对象程序设计 两个小球碰撞演示

    两个小球碰撞演示 二、使用工具软件: Visual C++ 6.0 1、程序思想 输入两个小球的质量和速度,创建两个小球对象,设置相应的参数创建碰撞演示。碰撞演示负责显示图形和碰撞过程。 3、程序简要说明: (1)、//绘制...

    XNA 4.0 2D 多球体碰撞检测算法

    通过两个球心的距离和半径的关系来实现碰撞检测。 需要注意的一点是两球在碰撞时需要根据碰撞点的位置和角度调整球的位置,如果不调整位置会导致出现两球粘在一起的情况。 两球碰撞后速度改变是基于假设球体质量相同...

    碰撞的小球FLASH学习

    两个小球相向碰撞后反弹,其中有按钮的控制,可以随时停止,随时播放,只要是学习按钮的使用

    canvas小球碰撞.html

    canvas小球碰撞 类似屏保小球

    android 两球或多球碰撞检测实例

    android 两球或多球碰撞检测实例, 对于初学碰撞检测原理还是很有帮助的。

    多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞

    多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续动态碰撞多球连续...

    小球碰撞碰撞代码

    小球的碰撞时互相能量交换 含代码

    OPENGL三维小球碰撞源程序

    该小程序是用Visual 中的OPENGL 做的三维小球碰撞程序,特别适合新入门者学习借鉴。

    易语言球体碰撞例程

    易语言球体碰撞例程源码,球体碰撞例程

    matlab 3d空间的 球碰撞模拟

    matlab 3d空间的 球碰撞模拟

    Java实现小球碰撞检测

    Java 小球碰撞 碰撞检测 碰撞引擎,看了一些网上的例子,然后实现了一种小球碰撞的算法,是使用平面向量和冲量守恒完成的。

    Android小球碰撞游戏

    一个小游戏,游戏中玩家通过触屏产生小球,触碰的时间控制小球的大小,释放时的...小球产生过程中被其它小球碰撞则游戏结束。游戏任务是产生有限个小球占满一定比例的空间。游戏中会有各种小道具帮助玩家完成任务……

    基于c++MFC实现的小球碰撞

    输入小球的数量,大小及速度后,点击完成进入运行模态框,点击初始后,点击运行即可

    小球碰撞演示程序C++

    小球碰撞演示程序C++,利用牛顿第二定律。

    matlab模拟各种情形下小球碰撞的动态图.zip

    两个代码,用matlab分别演示单个小球在方框内发生完全弹性碰撞和3个小球在方框内发生完全弹性碰撞(考虑小球之间碰撞),每次碰撞都显示对应冲量。

Global site tag (gtag.js) - Google Analytics