Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
宇宙模拟器
提交
8173642d
宇宙模拟器
项目概览
Python_超人
/
宇宙模拟器
通知
19
Star
2
Fork
0
代码
文件
提交
分支
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看板
提交
8173642d
编写于
4月 25, 2023
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Python超人-宇宙模拟器
上级
8c58f222
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
203 addition
and
56 deletion
+203
-56
bodies/body.py
bodies/body.py
+32
-0
sim_lab/research_calc.py
sim_lab/research_calc.py
+35
-0
simulators/calc_simulator.py
simulators/calc_simulator.py
+136
-56
未找到文件。
bodies/body.py
浏览文件 @
8173642d
...
...
@@ -13,6 +13,8 @@ import math
from
common.consts
import
AU
import
copy
from
simulators.ursina.entities.entity_utils
import
get_value_direction_vectors
class
Body
(
metaclass
=
ABCMeta
):
"""
...
...
@@ -210,6 +212,36 @@ class Body(metaclass=ABCMeta):
self
.
__position
=
value
self
.
__record_history
()
def
acceleration_value
(
self
):
"""
获取加速度的值(km/s²)
@return:
"""
direction_vectors
=
get_value_direction_vectors
(
self
.
acceleration
)
return
direction_vectors
[
0
]
# km/s²
def
velocity_value
(
self
):
"""
获取速度的值(km/s)
@return:
"""
direction_vectors
=
get_value_direction_vectors
(
self
.
velocity
)
return
direction_vectors
[
0
]
# km/s
def
acceleration_value_direction
(
self
):
"""
获取加速度的值(km/s²)和方向
@return: 值[0],方向[1]
"""
return
get_value_direction_vectors
(
self
.
acceleration
)
def
velocity_value_direction
(
self
):
"""
获取速度的值(km/s)和方向
@return: 值[0],方向[1]
"""
return
get_value_direction_vectors
(
self
.
velocity
)
@
property
def
acceleration
(
self
):
"""
...
...
sim_lab/research_calc.py
0 → 100644
浏览文件 @
8173642d
# -*- coding:utf-8 -*-
# title :
# description :
# author :Python超人
# date :2023-02-11
# link :https://gitcode.net/pythoncr/
# python_version :3.8
# ==============================================================================
from
bodies
import
Body
,
Sun
,
Earth
,
Moon
from
objs
import
Satellite
,
Satellite2
from
common.consts
import
SECONDS_PER_HOUR
,
SECONDS_PER_DAY
,
SECONDS_PER_WEEK
,
SECONDS_PER_MONTH
from
sim_scenes.func
import
calc_run
from
bodies.body
import
AU
from
simulators.calc_simulator
import
CalcSimulator
,
CalcContext
bodies
=
[
Earth
(
init_position
=
[
0
,
0
,
0
],
texture
=
"earth_hd.jpg"
,
init_velocity
=
[
0
,
0
,
0
],
size_scale
=
0.5e1
),
# 地球放大 5 倍,距离保持不变
Moon
(
init_position
=
[
0
,
0
,
363104
],
# 距地距离约: 363104 至 405696 km
init_velocity
=
[
-
1.054152222
,
0
,
0
],
size_scale
=
1e1
)
# 月球放大 10 倍,距离保持不变
]
def
evolve_next
(
context
:
CalcContext
):
return
context
.
evolve_count
<
200
def
after_evolve
(
dt
,
context
:
CalcContext
):
moon
:
Body
=
context
.
bodies
[
1
]
print
(
moon
.
acceleration_value
(),
moon
.
velocity_value
())
CalcSimulator
.
on_after_evolve_subscription
(
after_evolve
)
calc_run
(
bodies
,
SECONDS_PER_HOUR
,
evolve_next
=
evolve_next
)
simulators/calc_simulator.py
浏览文件 @
8173642d
...
...
@@ -30,60 +30,163 @@ class CalcView(BodyView):
pass
class
CalcContext
(
Singleton
):
def
__init__
(
self
,
simulator
):
self
.
simulator
=
simulator
self
.
evolve_count
=
0
if
not
hasattr
(
self
,
"_params"
):
# 存放参数字典数据,通过 get_param 获取
self
.
_params
=
{}
@
property
def
bodies
(
self
)
->
[]:
return
self
.
simulator
.
bodies_sys
.
bodies
@
property
def
system
(
self
)
->
System
:
return
self
.
simulator
.
bodies_sys
@
property
def
params
(
self
):
return
self
.
_params
def
put_param
(
self
,
key
,
data
):
self
.
_params
[
key
]
=
data
def
get_param
(
self
,
key
):
"""
获取参数值
@param key:
@return:
"""
if
self
.
_params
is
None
or
len
(
self
.
_params
)
==
0
:
return
None
if
key
not
in
self
.
_params
.
keys
():
return
None
return
self
.
_params
[
key
]
class
CalcSimulator
(
Simulator
):
"""
计算运行模拟器(无界面)
主要用于天体测试数据计算
"""
@
staticmethod
def
init
():
if
hasattr
(
CalcSimulator
,
"on_reset_funcs"
):
return
# 重启运行的订阅事件
CalcSimulator
.
on_reset_funcs
=
[]
# 运行准备的订阅事件
CalcSimulator
.
on_ready_funcs
=
[]
# 运行结束的订阅事件
CalcSimulator
.
on_finished_funcs
=
[]
# 演变前触发的订阅事件
CalcSimulator
.
on_before_evolve_funcs
=
[]
# 演变后触发的订阅事件
CalcSimulator
.
on_after_evolve_funcs
=
[]
@
staticmethod
def
on_before_evolve_subscription
(
fun
):
CalcSimulator
.
on_before_evolve_funcs
.
append
(
fun
)
@
staticmethod
def
on_before_evolve_unsubscription
(
fun
):
CalcSimulator
.
on_before_evolve_funcs
.
remove
(
fun
)
@
staticmethod
def
on_before_evolve
(
dt
,
context
):
for
f
in
CalcSimulator
.
on_before_evolve_funcs
:
f
(
dt
,
context
)
@
staticmethod
def
on_after_evolve_subscription
(
fun
):
CalcSimulator
.
on_after_evolve_funcs
.
append
(
fun
)
@
staticmethod
def
on_after_evolve_unsubscription
(
fun
):
CalcSimulator
.
on_after_evolve_funcs
.
remove
(
fun
)
@
staticmethod
def
on_after_evolve
(
dt
,
context
):
for
f
in
CalcSimulator
.
on_after_evolve_funcs
:
f
(
dt
,
context
)
@
staticmethod
def
on_finished_subscription
(
fun
):
CalcSimulator
.
on_finished_funcs
.
append
(
fun
)
@
staticmethod
def
on_finished_unsubscription
(
fun
):
CalcSimulator
.
on_finished_funcs
.
remove
(
fun
)
@
staticmethod
def
on_finished
(
context
):
for
f
in
CalcSimulator
.
on_finished_funcs
:
f
(
context
)
@
staticmethod
def
on_reset_subscription
(
fun
):
CalcSimulator
.
on_reset_funcs
.
append
(
fun
)
@
staticmethod
def
on_reset_unsubscription
(
fun
):
CalcSimulator
.
on_reset_funcs
.
remove
(
fun
)
@
staticmethod
def
on_reset
(
context
):
for
f
in
CalcSimulator
.
on_reset_funcs
:
f
(
context
)
@
staticmethod
def
on_ready_subscription
(
fun
):
CalcSimulator
.
on_ready_funcs
.
append
(
fun
)
@
staticmethod
def
on_ready_unsubscription
(
fun
):
CalcSimulator
.
on_ready_funcs
.
remove
(
fun
)
@
staticmethod
def
on_ready
(
context
):
for
f
in
CalcSimulator
.
on_ready_funcs
:
f
(
context
)
def
__init__
(
self
,
bodies_sys
:
System
):
super
().
__init__
(
bodies_sys
,
CalcView
)
def
run
(
self
,
dt
,
**
kwargs
):
on_finished
=
None
if
"on_finished"
in
kwargs
:
on_finished
=
kwargs
[
"on_finished"
]
on_ready
=
None
if
"on_ready"
in
kwargs
:
on_ready
=
kwargs
[
"on_ready"
]
evolve_next
=
None
if
"evolve_next"
in
kwargs
:
evolve_next
=
kwargs
[
"evolve_next"
]
after_evolve
=
None
if
"after_evolve"
in
kwargs
:
after_evolve
=
kwargs
[
"after_evolve"
]
def
on_reset
(
c
):
c
.
evolve_count
=
0
before_evolve
=
None
if
"before_evolve"
in
kwargs
:
before_evolve
=
kwargs
[
"before_evolve"
]
CalcSimulator
.
on_reset_subscription
(
on_reset
)
context
=
CalcContext
(
self
)
if
on_ready
is
not
None
:
on_ready
(
self
)
CalcSimulator
.
on_ready
(
context
)
if
evolve_next
is
None
:
if
before_evolve
is
not
None
:
before_evolve
(
self
)
# 至少会执行一遍(如果需要执行多遍,需要实现 evolve_next)
CalcSimulator
.
on_before_evolve
(
dt
,
context
)
self
.
evolve
(
dt
)
if
after_evolve
is
not
None
:
after_evolve
(
self
)
context
.
evolve_count
+=
1
CalcSimulator
.
on_after_evolve
(
dt
,
context
)
else
:
while
evolve_next
(
self
):
if
before_evolve
is
not
None
:
before_evolve
(
self
)
while
evolve_next
(
context
):
CalcSimulator
.
on_before_evolve
(
dt
,
context
)
self
.
evolve
(
dt
)
context
.
evolve_count
+=
1
CalcSimulator
.
on_after_evolve
(
dt
,
context
)
if
after_evolve
is
not
None
:
after_evolve
(
self
)
CalcSimulator
.
on_finished
(
context
)
if
on_finished
is
not
None
:
on_finished
(
self
)
CalcSimulator
.
init
()
if
__name__
==
'__main__'
:
from
sim_scenes.func
import
calc_run
...
...
@@ -105,34 +208,11 @@ if __name__ == '__main__':
]
def
on_finished
(
simulator
):
print
(
simulator
)
def
on_ready
(
simulator
):
print
(
simulator
)
def
after_evolve
(
simulator
):
print
(
simulator
)
def
before_evolve
(
simulator
):
print
(
simulator
)
def
evolve_next
(
simulator
):
if
not
hasattr
(
simulator
,
"loop"
):
simulator
.
loop
=
10
else
:
simulator
.
loop
-=
1
def
evolve_next
(
context
:
CalcContext
):
simulator
=
context
.
simulator
print
(
simulator
.
bodies_sys
.
bodies
)
return
simulator
.
loop
>
0
return
context
.
evolve_count
<
2
calc_run
(
bodies
,
SECONDS_PER_WEEK
,
on_ready
=
on_ready
,
on_finished
=
on_finished
,
after_evolve
=
after_evolve
,
before_evolve
=
before_evolve
,
evolve_next
=
evolve_next
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录