Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
太阳系三体模拟器
提交
597a3616
太阳系三体模拟器
项目概览
Python_超人
/
太阳系三体模拟器
通知
1075
Star
131
Fork
128
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
太阳系三体模拟器
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
597a3616
编写于
2月 13, 2023
作者:
M
march3
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
三体运行模拟器
上级
431085b7
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
24 addition
and
15 deletion
+24
-15
scenes/func.py
scenes/func.py
+3
-2
simulators/mayavi_simulator.py
simulators/mayavi_simulator.py
+1
-2
simulators/mpl_simulator.py
simulators/mpl_simulator.py
+19
-10
simulators/simulator.py
simulators/simulator.py
+1
-1
未找到文件。
scenes/func.py
浏览文件 @
597a3616
...
@@ -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__'
:
...
...
simulators/mayavi_simulator.py
浏览文件 @
597a3616
...
@@ -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
...
...
simulators/mpl_simulator.py
浏览文件 @
597a3616
...
@@ -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
(
"
\r
GIF 生成进度:%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
)
simulators/simulator.py
浏览文件 @
597a3616
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录