0
点赞
收藏
分享

微信扫一扫

Python可视化物理随机过程---pygame学习笔记2


Python可视化物理随机过程—pygame学习笔记2

文章目录

  • ​​Python可视化物理随机过程---pygame学习笔记2​​
  • ​​一、扩散现象的简单的介绍​​
  • ​​二、代码实现​​
  • ​​三、运行代码的效果展示​​
  • ​​四、总结​​

一、扩散现象的简单的介绍

在物理中有很多的随机过程,我们可以利用pygame中不错的可视化方法来进行物理随机过程的展示。

在此处,我们展示一下,物理之中的热学里面的扩算现象的可视化呈现。

所谓的热学里面的扩散现象就是说:原本分子或者原子在某一个封闭体系内部,但是,一旦打开这个封闭体系,那么分子或者原子就是会向外部进行扩散,而且,可以说根本不可能返回到最初的状态了。

第一个随机现象:

液体中的扩散:

Python可视化物理随机过程---pygame学习笔记2_经验分享

第二个随机现象:

粒子的随机运动过程:

Python可视化物理随机过程---pygame学习笔记2_pygame_02

以上这个图片是最常见的液体内部的扩散的例子了。

当然,我们在此处所写的是小球的扩散代码了啦。

二、代码实现

此处给出代码以及代码的详细注释解说:

import pygame
# 导入游戏库

import pygame.locals
# 导入游戏库中的所有常量

import sys
# 导入系统交互模式的库

import time
# 导入时间的模块

import random
# 导入随机模块

import math
# 导入数学库模块

color_of_ball = 138, 43, 226
# 设置球的颜色

color_of_screen = 72, 209, 204
# 设置屏幕的颜色

color_of_rect = 25, 25, 112
# 设置矩形框框的颜色

RADIUS = 10
# 设置半径

N = 100
# 设置球的个数


if __name__ == '__main__':

t1 = time.time()
# 记录一下开始的时间

pygame.init()
# 初始化

screen = pygame.display.set_mode((1000, 800))
# 屏幕

pygame.display.set_caption("Knocking Balls")
# 设置名称

vx_list = []
vy_list = []
# 设置速度的列表来存储不同的球的速度,分别存储 x 方向以及 y 方向

for i in range(N):
# 生成速度
vx_list.append(random.random() * 2 * (- 1) ** random.randint(1, 2))
vy_list.append(random.random() * 2 * (- 1) ** random.randint(1, 2))

x_list = []
y_list = []
# 存储坐标

for i in range(N):
# 生成坐标
x_list.append(random.randint(400, 600))
y_list.append(random.randint(300, 500))

while True:
for event in pygame.event.get():
# 设置结束的条件为:按下一个关闭的按钮

if event.type == pygame.locals.QUIT:
sys.exit()

screen.fill(color_of_screen)
# 设置屏幕的颜色
for i in range(N):
t2 = time.time()
dt = t2 - t1
if dt > 10:
# 如果大于了十秒,那么我们就去掉框框,使得小球可以随机的运动,从而会使得小球扩散出去
for j in range(N):
if j != i:
# 自己不能和自己进行碰撞
# 考虑到会发生碰撞
if math.sqrt((x_list[i] - x_list[j]) ** 2 + (y_list[i] - y_list[j]) ** 2) <= RADIUS * 2:
# 如果会发生碰撞那么就重新随机的设置速度
vx_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
vx_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
vy_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
vy_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
# 不能从边界出去了呦
if x_list[i] <= RADIUS or x_list[i] >= 1000 - RADIUS:
# 如果到了边界,那么就使得相应的方向上的速度反向
vx_list[i] = - vx_list[i]
if y_list[i] <= RADIUS or y_list[i] >= 800 - RADIUS:
# 如果到了边界,那么就使得相应的方向上的速度反向
vy_list[i] = - vy_list[i]
else:
# 在十秒以内的话,我们就使得框框呈现出来,小球不可以出框框
for j in range(N):
if j != i:
# 自己不能和自己进行碰撞
# 考虑到会发生碰撞
if math.sqrt((x_list[i] - x_list[j]) ** 2 + (y_list[i] - y_list[j]) ** 2) <= RADIUS * 2:
# 如果会发生碰撞那么就重新随机的设置速度
vx_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
vx_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
vy_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
vy_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
# 不能从边界出去了呦
if x_list[i] < RADIUS + 390 or x_list[i] > 610 - RADIUS:
# 如果到了边界,那么就使得相应的方向上的速度反向
vx_list[i] = - vx_list[i]
if y_list[i] < RADIUS + 290 or y_list[i] > 510 - RADIUS:
# 如果到了边界,那么就使得相应的方向上的速度反向
vy_list[i] = - vy_list[i]


# 绘制一个矩形来框住所有的球,这些球不能抛出框框到框框的外面去

pygame.draw.rect(screen, color_of_rect, (380, 280, 240, 240), width=3)

# 进行移动小球的位置
x_list[i] += vx_list[i]
y_list[i] += vy_list[i]

# 绘制小球的位置以及大小颜色等信息
pygame.draw.circle(screen, color_of_ball, (x_list[i], y_list[i]), RADIUS, width=5)

time.sleep(0.001)
# 睡眠 0.001 秒钟的时间

pygame.display.update()
# 更新画面

在这里面,所运用到方法全部都在我的另外一篇博文中有详细地介绍,如果不太清楚可以参考下方链接:里面有对于Pygame入门的简单操作以及一些方法的简单介绍。

三、运行代码的效果展示

这里我的代码实现的是:小球在不断的运动,同时彼此之间会发生一些碰撞以及其他的一些相互作用,这是一个动态的效果,但是,由于目前这里不方便发一个视频,所以,我才用不同的阶段使用不同的图片来表示出来了啦。

图片1、

初始的状态:

Python可视化物理随机过程---pygame学习笔记2_pygame_03

图片2、

框框存在时的装态:

Python可视化物理随机过程---pygame学习笔记2_python_04


图片3、

去掉框框以后不久的装态:

Python可视化物理随机过程---pygame学习笔记2_python_05

图片4、

Python可视化物理随机过程---pygame学习笔记2_pycharm_06


图片5、

较长时间以后的状态:

Python可视化物理随机过程---pygame学习笔记2_pygame_07


图片6、

较长时间以后的状态:

Python可视化物理随机过程---pygame学习笔记2_经验分享_08


图片7、

较长时间以后的状态:

Python可视化物理随机过程---pygame学习笔记2_pygame_09

四、总结

综上所述,我们使用Python代码实现了随机扩散现象的可视化处理,我们使用了Pygame这个模块使得扩散过程清晰的呈现了出来。

而且,我们也可以看到在去掉框框以后,小球都会向别的方向随机的扩散,最后的结果是小球几乎会均匀的分布在整个屏幕之上,而且不会回归到最开始的状态的,这是由于熵增原理导致的结果,系统会趋向于无序而不是有序,所以会几乎均匀的分布于屏幕之内。

总之,感谢大家的阅读以及支持了啦。

谢谢大家提出建议或者意见,敬请期待各位大佬的指正。

后续还会继续推出Pygame的学习笔记,希望大家敬请期待。


举报

相关推荐

0 条评论