如何利用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程序设计入门(3)数组的使用
Jun 16 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
django 外键model的互相读取方法
Dec 15 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
Python实现自动访问网页的例子
Feb 21 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
Python DES加密实现原理及实例解析
Jul 17 Python
Python编解码问题及文本文件处理方法详解
Jun 20 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中一个控制字符串输出的函数
2006/10/09 PHP
php FPDF类库应用实现代码
2009/03/20 PHP
Use Word to Search for Files
2007/06/15 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Python 解析XML文件
2009/04/15 Python
Python创建日历实例
2014/08/21 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
Python如何给函数库增加日志功能
2020/08/04 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
2014年五一活动策划方案
2014/03/15 职场文书
关爱老人标语
2014/06/21 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
财务负责人岗位职责
2015/02/03 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书