如何利用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的id()函数解密过程
Dec 25 Python
Python的Django框架中的数据库配置指南
Jul 17 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
selenium+python截图不成功的解决方法
Jan 30 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python实现动态数组的示例代码
Jul 15 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python imread、newaxis用法详解
Nov 04 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
python爬取代理ip的示例
Dec 18 Python
一文搞懂如何实现Go 超时控制
Mar 30 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
Open and Print a Word Document
2007/06/15 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
js的2种继承方式详解
2014/03/04 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
jQuery中each方法的使用详解
2018/03/18 jQuery
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
Python下singleton模式的实现方法
2014/07/16 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python os模块在系统管理中的应用
2020/06/22 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
Html5实现iPhone开机界面示例代码
2013/06/30 HTML / CSS
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
运动会入场词200字
2014/02/15 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python