如何在tkinter python 3中使两个粒子碰撞?
我目前正试图使两个处于气态的粒子碰撞,但我不太确定如何编写一个代码来实现这一点,我有一个大概的草案,我可以做什么,但我真的不知道如何正确地实现它(第43-54行,即注释#I与另一个粒子j碰撞后的代码)碰撞发生后,我想让它们以不同的速度朝相反的方向运动。我将根据粒子的质量计算动能。该项目的目标是基本显示不同参数(速度、质量、方向)的多个粒子在气体中运动的动能守恒。这是我当前的代码,任何帮助都将不胜感激!!:如何在tkinter python 3中使两个粒子碰撞?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我目前正试图使两个处于气态的粒子碰撞,但我不太确定如何编写一个代码来实现这一点,我有一个大概的草案,我可以做什么,但我真的不知道如何正确地实现它(第43-54行,即注释#I与另一个粒子j碰撞后的代码)碰撞发生后,我想让它们以不同的速度朝相反的方向运动。我将根据粒子的质量计算动能。该项目的目标是基本显示不同参数(速度、质量、方向)的多个粒子在气体中运动的动能守恒。这是我当前的代码,任何帮助都将不胜感激!!: from tkinter import * from random import * my
from tkinter import *
from random import *
myHeight=400
myWidth=600
mySpeed=10
x1=5
y=5
radius1=20
x2=7
y2=4
radius1=20
x=60
width=40
length=10
global particules
particules = []
def initialiseBall(dx,dy,radius,color):
b = [myWidth/2,myHeight/2, dx, dy, radius]
particules.append(b)
k = myCanvas.create_oval(myWidth/2-radius, myHeight/2,\
myWidth/2+radius,myHeight/2+radius,\
width=2,fill=color)
print(k)
def updateBalls():
N = len(particules)
for i in range(N):
particules[i][0] += particules [i][2]
particules[i][1] += particules [i][3]
# collision of i with the walls
if particules[i][0]<0 or particules[i][0]>=myWidth:
particules[i][2] *= -1
if particules[i][1]<0 or particules[i][1]>=myHeight:
particules[i][3] *= -1
#collision of i with another particle j
# for j in range(N):
# if j != i:
# compare the position of i and j
# dij = ...
# if dij ... :
#if collision, compute the normal vector
#change velocities
# if particules[i][1]<=particules[i][1]:
# particules[i][2] *= -1
# r = particules[i][4]
myCanvas.coords(i+1, particules[i][0]-particules[i][4],
particules[i][1]-particules[i][4],
particules[i][0]+particules[i][4],
particules[i][1]+particules[i][4])
def animation ():
updateBalls()
myCanvas.after(mySpeed, animation)
def kineticenergy(mass, velocity):
Ec = 1/2 * mass * velocity ** 2
return Ec
# def averagetrip(number, radius):
# #
# #
# #
# #
mainWindow=Tk()
mainWindow.title('particles reservoir')
myCanvas = Canvas(mainWindow, bg = 'grey', height = myHeight, width = myWidth)
myCanvas.pack(side=TOP)
# create 2 particules
initialiseBall(-1,0, 50, 'red')
initialiseBall(1,0, 50, 'blue')
print(particules)
'''
N = 100
for n in range(N):
initialiseBalle(-1 ,0, randint(5,10), 'red')
'''
animation()
mainWindow.mainloop()
从tkinter导入*
从随机导入*
我的身高=400
myWidth=600
mySpeed=10
x1=5
y=5
半径1=20
x2=7
y2=4
半径1=20
x=60
宽度=40
长度=10
全局微粒
微粒=[]
def初始值球(dx、dy、半径、颜色):
b=[myWidth/2,myHeight/2,dx,dy,半径]
分词。附加(b)
k=我的画布。创建椭圆(我的宽度/2-半径,我的高度/2\
myWidth/2+半径,myHeight/2+半径\
宽度=2,填充=颜色)
印刷品(k)
def updateBalls():
N=len(微粒)
对于范围(N)中的i:
微粒[i][0]+=微粒[i][2]
微粒[i][1]+=微粒[i][3]
#i与墙壁的碰撞
如果微粒[i][0]=myWidth:
微粒[i][2]*=-1
如果微粒[i][1]=我的身高:
微粒[i][3]*=-1
#i与另一粒子j的碰撞
#对于范围(N)内的j:
#如果j!=一:
#比较i和j的位置
#dij=。。。
#如果dij…:
#如果发生碰撞,请计算法向量
#变速
#如果微粒[i][1]请尝试以下方法:
从数学导入sqrt、sin、cos
将tkinter作为tk导入
导入时间
#有关此项的更多信息,请阅读:https://stackoverflow.com/a/17985217/11106801
定义创建圆(自、x、y、r、**kwargs):
返回自我。创建椭圆(x-r,y-r,x+r,y+r,**kwargs)
tk.Canvas.create_circle=_create_circle
窗宽=500
窗户高度=500
#恢复系数
#设置为1表示完全弹性碰撞
e=1
班级舞会:
定义初始(自身,质量:浮动,r:浮动,x:浮动,y:浮动,
vx:float=0,vy:float=0,**kwargs):
"""
这是一个定义球是什么及其交互方式的类
还有其他的球。
论据:
质量:浮球#球的质量
------------------------------------------------------
r:float#球的半径必须大于0
------------------------------------------------------
x:浮动#球的x位置
#必须大于0和0,并且要检查两个圆是否接触/相交,请使用以下公式:(x2-x1)**2+(y2-y1)**2好的,明白了,我用的是恢复系数。你知道我会在代码中的什么地方添加公式来让它工作吗?一年前我试着做一个这样的程序,但我遇到了这样的问题。我要再试一次。做了它,它就工作了。我会完成添加注释,我会在1hthank左右发布答案非常感谢!!这些评论真的很有帮助,我现在没有任何问题!:)