一、扩散景象的简略的介绍

在物理中有很多的随机过程,咱们能够利用pygame中不错的可视化办法来进行物理随机过程的展现。

在此处,咱们展现一下,物理之中的热学外面的扩算景象的可视化出现。

所谓的热学外面的扩散景象就是说:本来分子或者原子在某一个关闭体系外部,然而,一旦关上这个关闭体系,那么分子或者原子就是会向内部进行扩散,而且,能够说基本不可能返回到最后的状态了。

第一个随机景象:

液体中的扩散:

第二个随机景象:

粒子的随机静止过程:

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

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

二、代码实现

此处给出代码以及代码的具体正文讲解:

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()        # 更新画面

三、运行代码的成果展现

这里我的代码实现的是:小球在一直的静止,同时彼此之间会产生一些碰撞以及其余的一些相互作用,这是一个动静的成果,然而,因为目前这里不不便发一个视频,所以,我才用不同的阶段应用不同的图片来示意进去了啦。

图片1、

初始的状态:

图片2、

框框存在时的装态:

图片3、

去掉框框当前不久的装态:

图片4、

较长时间当前的状态:

四、总结

综上所述,咱们应用Python代码实现了随机扩散景象的可视化解决,咱们应用了Pygame这个模块使得扩散过程清晰的出现了进去。

而且,咱们也能够看到在去掉框框当前,小球都会向别的方向随机的扩散,最初的后果是小球简直会平均的散布在整个屏幕之上,而且不会回归到最开始的状态的,这是因为熵增原理导致的后果,零碎会趋向于无序而不是有序,所以会简直平均的散布于屏幕之内。再制作网络游戏的国产中和物理也是非亲非故的。

总之,感激大家的浏览以及反对了啦。

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

后续还会持续推出Pygame的学习笔记,心愿大家敬请期待。