haoxiaobo

从C到C++又到.net, 有一些心得, 和大家交流下...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

利用简单的力学法则来模拟天体运行

Posted on 2013-10-14 14:19  HAL9000  阅读(2399)  评论(18编辑  收藏  举报

Hi,各位,又是我。

昨天我发表了我写的泡泡屏保的设计思路,以及源码(http://www.cnblogs.com/haoxiaobo/p/3366625.html),写完文章后,我想,写一个也是写,不如再在这个框架的基本上修改出来一个模拟天体运行的程序,来看看是不是根据简单的万有引力定律,星星间是否就真得会绕着转?

于是,这就是我昨天一下午的成果……

有关技术方面的东西,上一个文章里已经很完整了,不再多讨论了,讨论一些其他方面的事情吧。

首先,您注意到我那些漂亮的星星了吗?

星星上有一层模糊的大气层也!这回是用了圆形路径加路径渐变画笔做的。GDI+简直就是一个可编程的Photoshop!我还想什么时候再加上个星星贴图,把真正的照片贴上去,那就更更酷了!

好吧,美术效果放一边去。

 

星体的运动计算

 

每次计算时,先计算与其他星体间的引力大小,引力对自己产生加速度,加速度在一个计算周期里对速度的影响(还是平行四边形法则),然后改变速度。

把速度乘以这个计算周期以来所流逝的时间,然后在x,y两个方向上影响到位置上。

 

这个程序更有趣的用处还有什么呢?

程序里的太空是用真实的数据来计算的,1就是1m,就是1秒,只是在绘制时进行缩放与变换。

为了验证程序是不是正确,我定义了太阳和九大行星,把从维基百科里找出来的行星轨道半径、质量、速度放进去,然后让我的太阳系运行,结果你猜如何? 地球真得365天转了一周!月亮也会28天绕地球一周!水星是90左右,等等。

所以,可以用来玩一些有意思的……

 

在地球的L3点加入一颗对称的行星如何?

太阳系里撞入一个另一个与太阳差不多大的恒星,会发生什么事情?

放入一个由反物质(负质量)组成的行星会如何?

试试《三体》里说的那种乱世界,看看三颗恒星在一起会轨道如何?

试试看在同一个轨道上等距离地放8个行星,能不能形成一个稳定的天体系统?

有科学家说,万有引力常数只要调整大一点点或是小一点点,现在的星系就不会形成。试试看呢?

 

下图是我在太阳系里放进去了另一个太阳的结果,结果行星们被弄得乱七八糟,一些行星被坏太阳的引力抛出了太阳系,向着无尽的夜空不归地前行……

还有一些好玩的热键功能

相机跟随:就是总是把镜头定在一个星体上,跟着看。

切换参考系:就是把正在跟随的星体设为绝对不动,所有其他星体的位置都以它为参考——也就是相当于你站在这个星星上啦。

 

好吧还有一些没有做到的事情……

1.贴图质材。

2.对引力沿路径积分:我使用的是万有引力公式来计算两个星体之间的引力,但在计算时,由于距上次计算时间已经过去了一段长度,这段时间里,引力的大小与方向都在变化,而且与星体受力后走过的路径有关。我知道最好的办法是用积分,但是我的高数知识都忘光光啦!所以就只好用线性的方法来算,也就是只是按周期终态的情况,用加速度时间,然后再加到速度上,然后再简单地用速度乘周期时间,再加到位置上。

结果就是时间倍数越快,运动误差就越大。时间倍数越慢,误差就小。

如果能积分一下什么的,误差应该就会大幅减少。那怕是算是一个中间值也会精确一点。

但就先这样吧。

 

3.两星相撞时,应该合而为一,动量合并。但是我现在没处理这个,于是两星就会被引力弹弓唰地一下抛出屏幕,这个很不科学,不好意思。

 

4.只在一个平面里计算,没考虑Z维度。

 

一点感触:一天的工作比得上古人几十年

除了其中没有用积分的事儿之外,现代程序员一下午用计算机对天体运行进行的研究,所得到的成果,可能能超出了古代科学家几十年的认识。牛顿引力公式本来是简单的初级算术公式,这个公式会导致行星轨道是什么样呢?于是伟大的牛顿发明了微积分,经过计算发现是个椭圆。但我这个只懂初等数学的高中缀学生,花一下午就能用计算机模拟出来一个世界,把行星当玩撞球一样抛进引力场中来回观察结果。

所以说科学的进步绝对是爆炸式的加速进行的,只要信仰科学,好日子就在前头!

 

下载源码: https://files.cnblogs.com/haoxiaobo/StarsScreenSaver.rar