如何利用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实现扫描端口示例
Mar 29 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
Python 类的继承实例详解
Mar 25 Python
Python贪心算法实例小结
Apr 22 Python
TensorFlow损失函数专题详解
Apr 26 Python
PyTorch学习笔记之回归实战
May 28 Python
python设计tcp数据包协议类的例子
Jul 23 Python
Django用户认证系统 User对象解析
Aug 02 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
使用python批量修改XML文件中图像的depth值
Jul 22 Python
Python之qq自动发消息的示例代码
Feb 18 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
Zerg基本策略
2020/03/14 星际争霸
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
vuex实现购物车功能
2020/06/28 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Python实现异步IO的示例
2020/11/05 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
房地产员工找工作的自我评价
2013/11/15 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
安全承诺书
2015/01/19 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
会计专业求职信范文
2015/03/19 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫