提交 597a3616 编写于 作者: M march3

三体运行模拟器

上级 431085b7
...@@ -51,7 +51,7 @@ def mayavi_run(bodies, dt=SECONDS_PER_WEEK, ...@@ -51,7 +51,7 @@ def mayavi_run(bodies, dt=SECONDS_PER_WEEK,
mlab.show() mlab.show()
def mpl_run(bodies, dt=SECONDS_PER_WEEK, gif_file_name=None): def mpl_run(bodies, dt=SECONDS_PER_WEEK, gif_file_name=None, gif_max_frame=200):
""" """
:param bodies: 天体 :param bodies: 天体
...@@ -62,7 +62,8 @@ def mpl_run(bodies, dt=SECONDS_PER_WEEK, gif_file_name=None): ...@@ -62,7 +62,8 @@ def mpl_run(bodies, dt=SECONDS_PER_WEEK, gif_file_name=None):
from simulators.mpl_simulator import MplSimulator from simulators.mpl_simulator import MplSimulator
body_sys = System(bodies) body_sys = System(bodies)
simulator = MplSimulator(body_sys) simulator = MplSimulator(body_sys)
simulator.run(dt, gif_file_name)
simulator.run(dt, gif_file_name=gif_file_name, gif_max_frame=gif_max_frame)
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -21,11 +21,10 @@ class MayaviSimulator(Simulator): ...@@ -21,11 +21,10 @@ class MayaviSimulator(Simulator):
super().__init__(bodies_sys, MayaviView) super().__init__(bodies_sys, MayaviView)
@mlab.animate(delay=100, ui=True) @mlab.animate(delay=100, ui=True)
def run(self, dt): def run(self, dt, **kwargs):
f = mlab.gcf() f = mlab.gcf()
while True: while True:
self.evolve(dt) self.evolve(dt)
# Updating scene...
f.scene.render() f.scene.render()
yield yield
......
...@@ -30,7 +30,7 @@ class MplSimulator(Simulator): ...@@ -30,7 +30,7 @@ class MplSimulator(Simulator):
""" """
保存 GIF 文件 保存 GIF 文件
:param dt: 单位:秒,按时间差进行演变,值越小越精确,但演变速度会慢。 :param dt: 单位:秒,按时间差进行演变,值越小越精确,但演变速度会慢。
:param gif_max_frame: 导出的 gif 的最多帧数 :param gif_max_frame: 导出的 gif 文件的画面帧数
:param gif_file_name: 导出的 gif 文件名 :param gif_file_name: 导出的 gif 文件名
:return: :return:
""" """
...@@ -44,21 +44,26 @@ class MplSimulator(Simulator): ...@@ -44,21 +44,26 @@ class MplSimulator(Simulator):
def update(num): def update(num):
body_views = views_frames[num] body_views = views_frames[num]
print("GIF 生成进度:%d/%d %.2f" % (num + 1, gif_max_frame, ((num + 1) / gif_max_frame) * 100) + "%") print("\rGIF 生成进度:%d/%d %.2f" % (num + 1, gif_max_frame, ((num + 1) / gif_max_frame) * 100) + "%", end='')
return self.show_figure(ax, body_views, pause=0) return self.show_figure(ax, body_views, pause=0)
ani = animation.FuncAnimation(fig=fig, func=update, frames=np.arange(0, gif_max_frame), interval=1) ani = animation.FuncAnimation(fig=fig, func=update, frames=np.arange(0, gif_max_frame), interval=1)
ani.save(gif_file_name) ani.save(gif_file_name)
def run(self, dt, gif_file_name=None): def run(self, dt, **kwargs):
""" """
:param dt: 单位:秒,按时间差进行演变,值越小越精确,但演变速度会慢。 :param dt: 单位:秒,按时间差进行演变,值越小越精确,但演变速度会慢。
:param gif_file_name: 导出的 gif 文件名,如果为空,则显示动画 :param kwargs:
gif_file_name: 导出的 gif 文件名,如果为空,则显示动画
gif_max_frame: 导出的 gif 文件的画面帧数
:return: :return:
""" """
gif_file_name = kwargs["gif_file_name"] if "gif_file_name" in kwargs else None
gif_max_frame = kwargs["gif_max_frame"] if "gif_max_frame" in kwargs else None
if gif_file_name is not None: if gif_file_name is not None:
self.save_as_gif(dt, gif_max_frame=200, gif_file_name=gif_file_name) self.save_as_gif(dt, gif_max_frame=gif_max_frame, gif_file_name=gif_file_name)
return return
fig = plt.figure('天体模拟运行效果', figsize=(16, 12)) fig = plt.figure('天体模拟运行效果', figsize=(16, 12))
...@@ -113,8 +118,6 @@ class MplSimulator(Simulator): ...@@ -113,8 +118,6 @@ class MplSimulator(Simulator):
if __name__ == '__main__': if __name__ == '__main__':
# TODO: 注意:显示动态图,需先进行以下设置:
# Pycharm::File –> Settings –> Tools –> Python Scientific –> Show plots in tool window(取消打勾)
from scenes.func import mpl_run from scenes.func import mpl_run
from bodies import Sun, Earth from bodies import Sun, Earth
from common.consts import SECONDS_PER_WEEK from common.consts import SECONDS_PER_WEEK
...@@ -132,6 +135,12 @@ if __name__ == '__main__': ...@@ -132,6 +135,12 @@ if __name__ == '__main__':
Earth(name='地球', init_position=[0, -349597870.700, 0], init_velocity=[15.50, 0, 0], Earth(name='地球', init_position=[0, -349597870.700, 0], init_velocity=[15.50, 0, 0],
size_scale=4e3, distance_scale=1), # 地球放大 4000 倍,距离保持不变 size_scale=4e3, distance_scale=1), # 地球放大 4000 倍,距离保持不变
] ]
gif_file_name = None # 显示动画 # 保存 GIF,参数为指定保存 GIF 文件以及文件的画面帧数
# gif_file_name = 'bodies_run.gif' # 保存 GIF 文件 gif_file_name, gif_max_frame = 'bodies_run.gif', 200
mpl_run(bodies, SECONDS_PER_WEEK, gif_file_name)
# 只显示动画,不保存 GIF 文件。注释掉以下代码,则使用上面的参数
# TODO: 注意:显示动态图,需先进行以下设置:
# Pycharm::File –> Settings –> Tools –> Python Scientific –> Show plots in tool window(取消打勾)
gif_file_name, gif_max_frame = None, None
mpl_run(bodies, SECONDS_PER_WEEK, gif_file_name, gif_max_frame)
...@@ -67,7 +67,7 @@ class Simulator(metaclass=ABCMeta): ...@@ -67,7 +67,7 @@ class Simulator(metaclass=ABCMeta):
self.body_views = list(filter(lambda b:b.appeared, self.body_views)) self.body_views = list(filter(lambda b:b.appeared, self.body_views))
@abstractmethod @abstractmethod
def run(self, dt: int): def run(self, dt: int, **kwargs):
""" """
按时间差运行,值越小越精确,但演变速度会慢。 按时间差运行,值越小越精确,但演变速度会慢。
:param dt: 时间差(秒) :param dt: 时间差(秒)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册