如何利用Python动态模拟太阳系运转


Posted in Python onSeptember 04, 2020

前言

提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫、发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙伴可以深入了解一下,这里就不多说了。

太阳以巨大的引力使周边行星、卫星等绕其运转,构成了太阳系,它主要包括太阳、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)

看一下效果:

如何利用Python动态模拟太阳系运转

接着画一个地球,让其绕着太阳旋转,代码如下:

# 画地球
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)

看一下效果:

如何利用Python动态模拟太阳系运转

我们再接着画月球,代码如下:

# 画月球
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)

看一下效果:

如何利用Python动态模拟太阳系运转

其他几个星球的实现也类似,代码如下:

# 其他几个行星
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动态模拟太阳系运转

是不是有内味了。

总结

本文我们使用 Python 简单模拟了太阳系的运转,有兴趣的小伙伴可以自己运行一下代码或对功能做进一步扩展。

到此这篇关于如何利用Python动态模拟太阳系运转的文章就介绍到这了,更多相关Python动态模拟太阳系运转内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中使用HTMLParser解析html实例
Feb 08 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
详解详解Python中writelines()方法的使用
May 25 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
儿童python练习实例
May 27 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
分享7个 Python 实战项目练习
Mar 03 Python
python装饰器三种装饰模式的简单分析
Sep 04 #Python
Django如何实现密码错误报错提醒
Sep 04 #Python
如何使用python socket模块实现简单的文件下载
Sep 04 #Python
python 监控logcat关键字功能
Sep 04 #Python
如何将json数据转换为python数据
Sep 04 #Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 #Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 #Python
You might like
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PHP关联链接常用代码
2012/11/05 PHP
PHP实现合并discuz用户
2015/08/05 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
解决option标签selected="selected"属性失效的问题
2017/11/06 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
python查找第k小元素代码分享
2013/12/18 Python
Python中的闭包总结
2014/09/18 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python数据类型之List列表实例详解
2019/05/08 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
使用python turtle画高达
2020/01/19 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
清洁工岗位职责
2014/01/29 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
入党积极分子培养人意见
2015/06/02 职场文书