Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
太阳系三体模拟器
提交
763217bf
太阳系三体模拟器
项目概览
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看板
提交
763217bf
编写于
2月 10, 2023
作者:
M
march3
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
三体运行模拟器
上级
8ff3b364
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
67 addition
and
40 deletion
+67
-40
common/func.py
common/func.py
+2
-2
common/system.py
common/system.py
+4
-2
scenes/solar_system_2.py
scenes/solar_system_2.py
+13
-10
scenes/solar_system_3.py
scenes/solar_system_3.py
+24
-16
scenes/three_body_01.py
scenes/three_body_01.py
+3
-3
scenes/three_body_02.py
scenes/three_body_02.py
+7
-7
simulators/simulator.py
simulators/simulator.py
+7
-0
simulators/views/mayavi_view.py
simulators/views/mayavi_view.py
+7
-0
未找到文件。
common/func.py
浏览文件 @
763217bf
...
...
@@ -66,10 +66,10 @@ def get_position_force(angles, force=1, radius=1, radius_offset=None, force_offs
"""
angles
=
np
.
array
(
angles
*
np
.
pi
)
if
isinstance
(
radius_offset
,
in
t
):
if
isinstance
(
radius_offset
,
floa
t
):
radius
=
radius
+
np
.
random
.
rand
(
len
(
angles
))
*
radius_offset
if
isinstance
(
force_offset
,
in
t
):
if
isinstance
(
force_offset
,
floa
t
):
force
=
force
+
np
.
random
.
rand
(
len
(
angles
))
*
force_offset
pxs
=
radius
*
np
.
cos
(
angles
)
...
...
common/system.py
浏览文件 @
763217bf
...
...
@@ -17,7 +17,7 @@ class System(object):
天体系统
"""
def
__init__
(
self
,
bodies
,
max_distance
=
-
1
):
def
__init__
(
self
,
bodies
,
max_distance
=
60
*
AU
):
self
.
bodies
=
bodies
self
.
max_distance
=
max_distance
...
...
@@ -82,9 +82,11 @@ class System(object):
return
True
self
.
bodies
=
list
(
filter
(
valid_body
,
self
.
bodies
))
#
self.bodies = list(filter(valid_body, self.bodies))
for
body1
in
self
.
bodies
:
if
not
valid_body
(
body1
):
continue
acceleration
=
np
.
zeros
(
3
)
for
body2
in
self
.
bodies
:
if
self
.
max_distance
>
0
:
...
...
scenes/solar_system_2.py
浏览文件 @
763217bf
...
...
@@ -20,17 +20,20 @@ if __name__ == '__main__':
# 以下展示的效果非太阳系真实的距离和大小
# 1、由于宇宙空间尺度非常大,按照实际的大小无法看到行星天体,因此需要对天体的尺寸进行放大
# 2、对每个行星天体的距离进行了缩放
# region 构建太阳系
bodies
=
[
Sun
(
size_scale
=
0.8e2
),
# 太阳放大 80 倍
Mercury
(
size_scale
=
4e3
,
distance_scale
=
1
),
# 水星放大 4000 倍,距离保持不变
Venus
(
size_scale
=
4e3
,
distance_scale
=
1
),
# 金星放大 4000 倍,距离保持不变
Earth
(
size_scale
=
4e3
,
distance_scale
=
1
),
# 地球放大 4000 倍,距离保持不变
Mars
(
size_scale
=
4e3
,
distance_scale
=
1
),
# 火星放大 4000 倍,距离保持不变
Jupiter
(
size_scale
=
0.
8e3
,
distance_scale
=
0.5
),
# 木星放大 800 倍,距离缩小到真实距离的 0.
5
Saturn
(
size_scale
=
0.
8e3
,
distance_scale
=
0.38
),
# 土星放大 800 倍,距离缩小到真实距离的 0.38
Uranus
(
size_scale
=
0.8e3
,
distance_scale
=
0.
26
),
# 天王星放大 800 倍,距离缩小到真实距离的 0.2
6
Neptune
(
size_scale
=
1e3
,
distance_scale
=
0.2
2
),
# 海王星放大 1000 倍,距离缩小到真实距离的 0.22
Pluto
(
size_scale
=
10e3
,
distance_scale
=
0.2
0
),
# 冥王星放大 10000 倍,距离缩小到真实距离的 0.2
(从太阳系的行星中排除)
Mercury
(
size_scale
=
4e3
,
distance_scale
=
1
.3
),
# 水星放大 4000 倍,距离放大 1.3 倍
Venus
(
size_scale
=
4e3
,
distance_scale
=
1
.3
),
# 金星放大 4000 倍,距离放大 1.3 倍
Earth
(
size_scale
=
4e3
,
distance_scale
=
1
.3
),
# 地球放大 4000 倍,距离放大 1.3 倍
Mars
(
size_scale
=
4e3
,
distance_scale
=
1
.3
),
# 火星放大 4000 倍,距离放大 1.3 倍
Jupiter
(
size_scale
=
0.
68e3
,
distance_scale
=
0.65
),
# 木星放大 680 倍,距离缩小到真实距离的 0.6
5
Saturn
(
size_scale
=
0.
68e3
,
distance_scale
=
0.52
),
# 土星放大 680 倍,距离缩小到真实距离的 0.52
Uranus
(
size_scale
=
0.8e3
,
distance_scale
=
0.
36
),
# 天王星放大 800 倍,距离缩小到真实距离的 0.3
6
Neptune
(
size_scale
=
1e3
,
distance_scale
=
0.2
7
),
# 海王星放大 1000 倍,距离缩小到真实距离的 0.27
Pluto
(
size_scale
=
10e3
,
distance_scale
=
0.2
3
),
# 冥王星放大 10000 倍,距离缩小到真实距离的 0.23
(从太阳系的行星中排除)
]
# endregion
mayavi_run
(
bodies
,
SECONDS_PER_WEEK
,
view_azimuth
=-
45
,
view_distance
=
3e9
,
view_focalpoint
=
[
5e2
,
5e2
,
5e2
])
scenes/solar_system_3.py
浏览文件 @
763217bf
...
...
@@ -23,7 +23,9 @@ if __name__ == '__main__':
# 以下展示的效果非太阳系真实的距离和大小
# 1、由于宇宙空间尺度非常大,按照实际的大小无法看到行星天体,因此需要对天体的尺寸进行放大
# 2、对每个行星天体的距离进行了缩放
# 构建4个小行星
# 3、加入了小行星的演示效果
# region 1.构建4个小行星 -------------
# asteroids = [
# Asteroid(size_scale=1e9, # 小行星放大 1000000000 倍,距离保持不变
# init_position=[1.6 * AU, 0, 0],
...
...
@@ -42,35 +44,41 @@ if __name__ == '__main__':
# init_velocity=[25.37, 0, 0],
# distance_scale=1),
# ]
# 构建 50 小行星,太多的小行星会影响电脑性能
# endregion 1 --------------------------
# region 2.随机构建 60 小行星,注意:太多的小行星会影响电脑性能
NUM_OF_ASTEROIDS
=
60
asteroids
=
[]
angles
=
np
.
linspace
(
0
,
40
*
np
.
pi
,
NUM_OF_ASTEROIDS
)
pxs
,
pys
,
fxs
,
fys
=
get_position_force
(
angles
,
radius
=
1.60
*
AU
,
force
=
23.37
,
radius_offset
=
0.
2
*
AU
,
radius_offset
=
0.
1
*
AU
,
force_offset
=
0.2
)
for
i
,
px
in
enumerate
(
pxs
):
py
,
fx
,
fy
=
pys
[
i
],
fxs
[
i
],
fys
[
i
]
asteroids
.
append
(
Asteroid
(
size_scale
=
1e9
,
# 小行星放大 1000000000 倍,距离
保持不变
asteroids
.
append
(
Asteroid
(
size_scale
=
1e9
,
# 小行星放大 1000000000 倍,距离
放大 1.4 倍
init_position
=
[
px
,
py
,
0
],
init_velocity
=
[
fx
,
fy
,
0
],
distance_scale
=
1.
2
))
distance_scale
=
1.
4
))
# endregion 2
# region 3.构建太阳系
bodies
=
[
Sun
(
size_scale
=
0.8e2
),
# 太阳放大 80 倍
Mercury
(
size_scale
=
4e3
,
distance_scale
=
1.
1
),
# 水星放大 4000 倍,距离保持不变
Venus
(
size_scale
=
4e3
,
distance_scale
=
1.
1
),
# 金星放大 4000 倍,距离保持不变
Earth
(
size_scale
=
4e3
,
distance_scale
=
1.
1
),
# 地球放大 4000 倍,距离保持不变
Mars
(
size_scale
=
4e3
,
distance_scale
=
1.
1
),
# 火星放大 4000 倍,距离保持不变
Jupiter
(
size_scale
=
0.
8e3
,
distance_scale
=
0.5
),
# 木星放大 800 倍,距离缩小到真实距离的 0.
5
Saturn
(
size_scale
=
0.
8e3
,
distance_scale
=
0.38
),
# 土星放大 800 倍,距离缩小到真实距离的 0.38
Uranus
(
size_scale
=
0.8e3
,
distance_scale
=
0.
26
),
# 天王星放大 800 倍,距离缩小到真实距离的 0.2
6
Neptune
(
size_scale
=
1e3
,
distance_scale
=
0.2
2
),
# 海王星放大 1000 倍,距离缩小到真实距离的 0.22
Pluto
(
size_scale
=
10e3
,
distance_scale
=
0.2
0
),
# 冥王星放大 10000 倍,距离缩小到真实距离的 0.2
(从太阳系的行星中排除)
Mercury
(
size_scale
=
4e3
,
distance_scale
=
1.
3
),
# 水星放大 4000 倍,距离放大 1.3 倍
Venus
(
size_scale
=
4e3
,
distance_scale
=
1.
3
),
# 金星放大 4000 倍,距离放大 1.3 倍
Earth
(
size_scale
=
4e3
,
distance_scale
=
1.
3
),
# 地球放大 4000 倍,距离放大 1.3 倍
Mars
(
size_scale
=
4e3
,
distance_scale
=
1.
3
),
# 火星放大 4000 倍,距离放大 1.3 倍
Jupiter
(
size_scale
=
0.
68e3
,
distance_scale
=
0.65
),
# 木星放大 680 倍,距离缩小到真实距离的 0.6
5
Saturn
(
size_scale
=
0.
68e3
,
distance_scale
=
0.52
),
# 土星放大 680 倍,距离缩小到真实距离的 0.52
Uranus
(
size_scale
=
0.8e3
,
distance_scale
=
0.
36
),
# 天王星放大 800 倍,距离缩小到真实距离的 0.3
6
Neptune
(
size_scale
=
1e3
,
distance_scale
=
0.2
7
),
# 海王星放大 1000 倍,距离缩小到真实距离的 0.27
Pluto
(
size_scale
=
10e3
,
distance_scale
=
0.2
3
),
# 冥王星放大 10000 倍,距离缩小到真实距离的 0.23
(从太阳系的行星中排除)
]
# 增加小行星到太阳系
bodies
+=
asteroids
# endregion 3
# mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=-45)
mayavi_run
(
bodies
,
SECONDS_PER_WEEK
,
view_azimuth
=-
45
,
view_distance
=
3e9
,
view_focalpoint
=
[
5e2
,
5e2
,
5e2
])
scenes/three_body_01.py
浏览文件 @
763217bf
...
...
@@ -21,11 +21,11 @@ if __name__ == '__main__':
"""
bodies
=
[
Sun
(
mass
=
1.5e30
,
init_position
=
[
849597870.700
,
0
,
0
],
init_velocity
=
[
0
,
7.0
,
0
],
size_scale
=
1e2
,
texture
=
"sun1.jpg"
),
# 太阳放大 100 倍
size_scale
=
5e1
,
texture
=
"sun1.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
2e30
,
init_position
=
[
0
,
0
,
0
],
init_velocity
=
[
0
,
-
8.0
,
0
],
size_scale
=
1e2
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
size_scale
=
5e1
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
2.5e30
,
init_position
=
[
0
,
-
849597870.700
,
0
],
init_velocity
=
[
18.0
,
0
,
0
],
size_scale
=
1e2
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
size_scale
=
5e1
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
Earth
(
init_position
=
[
0
,
-
349597870.700
,
0
],
init_velocity
=
[
15.50
,
0
,
0
],
size_scale
=
4e3
,
distance_scale
=
1
),
# 地球放大 4000 倍,距离保持不变
]
...
...
scenes/three_body_02.py
浏览文件 @
763217bf
...
...
@@ -20,14 +20,14 @@ if __name__ == '__main__':
3、天体质量 mass
"""
bodies
=
[
Sun
(
mass
=
1.5e30
,
init_position
=
[
849597870.700
,
0
,
0
],
init_velocity
=
[
0
,
7
.0
,
0
],
size_scale
=
1e2
,
texture
=
"sun1.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
2e30
,
init_position
=
[
0
,
0
,
249597870.700
],
init_velocity
=
[
0
,
-
8
.0
,
0
],
size_scale
=
1e2
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
2.5e30
,
init_position
=
[
0
,
-
849597870.700
,
0
],
init_velocity
=
[
8
.0
,
0
,
0
],
size_scale
=
1e2
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
5e30
,
init_position
=
[
649597870.700
,
0
,
0
],
init_velocity
=
[
0
,
5
.0
,
0
],
size_scale
=
5e1
,
texture
=
"sun1.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
4e30
,
init_position
=
[
0
,
0
,
249597870.700
],
init_velocity
=
[
0
,
-
6
.0
,
0
],
size_scale
=
5e1
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
Sun
(
mass
=
3e30
,
init_position
=
[
0
,
-
649597870.700
,
0
],
init_velocity
=
[
6
.0
,
0
,
0
],
size_scale
=
5e1
,
texture
=
"sun2.jpg"
),
# 太阳放大 100 倍
Earth
(
init_position
=
[
0
,
-
3
49597870.700
,
0
],
init_velocity
=
[
15.50
,
0
,
0
],
Earth
(
init_position
=
[
0
,
-
2
49597870.700
,
0
],
init_velocity
=
[
15.50
,
0
,
0
],
size_scale
=
4e3
,
distance_scale
=
1
),
# 地球放大 4000 倍,距离保持不变
]
mayavi_run
(
bodies
,
SECONDS_PER_WEEK
,
view_azimuth
=
0
)
simulators/simulator.py
浏览文件 @
763217bf
...
...
@@ -44,6 +44,10 @@ class Simulator(metaclass=ABCMeta):
self
.
bodies_sys
.
evolve
(
dt
)
for
idx
,
view
in
enumerate
(
self
.
body_views
):
body
=
self
.
bodies_sys
.
bodies
[
idx
]
view
.
appeared
=
body
.
appeared
if
not
view
.
appeared
:
view
.
disappear
()
continue
view
.
position
=
body
.
position
*
body
.
distance_scale
view
.
name
=
body
.
name
view
.
mass
=
body
.
mass
...
...
@@ -59,6 +63,9 @@ class Simulator(metaclass=ABCMeta):
view
.
update
()
self
.
bodies_sys
.
bodies
=
list
(
filter
(
lambda
b
:
b
.
appeared
,
self
.
bodies_sys
.
bodies
))
self
.
body_views
=
list
(
filter
(
lambda
b
:
b
.
appeared
,
self
.
body_views
))
@
abstractmethod
def
run
(
self
,
dt
:
int
):
"""
...
...
simulators/views/mayavi_view.py
浏览文件 @
763217bf
...
...
@@ -117,6 +117,13 @@ class MayaviView(BodyView):
# return self.sphere,
def
disappear
(
self
):
if
hasattr
(
self
,
"sphere"
):
self
.
sphere
.
visible
=
False
if
hasattr
(
self
,
"rings"
):
self
.
rings
.
visible
=
False
def
__set_texture
(
self
,
image_file
):
"""
设置纹理图片到天体
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录