如何利用Python动态模拟太阳系运转
作者:Python 技术 发布时间:2022-01-14 15:01:43
标签:python,动态,模拟
前言
提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫、发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙伴可以深入了解一下,这里就不多说了。
太阳以巨大的引力使周边行星、卫星等绕其运转,构成了太阳系,它主要包括太阳、8 个行星、205 个卫星以及几十万个小行星等,本文我们使用 Python 来简单的动态模拟一下太阳系的运转。
实现
功能的实现,主要要到的还是 Python 的 pygame 库,我们先导入需要的所有 Python 库,代码如下所示:
import sys
import math
import pygame
from pygame.locals import *
接着定义一些常量(如:颜色、宽高等)及创建窗口,代码如下所示:
WHITE =(255, 255, 255)
SILVER = (192, 192, 192)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
SandyBrown = (244, 164, 96)
PaleGodenrod = (238, 232, 170)
PaleVioletRed = (219, 112, 147)
Thistle = (216, 191, 216)
size = width, height = 800, 600
screen = pygame.display.set_mode(size)
pygame.display.set_caption("太阳系")
# 创建时钟(控制游戏循环频率)
clock = pygame.time.Clock()
# 定义三个空列表
pos_v = pos_e = pos_mm = []
# 地球、月球等行星转过的角度
roll_v = roll_e = roll_m = 0
roll_3 = roll_4 = roll_5 = roll_6 = roll_7 = roll_8 = 0
# 太阳的位置(中心)
position = size[0] // 2, size[1] // 2
我们先在窗口中画一个太阳,代码如下:
pygame.draw.circle(screen, YELLOW, position, 60, 0)
看一下效果:
接着画一个地球,让其绕着太阳旋转,代码如下:
# 画地球
roll_e += 0.01 # 假设地球每帧公转 0.01 pi
pos_e_x = int(size[0] // 2 + size[1] // 6 * math.sin(roll_e))
pos_e_y = int(size[1] // 2 + size[1] // 6 * math.cos(roll_e))
pygame.draw.circle(screen, BLUE, (pos_e_x, pos_e_y), 15, 0)
# 地球的轨迹线
pos_e.append((pos_e_x, pos_e_y))
if len(pos_e) > 255:
pos_e.pop(0)
for i in range(len(pos_e)):
pygame.draw.circle(screen, SILVER, pos_e[i], 1, 0)
看一下效果:
我们再接着画月球,代码如下:
# 画月球
roll_m += 0.1
pos_m_x = int(pos_e_x + size[1] // 20 * math.sin(roll_m))
pos_m_y = int(pos_e_y + size[1] // 20 * math.cos(roll_m))
pygame.draw.circle(screen, SILVER, (pos_m_x, pos_m_y), 8, 0)
# 月球的轨迹线
pos_mm.append((pos_m_x, pos_m_y))
if len(pos_mm) > 255:
pos_mm.pop(0)
for i in range(len(pos_mm)):
pygame.draw.circle(screen, SILVER, pos_mm[i], 1, 0)
看一下效果:
其他几个星球的实现也类似,代码如下:
# 其他几个行星
roll_3 += 0.03
pos_3_x = int(size[0] // 2 + size[1] // 3.5 * math.sin(roll_3))
pos_3_y = int(size[1] // 2 + size[1] // 3.5 * math.cos(roll_3))
pygame.draw.circle(screen, GREEN, (pos_3_x, pos_3_y), 20, 0)
roll_4 += 0.04
pos_4_x = int(size[0] // 2 + size[1] // 4 * math.sin(roll_4))
pos_4_y = int(size[1] // 2 + size[1] // 4 * math.cos(roll_4))
pygame.draw.circle(screen, SandyBrown, (pos_4_x, pos_4_y), 20, 0)
roll_5 += 0.05
pos_5_x = int(size[0] // 2 + size[1] // 5 * math.sin(roll_5))
pos_5_y = int(size[1] // 2 + size[1] // 5 * math.cos(roll_5))
pygame.draw.circle(screen, PaleGodenrod, (pos_5_x, pos_5_y), 20, 0)
roll_6 += 0.06
pos_6_x = int(size[0] // 2 + size[1] // 2.5 * math.sin(roll_6))
pos_6_y = int(size[1] // 2 + size[1] // 2.5 * math.cos(roll_6))
pygame.draw.circle(screen, PaleVioletRed, (pos_6_x, pos_6_y), 20, 0)
roll_7 += 0.07
pos_7_x = int(size[0] // 2 + size[1] // 4.5 * math.sin(roll_7))
pos_7_y = int(size[1] // 2 + size[1] // 4.5 * math.cos(roll_7))
pygame.draw.circle(screen, Thistle, (pos_7_x, pos_7_y), 20, 0)
roll_8 += 0.08
pos_8_x = int(size[0] // 2 + size[1] // 5.5 * math.sin(roll_8))
pos_8_y = int(size[1] // 2 + size[1] // 5.5 * math.cos(roll_8))
pygame.draw.circle(screen, WHITE, (pos_8_x, pos_8_y), 20, 0)
最后,我们来看一下整体实现的动态效果:
是不是有内味了。
总结
本文我们使用 Python 简单模拟了太阳系的运转,有兴趣的小伙伴可以自己运行一下代码或对功能做进一步扩展。
来源:https://blog.csdn.net/weixin_48923393/article/details/107995282


猜你喜欢
- 本文实例讲述了Python3.5集合及其常见运算。分享给大家供大家参考,具体如下:1、集合的定义:集合是一个无序的、无重复的数据的数据组合。
- 星爷的一部“国产007”应该是无人不晓,其中一个片段是将“007”向MM展示他的秘密武器。皮鞋可以吹头发,大哥大可以刮胡子……把真实功能隐蔽
- 本文实例讲述了Python实现判断一个整数是否为回文数算法。分享给大家供大家参考,具体如下:第一个思路是先将整数转换为字符串,再将字符串翻转
- 描述 嵌入在你的web页面中的导航元素能够降低你的搜索引擎评价排名并且降低你的网站的响应性能。本文作者想同你一起探讨如何使用AJAX技术来解
- IT界的每个人都应该知道终端(Terminal)的基本知识,数据科学家也不例外。有时,终端是你的全部,尤其是在将模型和数据管道部署到远程机器
- 本文实例讲述了Python编程实现控制cmd命令行显示颜色的方法。分享给大家供大家参考,具体如下:基于win7 + python3.4运行效
- 问题你想通过某种对齐方式来格式化字符串解决方案对于基本的字符串对齐操作,可以使用字符串的 ljust() , rjust() 和 cente
- MySQL安装说明MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。MySQL 是最流行
- 首先了解一下需要的几个类所在的packagefrom torchvision import transforms, datasets as
- 需求是, 同一个页面, 有多组(不固定), 每组区块数量不一定一样的小区块. 要求每次只展开一个区块. 实现原理其实很简单, 点击导航, 若
- 创建表create table 表名create table if not exists 表名mysql> create databa
- JPGjpg全名是JPEG 。JPEG 图片以 24 位颜色存储单个光栅图像。JPEG 是与平台无关的格式,支持最高级别的压缩,不过,这种压
- 我就废话不多说了,大家还是直接看代码吧!import pymysql,hashlib结果:单条结果 {'id': 1,
- JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API,并支持SQL语言。利用
- #!/usr/bin/env python#-*- coding: utf-8 -*-#==========================
- 有时候我们需要在某段字符串或者某段语句中去查找确认是否包含我们所需要的字符串信息,举例子说、某段变量是:A= ”My name is Cla
- 引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:<!DOCTYPE HTML>&l
- 一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码:import os,stati
- →问题提出:我用dw做了一个下拉菜单,但是碰到form的列表项就跑到下面去了,请帮忙解决,先谢谢各位了!请看问题图示如下:→解决问题:由于层
- 前言这里存储过程和游标的定义和作用就不介绍了,网上挺多的,只通过简单的介绍,然后用个案例让大家快速了解。实例中会具体说明变量的定义,赋值,游