diff --git a/scenes/func.py b/scenes/func.py index 3921db042de0a31679e184669beaeb506fdc6ca0..ad8275824479036f31b2f5bb625d18e9e3121c30 100644 --- a/scenes/func.py +++ b/scenes/func.py @@ -51,7 +51,7 @@ def mayavi_run(bodies, dt=SECONDS_PER_WEEK, 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: 天体 @@ -62,7 +62,8 @@ def mpl_run(bodies, dt=SECONDS_PER_WEEK, gif_file_name=None): from simulators.mpl_simulator import MplSimulator body_sys = System(bodies) 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__': diff --git a/simulators/mayavi_simulator.py b/simulators/mayavi_simulator.py index 84e912c64dbf7f1861562dcca59602837c49dad0..7373dfb55e50c19e07e624883f9f4404d1e1259b 100644 --- a/simulators/mayavi_simulator.py +++ b/simulators/mayavi_simulator.py @@ -21,11 +21,10 @@ class MayaviSimulator(Simulator): super().__init__(bodies_sys, MayaviView) @mlab.animate(delay=100, ui=True) - def run(self, dt): + def run(self, dt, **kwargs): f = mlab.gcf() while True: self.evolve(dt) - # Updating scene... f.scene.render() yield diff --git a/simulators/mpl_simulator.py b/simulators/mpl_simulator.py index b07e9ec28b1e45dd855ab6d9cb933df26535643d..fa7d0a155f56290fa7425e951d1a9735ae35c8c3 100644 --- a/simulators/mpl_simulator.py +++ b/simulators/mpl_simulator.py @@ -30,7 +30,7 @@ class MplSimulator(Simulator): """ 保存 GIF 文件 :param dt: 单位:秒,按时间差进行演变,值越小越精确,但演变速度会慢。 - :param gif_max_frame: 导出的 gif 的最多帧数 + :param gif_max_frame: 导出的 gif 文件的画面帧数 :param gif_file_name: 导出的 gif 文件名 :return: """ @@ -44,21 +44,26 @@ class MplSimulator(Simulator): def update(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) ani = animation.FuncAnimation(fig=fig, func=update, frames=np.arange(0, gif_max_frame), interval=1) ani.save(gif_file_name) - def run(self, dt, gif_file_name=None): + def run(self, dt, **kwargs): """ :param dt: 单位:秒,按时间差进行演变,值越小越精确,但演变速度会慢。 - :param gif_file_name: 导出的 gif 文件名,如果为空,则显示动画 + :param kwargs: + gif_file_name: 导出的 gif 文件名,如果为空,则显示动画 + gif_max_frame: 导出的 gif 文件的画面帧数 :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: - 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 fig = plt.figure('天体模拟运行效果', figsize=(16, 12)) @@ -113,8 +118,6 @@ class MplSimulator(Simulator): if __name__ == '__main__': - # TODO: 注意:显示动态图,需先进行以下设置: - # Pycharm::File –> Settings –> Tools –> Python Scientific –> Show plots in tool window(取消打勾) from scenes.func import mpl_run from bodies import Sun, Earth from common.consts import SECONDS_PER_WEEK @@ -132,6 +135,12 @@ if __name__ == '__main__': Earth(name='地球', init_position=[0, -349597870.700, 0], init_velocity=[15.50, 0, 0], size_scale=4e3, distance_scale=1), # 地球放大 4000 倍,距离保持不变 ] - gif_file_name = None # 显示动画 - # gif_file_name = 'bodies_run.gif' # 保存 GIF 文件 - mpl_run(bodies, SECONDS_PER_WEEK, gif_file_name) + # 保存 GIF,参数为指定保存 GIF 文件以及文件的画面帧数 + gif_file_name, gif_max_frame = 'bodies_run.gif', 200 + + # 只显示动画,不保存 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) diff --git a/simulators/simulator.py b/simulators/simulator.py index 78bd6937ef6e374b6a742673748d7ce71db5fe01..86dbf5d1a9077a6852b2c9abece8bc929e85e1f2 100644 --- a/simulators/simulator.py +++ b/simulators/simulator.py @@ -67,7 +67,7 @@ class Simulator(metaclass=ABCMeta): self.body_views = list(filter(lambda b:b.appeared, self.body_views)) @abstractmethod - def run(self, dt: int): + def run(self, dt: int, **kwargs): """ 按时间差运行,值越小越精确,但演变速度会慢。 :param dt: 时间差(秒)