如何利用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 使用SMTP发送邮件的代码小结
Sep 21 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
Python面向对象之继承代码详解
Jan 29 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
python使用webdriver爬取微信公众号
Aug 31 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
在Python中实现函数重载的示例代码
Dec 12 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
cookies应对python反爬虫知识点详解
Nov 25 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 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
8个PHP数组面试题
2015/06/23 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
python创建文件备份的脚本
2018/09/11 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
大学生就业求职信
2014/06/12 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
Python中for后接else的语法使用
2021/05/18 Python
python 如何用terminal输入参数
2021/05/25 Python
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android