如何利用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模拟Django框架实例
May 17 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
用Eclipse写python程序
Feb 10 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
python 实现德洛内三角剖分的操作
Apr 22 Python
python爬取豆瓣电影TOP250数据
May 23 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Apache部署Django项目图文详解
2019/07/30 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
浅谈Python协程
2020/06/17 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
工作个人的自我评价
2014/01/14 职场文书
安全环保演讲稿
2014/08/28 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android