贴一张静态图

GIF不能支持细腻的颜色,为了看到动态效果,请看视频。

太阳系的一个小知识

资源素材

太阳系现在只有8大行星,连太阳一起,一共是9张图片。如果没有的朋友,可以到文末的下载地址下载。

def openSolor(solar):def loadImg(name):str1= os.path.join(basePath, name+ '.png')img= Image.open(str1)solar[name]= imgbasePath= r'D:\太阳系\素材'# loadImg('sun')loadImg('venus')loadImg('jupiter')loadImg('earth')loadImg('mars')loadImg('mercury')loadImg('neptune')loadImg('pluto')loadImg('uranus')loadImg('saturn')

基本运动原理

每颗行星的运动轨迹都是椭圆的,我们这里用一个参数方程来计算坐标:

  • x=cos(arc)*a
  • y=sin(arc)*b

其中,a,b 是椭圆的长轴和短轴,arc是运行角度,x,y是水平面坐标。

参数的设置

为了效果好看,实际参数不可能是真实的。但有几个关键条件至少应该满足。首先行星顺序别弄错,行星轨道之间的间距不是等距的,而是渐增的。其次是火星和木星直接有一个小行星带,所以这两个行星的轨道之间最好留出一个空隙。还有就是越往外圈的行星,绕行速度越慢。

def initSolar(posList):def getNumber():return random.randint(0,35)*10posList['sun']={'pos': (0,360), 'rate': 2, 'scale':1, 'radx': 1, 'layer':360}posList['mercury']={'rate': 0.15, 'radx':500, 'arc': getNumber(), 'rady': 200, 'speed':15}posList['venus']={'rate': 0.2, 'radx':550, 'arc': getNumber(), 'rady': 250, 'speed':10}posList['earth']={'rate': 0.2, 'radx':630, 'arc': getNumber(), 'rady': 320, 'speed':8}posList['mars']={'rate': 0.2, 'radx':740, 'arc': getNumber(), 'rady': 410, 'speed':6}posList['jupiter']={'rate': 0.7, 'radx':1050, 'arc': getNumber(), 'rady': 650, 'speed':4}posList['saturn']={'rate': 1, 'radx':1250, 'arc': getNumber(), 'rady': 800, 'speed':3}posList['uranus']={'rate': 0.3, 'radx':1480, 'arc': getNumber(), 'rady': 970, 'speed':2}posList['neptune']={'rate': 0.3, 'radx':1740, 'arc': getNumber(), 'rady': 1160, 'speed':2}

投影

一般的效果是将行星围绕太阳的公转面至于一个水平面上,然后投影到垂直的屏幕上。投影算法不难。

                x= math.sin(math.radians(a))* radx+ x0y= math.cos(math.radians(a))* rady+ y0showX= xshowY= midY- H/(D+y)*y

其中,x,y是公转平面坐标,showX,showY是投影到垂直平面的坐标。H是平面的高度,D是屏幕到太阳系的距离。

从数据来看,我们的太阳系模型是一个非常小的模型,或者电脑屏幕非常大。因为这两者实际差不多大,以至于从观察者的视角就可以出现很明显的近大远小效果。从这种效果就可以知道,数据与真实值差别极为巨大。

近大远小的效果,只与y相关。

        data['scale']= (y0+D)/(y+D)

遮挡效果

为了有真实感,行星之间、行星与轨道之间,轨道与太阳之间等等的遮挡效果是最关键的。

我们的做法是先画后半区,再画太阳,再画前半区。后半区中,远日行星先画;前半区中,近日行星先画。以保证正确的遮挡效果。

       drawOrb(img, solar, posList, 0, 90, True)pasteSolor(img, solar, posList)drawOrb(img, solar, posList, 90, 180, False)

比较复杂一点的是行星与自身轨道之间的遮挡关系。必须实现一线穿一球的效果才好看。而且穿球位置不是固定不变的。这里,我们根据行星所在角度的不同,将轨道拆分为两半来画。一部分轨道是被行星遮挡的,另一部分轨道遮挡行星,但留一些空间,以实现比较自然的穿球效果。

            drawArc(arc1, arc)rate= posList[name]['rate']* posList[name]['scale']pic= solarImg[name].resize(effect.tupleRound(effect.tupleMul(solarImg[name].size, rate)), Image.ANTIALIAS)pos= effect.tupleRound(effect.tupleAdd(posList[name]['pos'], effect.tupleMul(pic.size, -0.5)))r, g, b, alpha= pic.split()img.paste(pic, pos, mask= alpha)# 穿球点,随arc不同而不同# 90度位置,在中心穿球,# 越接近0或180度,越接近球边缘# 根据这种性质,采用cos来模拟darc= abs(round(math.cos(math.radians(arc))*solarImg[name].size[1]*rate/50))# darc= abs(round(math.cos(math.radians(arc))*5))# print(name, arc, darc)drawArc(arc+darc, arc2)

素材下载地址:

链接:https://pan.baidu.com/s/18ELL4aL-jHbIbIacMpVbjA 
提取码:5bjj

用python做一个漂亮的太阳系运动模拟相关推荐

  1. python绘制太阳系模型_用python做一个漂亮的太阳系运动模拟

    贴一张静态图 太阳系现在只有8大行星,连太阳一起,一共是9张图片.如果没有的朋友,可以到文末的下载地址下载. def openSolor(solar): def loadImg(name): str1 ...

  2. 利用Python做一个漂亮小姐姐词云跳舞视频

    最近不少小伙伴在学 Python,想找个好玩的练手项目. 那今天分享一个,简单,适合新手的 Python 小项目. 以下是具体项目: 本文将以哔哩哔哩–乘风破浪视频为例,you-get下载视频. 同时 ...

  3. Python做一个Kindle电子书下载助手,真香!

    哈喽,大家好,我是菜鸟哥! 大家有没有想过把亚马逊网站上的Kindle电子书下载到自己的电脑上? 今天分享的项目可以帮大家实现这一目的.该项目用Python开发,简单.好用.开源. 下面分享下项目的使 ...

  4. 如何做一个基于微信校园运动场地预约小程序系统毕业设计毕设作品

    如何做一个基于微信校园运动场地 分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):我们微信小程序项目属于CS架构,C客户端是我们要开发的小程 ...

  5. 十行代码,我用Python做一个迷你版的美图秀秀!

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  6. 卧槽!我用Python做一个打字测试器!看看谁是最快的男人!

    对于平时经常使用电脑的小伙伴而言,一个必不可少的操作就是利用键盘进行打字的操作,想必大家对自己的打字速度也是非常的自信,但是具体的速度大家却不能够准确表述. 今天,小编就同大家利用python制作一款 ...

  7. 用python做一个简单的游戏,用python写一个小游戏

    大家好,本文将围绕如何用python做一个简单的小游戏展开说明,python编写的入门简单小游戏是一个很多人都想弄明白的事情,想搞清楚用python做一个简单的游戏需要先了解以下几个事情. 1.Pyt ...

  8. 简易版“美颜”来了!肝了一夜!用Python做一个高瘦脸神器!

    "菜鸟学Python",第"519"篇原创 如今的网络时代,许多直播的博主们,在进行 直播时,都喜欢利用美颜的方式来提升自己的颜值.其中必不可少的就是瘦脸. 瘦 ...

  9. 用Python做一个房价预测小工具!

    哈喽,大家好. 今天给大家介绍一个非常适合新手入门的机器学习实战案例. 这是一个房价预测的案例,来源于 Kaggle 网站,是很多算法初学者的第一道竞赛题目. 该案例有着解机器学习问题的完整流程,包含 ...

最新文章

  1. 一文看懂 NLP 中的情感分析任务
  2. 日本机器人实力大盘点,和Atlas的高调刷屏相比,日本机器人的默默崛起更让人忌惮...
  3. 【原创】TLV5618芯片驱动程序
  4. python 仿真_Python SimPy 仿真系列 (2)
  5. JavaWeb 项目启动时,后台开启一个线程的方法
  6. 在FAANG面试中破解堆算法
  7. Centos7.x Hadoop 3.x HDFS 写入文件
  8. 大数据助力“互联网+政务服务”发展
  9. php 右下脚弹窗,多种样式jQuery网页右下角弹出提示信息代码
  10. Jetson TK1 一:调整屏幕分辨率
  11. 微信小程序“信用卡还款”项目实践
  12. Python学习笔记020——数据库基本操作
  13. 190628每日一句
  14. Maple 教程 何青,科学出版社
  15. 专利检索常用的网站有哪些?
  16. 卡方检验还是费歇尔精确检验?
  17. nginx配置主域名跳转www域名并支持ssl
  18. springboot 简单集成mybatis 及所遇到问题解决方法
  19. Bootstrap-button btn样式
  20. linux iio设备

热门文章

  1. Linux桌面系统常用软件推荐
  2. SAS Programming for R Users, Part 2 R语言的SAS编程教程,第2部分 Lynda课程中文字幕
  3. python开机启动代码_python脚本开机启动代码详解
  4. 一些适合青少年编程学习的趣味编程工具
  5. POSTGRESQL 从越来越多的ORACLE DBA 考取 PG 证书, 回顾2019- 2022
  6. 微软经典面试题(附答案)
  7. 「永恒之石」一口气对七个漏洞展开攻击, 与WannaCry较劲?
  8. 【网络安全】今天是网络安全日,谈谈网络安全
  9. 以太网及网络工作原理一
  10. input只允许输入指定字符