如何在tkinter python 3中使两个粒子碰撞?

如何在tkinter python 3中使两个粒子碰撞?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我目前正试图使两个处于气态的粒子碰撞,但我不太确定如何编写一个代码来实现这一点,我有一个大概的草案,我可以做什么,但我真的不知道如何正确地实现它(第43-54行,即注释#I与另一个粒子j碰撞后的代码)碰撞发生后,我想让它们以不同的速度朝相反的方向运动。我将根据粒子的质量计算动能。该项目的目标是基本显示不同参数(速度、质量、方向)的多个粒子在气体中运动的动能守恒。这是我当前的代码,任何帮助都将不胜感激!!: from tkinter import * from random import * my

我目前正试图使两个处于气态的粒子碰撞,但我不太确定如何编写一个代码来实现这一点,我有一个大概的草案,我可以做什么,但我真的不知道如何正确地实现它(第43-54行,即注释#I与另一个粒子j碰撞后的代码)碰撞发生后,我想让它们以不同的速度朝相反的方向运动。我将根据粒子的质量计算动能。该项目的目标是基本显示不同参数(速度、质量、方向)的多个粒子在气体中运动的动能守恒。这是我当前的代码,任何帮助都将不胜感激!!:

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左右发布答案非常感谢!!这些评论真的很有帮助,我现在没有任何问题!:)