python绘制动态模拟图-使用 Python 来简单的动态模拟一下太阳系的运转

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

以下文章来源于Python技术 ,作者派森酱

f98deec9-7773-42c6-aea7-df7c001a7de3

提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫、发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙伴可以深入了解一下,这里就不多说了。

太阳以巨大的引力使周边行星、卫星等绕其运转,构成了太阳系,它主要包括太阳、8 个行星、205 个卫星以及几十万个小行星等,本文我们使用 Python 来简单的动态模拟一下太阳系的运转。

PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取

87b4f3aaf72e43919563655c53cc3f97

可以免费领取源码、项目实战视频、PDF文件等

0f91dddc5418489ab446cf4acc8afb16

实现

功能的实现,主要要到的还是 Python 的 pygame 库,我们先导入需要的所有 Python 库,代码如下所示:

importsysimportmathimportpygamefrom 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, 600screen=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)

看一下效果:

7a3cb78aceff43908cf13c375975a935

接着画一个地球,让其绕着太阳旋转,代码如下:

#画地球

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 inrange(len(pos_e)):

pygame.draw.circle(screen, SILVER, pos_e[i],1, 0)

看一下效果:

99eb0d2e66b645dfa37eaa97f842640c

我们再接着画月球,代码如下:

#画月球

roll_m += 0.1pos_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 inrange(len(pos_mm)):

pygame.draw.circle(screen, SILVER, pos_mm[i],1, 0)

看一下效果:

19212f59d5d444f5a9497bd8b7f1fbc1

其他几个星球的实现也类似,代码如下:

#其他几个行星

roll_3 += 0.03pos_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.04pos_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.05pos_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.06pos_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.07pos_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.08pos_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)

最后,我们来看一下整体实现的动态效果:

91e7412ddcc3457699047fd2012aaaef

是不是有内味了。

总结

本文我们使用 Python 简单模拟了太阳系的运转,有兴趣的小伙伴可以自己运行一下代码或对功能做进一步扩展。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值