如何利用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实现进程间通信简单实例
Jul 23 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
Python selenium的基本使用方法分析
Dec 21 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
python压包的概念及实例详解
Feb 17 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 mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
管理心得体会
2013/12/28 职场文书
实习老师离校感言
2014/02/03 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
安全协议书
2014/04/23 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
网络管理员岗位职责
2015/02/12 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书