Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
太阳系三体模拟器
提交
8ff3b364
太阳系三体模拟器
项目概览
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看板
提交
8ff3b364
编写于
2月 10, 2023
作者:
M
march3
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
三体运行模拟器
上级
202044b2
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
52 addition
and
94 deletion
+52
-94
bodies/body.py
bodies/body.py
+3
-0
common/func.py
common/func.py
+17
-93
common/system.py
common/system.py
+30
-1
simulators/views/body_view.py
simulators/views/body_view.py
+2
-0
未找到文件。
bodies/body.py
浏览文件 @
8ff3b364
...
...
@@ -63,6 +63,9 @@ class Body(metaclass=ABCMeta):
self
.
__acceleration
=
np
.
array
([
0
,
0
,
0
],
dtype
=
'float32'
)
self
.
__record_history
()
# 是否显示
self
.
appeared
=
True
@
property
def
has_rings
(
self
):
"""
...
...
common/func.py
浏览文件 @
8ff3b364
...
...
@@ -80,96 +80,20 @@ def get_position_force(angles, force=1, radius=1, radius_offset=None, force_offs
# return pxs, pys, fxs, fys
return
np
.
round
(
pxs
,
2
),
np
.
round
(
pys
,
2
),
-
np
.
round
(
fxs
,
2
),
np
.
round
(
fys
,
2
)
#
#
# import math
#
# """
# 用python写一个函数,根据不同角度的参数列表,返回坐标 pos_x, pos_y,以及分解力fx fy
#
# def get_force(angle_list):
# pos_x = 0
# pos_y = 0
# fx = 0
# fy = 0
# for angle in angle_list:
# force_x, force_y = get_force_from_angle(angle)
# pos_x += force_x
# pos_y += force_y
# fx += force_x
# fy += force_y
#
# return pos_x, pos_y, fx, fy
#
# def get_force_from_angle(angle):
# force_x = math.cos(math.radians(angle))
# force_y = math.sin(math.radians(angle))
# return force_x, force_y
# """
#
# """
# ```python
# def get_positions_forces_from_angles(angles,radius, force):
#
# ```
# """
#
#
# def get_position_force(angle_list, radius=1, force=1):
# fxs = []
# fys = []
# angle_list = np.array(angle_list * np.pi)
# pxs = radius * np.cos(angle_list)
# pys = radius * np.sin(angle_list)
#
# for angle in angle_list:
# fx, fy = get_force_from_angle(angle)
# fxs.append(fx * force)
# fys.append(fy * force)
#
# return np.round(pxs, 2), np.round(pys, 2), np.round(fxs, 2), np.round(fys, 2)
#
#
# def get_force_from_angle(angle):
# force_x = math.cos(angle)
# force_y = math.sin(angle)
# # force_x = math.cos(math.radians(angle))
# # force_y = math.sin(math.radians(angle))
# return force_x, force_y
#
#
# if __name__ == '__main__':
# # a = [0, 45, 90, 135, 180, 225, 270, 315, 360]
# # start:返回样本数据开始点
# # stop:返回样本数据结束点
# # num:生成的样本数据量,默认为50
# points = np.linspace(0, 2 * np.pi, 10)
# # points = np.array([0, 45, 90, 135, 180, 225, 270, 315, 360])
# # points = np.array([0. , 0.17453293, 0.34906585, 0.52359878, 0.6981317 ,
# # 0.87266463, 1.04719755, 1.22173048, 1.3962634 , 1.57079633])
# # x, y = circle_x_y(points, 1)
# # print(x, y)
# print(points)
# pos_x, pos_y, fx, fy = circle_x_y_f(points, radius=1.6, force=25.37)
# print(pos_x, pos_y, fx, fy)
#
# """
# asteroids = [
# Asteroid(size_scale=1e9, # 小行星放大 1000000000 倍,距离保持不变
# init_position=[1.6 * AU, 0, 0],
# init_velocity=[0, 25.37, 0],
# distance_scale=1),
# Asteroid(size_scale=1e9, # 小行星放大 1000000000 倍,距离保持不变
# init_position=[-1.6 * AU, 0, 0],
# init_velocity=[0, -25.37, 0],
# distance_scale=1),
# Asteroid(size_scale=1e9, # 小行星放大 1000000000 倍,距离保持不变
# init_position=[0, 1.6 * AU, 0],
# init_velocity=[-25.37, 0, 0],
# distance_scale=1),
# Asteroid(size_scale=1e9, # 小行星放大 1000000000 倍,距离保持不变
# init_position=[0, -1.6 * AU, 0],
# init_velocity=[25.37, 0, 0],
# distance_scale=1),
# ]
# """
def
calculate_distance
(
pos1
,
pos2
=
[
0
,
0
,
0
]):
"""
计算两点间的距离
:param pos1:
:param pos2:
:return:
"""
d
=
pow
(
pow
(
np
.
array
(
pos1
[
0
])
-
np
.
array
(
pos2
[
0
]),
2
)
+
pow
(
np
.
array
(
pos1
[
1
])
-
np
.
array
(
pos2
[
1
]),
2
)
+
pow
(
np
.
array
(
pos1
[
2
])
-
np
.
array
(
pos2
[
2
]),
2
),
1
/
2
)
return
d
if
__name__
==
'__main__'
:
print
(
calculate_distance
([
6
,
8
,
0
],
[
3
,
4
,
0
]))
common/system.py
浏览文件 @
8ff3b364
...
...
@@ -9,6 +9,7 @@
import
numpy
as
np
from
common.consts
import
AU
,
G
from
bodies
import
Body
,
Sun
,
Mercury
,
Venus
,
Earth
,
Mars
,
Jupiter
,
Saturn
,
Uranus
,
Neptune
,
Pluto
from
common.func
import
calculate_distance
class
System
(
object
):
...
...
@@ -16,8 +17,9 @@ class System(object):
天体系统
"""
def
__init__
(
self
,
bodies
):
def
__init__
(
self
,
bodies
,
max_distance
=-
1
):
self
.
bodies
=
bodies
self
.
max_distance
=
max_distance
def
add
(
self
,
body
):
self
.
bodies
.
append
(
body
)
...
...
@@ -64,9 +66,36 @@ class System(object):
计算加速度
:return:
"""
def
valid_body
(
body
):
"""
有效的天体
:param body:
:return:
"""
if
not
body
.
appeared
:
return
False
if
self
.
max_distance
>
0
:
if
calculate_distance
(
body
.
position
)
>
self
.
max_distance
:
body
.
appeared
=
False
return
False
return
True
self
.
bodies
=
list
(
filter
(
valid_body
,
self
.
bodies
))
for
body1
in
self
.
bodies
:
acceleration
=
np
.
zeros
(
3
)
for
body2
in
self
.
bodies
:
if
self
.
max_distance
>
0
:
if
calculate_distance
(
body1
.
position
)
>
self
.
max_distance
:
# 太远了,则小时
body1
.
appeared
=
False
if
calculate_distance
(
body2
.
position
)
>
self
.
max_distance
:
# 太远了,则小时
body2
.
appeared
=
False
if
False
==
body1
.
appeared
or
body2
.
appeared
==
False
:
continue
if
body1
is
body2
:
continue
elif
body1
.
ignore_gravity
(
body2
)
or
body2
.
ignore_gravity
(
body1
):
...
...
simulators/views/body_view.py
浏览文件 @
8ff3b364
...
...
@@ -36,6 +36,8 @@ class BodyView(metaclass=ABCMeta):
self
.
raduis
=
None
self
.
velocity
=
None
self
.
appeared
=
True
def
__repr__
(
self
):
return
'<%s> m=%.3e(kg), r=%.3e(km), p=[%.3e,%.3e,%.3e](km), v=%s(km/s)'
%
\
(
self
.
name
,
self
.
mass
,
self
.
raduis
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录