From 763217bf1acb677ed2bca4b9c614f7c9681033b4 Mon Sep 17 00:00:00 2001 From: march3 <13505732@qq.com> Date: Fri, 10 Feb 2023 22:25:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=89=E4=BD=93=E8=BF=90=E8=A1=8C=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/func.py | 4 ++-- common/system.py | 6 +++-- scenes/solar_system_2.py | 23 ++++++++++--------- scenes/solar_system_3.py | 40 ++++++++++++++++++++------------- scenes/three_body_01.py | 6 ++--- scenes/three_body_02.py | 14 ++++++------ simulators/simulator.py | 7 ++++++ simulators/views/mayavi_view.py | 7 ++++++ 8 files changed, 67 insertions(+), 40 deletions(-) diff --git a/common/func.py b/common/func.py index 3ba1780..d351002 100644 --- a/common/func.py +++ b/common/func.py @@ -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) diff --git a/common/system.py b/common/system.py index ea2c37b..b2ce664 100644 --- a/common/system.py +++ b/common/system.py @@ -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: diff --git a/scenes/solar_system_2.py b/scenes/solar_system_2.py index b10f4f1..53b203b 100644 --- a/scenes/solar_system_2.py +++ b/scenes/solar_system_2.py @@ -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(从太阳系的行星中排除) + Sun(size_scale=0.8e2), # 太阳放大 80 倍 + 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]) diff --git a/scenes/solar_system_3.py b/scenes/solar_system_3.py index 96b3cd3..402cc2d 100644 --- a/scenes/solar_system_3.py +++ b/scenes/solar_system_3.py @@ -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(从太阳系的行星中排除) + Sun(size_scale=0.8e2), # 太阳放大 80 倍 + 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]) diff --git a/scenes/three_body_01.py b/scenes/three_body_01.py index e6d9b51..81003f5 100644 --- a/scenes/three_body_01.py +++ b/scenes/three_body_01.py @@ -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 倍,距离保持不变 ] diff --git a/scenes/three_body_02.py b/scenes/three_body_02.py index da2e285..39f91c0 100644 --- a/scenes/three_body_02.py +++ b/scenes/three_body_02.py @@ -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) diff --git a/simulators/simulator.py b/simulators/simulator.py index 52638ef..4214033 100644 --- a/simulators/simulator.py +++ b/simulators/simulator.py @@ -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): """ diff --git a/simulators/views/mayavi_view.py b/simulators/views/mayavi_view.py index 2712d25..5eadb63 100644 --- a/simulators/views/mayavi_view.py +++ b/simulators/views/mayavi_view.py @@ -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): """ 设置纹理图片到天体 -- GitLab