提交 763217bf 编写于 作者: M march3

三体运行模拟器

上级 8ff3b364
......@@ -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, int):
if isinstance(radius_offset, float):
radius = radius + np.random.rand(len(angles)) * radius_offset
if isinstance(force_offset, int):
if isinstance(force_offset, float):
force = force + np.random.rand(len(angles)) * force_offset
pxs = radius * np.cos(angles)
......
......@@ -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:
......
......@@ -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.26
Neptune(size_scale=1e3, distance_scale=0.22), # 海王星放大 1000 倍,距离缩小到真实距离的 0.22
Pluto(size_scale=10e3, distance_scale=0.20), # 冥王星放大 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.65
Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52
Uranus(size_scale=0.8e3, distance_scale=0.36), # 天王星放大 800 倍,距离缩小到真实距离的 0.36
Neptune(size_scale=1e3, distance_scale=0.27), # 海王星放大 1000 倍,距离缩小到真实距离的 0.27
Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除)
]
# endregion
mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=-45, view_distance=3e9, view_focalpoint=[5e2, 5e2, 5e2])
......@@ -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.26
Neptune(size_scale=1e3, distance_scale=0.22), # 海王星放大 1000 倍,距离缩小到真实距离的 0.22
Pluto(size_scale=10e3, distance_scale=0.20), # 冥王星放大 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.65
Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52
Uranus(size_scale=0.8e3, distance_scale=0.36), # 天王星放大 800 倍,距离缩小到真实距离的 0.36
Neptune(size_scale=1e3, distance_scale=0.27), # 海王星放大 1000 倍,距离缩小到真实距离的 0.27
Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 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])
......@@ -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 倍,距离保持不变
]
......
......@@ -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, -349597870.700, 0], init_velocity=[15.50, 0, 0],
Earth(init_position=[0, -249597870.700, 0], init_velocity=[15.50, 0, 0],
size_scale=4e3, distance_scale=1), # 地球放大 4000 倍,距离保持不变
]
mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=0)
......@@ -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):
"""
......
......@@ -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.
先完成此消息的编辑!
想要评论请 注册