当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-25 22:31:32 Python

一、扩散现象简介物理学中有很多随机过程。我们可以利用pygame中很好的可视化方法来展示物理随机过程。在这里,我们展示了物理学中热膨胀现象的可视化。所谓热扩散现象,是指分子或原子本来是在某个封闭系统内部,一旦封闭系统打开,分子或原子就会向外扩散,可以说是再也回不去了到原来的状态。地位。第一种随机现象:液体中的扩散:第二种随机现象:粒子的随机运动过程:上图是液体内部扩散最常见的例子。当然我们这里写的是小球的扩散代码。2.代码实现下面是代码和代码的详细解释:importpygame#importgamelibraryimportpygame.locals#import游戏库中的所有常量importsys#importsysteminteractivemodelibraryimporttime#importtimemoduleimportrandom#importrandommoduleimportmath#importmathlibrarymodulecolor_of_ball=138,43,226#设置球的颜色color_of_screen=72,209,204#设置屏幕的颜色color_of_rect=25,25,112#设置球的颜色矩形框RADIUS=10#setradiusN=100#setthenumberofballsif__name__=='__main__':t1=time.time()#记录开始时间pygame.init()#初始化screen=pygame.display.set_mode((1000,800))#屏幕pygame.display.set_caption("KnockingBalls")#设置名称vx_list=[]vy_list=[]#设置速度列表存储不同球的速度,存储xdirection和y分别是Directionforiinrange(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=[]#存储coordinatesforiinrange(N):#生成坐标x_list.append(random.randint(400,600))y_list.append(random.randint(300,500))whileTrue:foreventinpygame.event.get():#设置结束的条件是:按下关闭按钮ifevent.type==pygame.locals.QUIT:sys.exit()screen.fill(color_of_screen)#设置结束screenThecolorofforiinrange(N):t2=time.time()dt=t2-t1ifdt>10:#如果大于十秒,那么我们将移除框架,以便球可以移动randomly,whichwillMaketheballspreadoutforjinrange(N):ifj!=i:#Ican'tcollidewithmyself#考虑到如果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)#如果x_list[i]<=RADIUSorx_list[i]>不能出边界=1000-RADIUS:#如果到达边界,则在相应方向反转速度vx_list[i]=-vx_list[i]ify_list[i]<=RADIUSory_list[i]>=800-RADIUS:#If当它到达边界时,在相应的方向反转速度vy_list[i]=-vy_list[i]else:#如果在十秒内,我们会让框出现,球不能出框为jinrange(N):ifj!=i:#我不能和自己碰撞#考虑到如果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]=随机。随机()*2*(-1)**随机。randint(1,2)vy_list[j]=随机。random()*2*(-1)**random.randint(1,2)#不能从边界出去ifx_list[i]610-RADIUS:#If到达边界,则使相应方向的速度反转vx_list[i]=-vx_list[i]ify_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(屏幕,color_of_ball,(x_list[i],y_list[i]),RADIUS,width=5)time.sleep(0.001)#休眠0.001秒pygame.display.update()#更新屏幕3.显示运行代码的效果下面是我的代码实现的:球在不停地运动,同时它们之间会发生一些碰撞和其他相互作用。这是一个动态效果。不过由于这里不方便发视频,所以我在不同阶段使用不同的图1初始状态:图2有框时的状态:图3去框后的状态:图4.很久之后的状态:4.小结上面说到,我们使用Python代码实现了随机扩散现象的可视化,我们使用Pygame模块清晰的呈现了扩散过程。而且,我们还可以看到,去掉框架后,小球会随机向其他方向扩散。最后的结果就是小球会几乎均匀分布在整个屏幕上,不会回到原来的状态,这是熵增原理的结果,系统会趋向于无序而不是有序,因此会几乎均匀地分布在屏幕上。国产中和和制作网游的物理也有密切关系。总之,感谢大家的阅读和支持。感谢您的建议或意见,敬请指正。Pygame学习笔记后续会陆续发布,敬请期待。