使用python模拟2D弹性碰撞
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python模拟2D弹性碰撞相关的知识,希望对你有一定的参考价值。
我已经在Python 3中编写了一个脚本来模拟二维的弹性碰撞。我不知道我在做什么错,因为当我运行它时,这些球似乎相互粘连,有时会出现毛刺而变成一个球。另外,当单个球撞击屏幕的任何边缘时,它都会弹起,但是当另一个球粘在其上时,它将导致其中一个球从屏幕上脱落。
代码段:
class Particle(Sprite):
def __init__(self, image):
super(Particle, self).__init__(image)
self.Vxi, self.Vyi = random.randint(-3, 3), random.randint(-3, 3)
self.mass = random.randint(1, 100) / 1000
self.schedule_interval(self.update, 1/60)
def update(self, dt):
self.xpos, self.ypos = self.position
if self.xpos <= self.width/2 or self.xpos >= scr_width - self.width/2:
self.Vxi *= -1
if self.ypos <= self.width/2 or self.ypos >= scr_height - self.height/2:
self.Vyi *= -1
for particle in director.scene.children[0][1].particles:
particle_xpos, particle_ypos = particle.position
if abs(self.xpos - particle_xpos) <= self.width/2 + particle.width/2:
if abs(self.ypos - particle_ypos) <= self.height/2 + particle.height/2:
xmomentum = (particle.mass * particle.Vxi) + (self.mass * self.Vxi)
ymomentum = (particle.mass * particle.Vyi) + (self.mass * self.Vyi)
Vxf = (xmomentum - particle.mass * (self.Vxi - particle.Vxi)) / (particle.mass + self.mass)
Vyf = (ymomentum - particle.mass * (self.Vyi - particle.Vyi)) / (particle.mass + self.mass)
self.Vxi = Vxf
self.Vyi = Vyf
self.xpos += self.Vxi
self.ypos += self.Vyi
self.position = self.xpos, self.ypos
答案
我认为您忘记了在碰撞时更新另一个粒子的速度。
之前
self.Vxi = Vxf
self.Vyi = Vyf
也应该有
particle.Vxi = Vxf + (self.Vxi - particle.Vxi)
particle.Vyi = Vyf + (self.Vyi - particle.Vyi)
样式明智,我认为可以更好地命名变量。粒子对象不应具有称为Vxi
或Vxf
的属性。就物理粒子而言,它只有一个速度。初始/最终速度的概念与数值模拟相关联,粒子类的属性不应建模。在您当前的代码中,self
的“最终”速度被更新为其初始速度,这可能会造成混淆。
[Vxi
,Vyi
)的初始速度应取自self.Vx
开头的self.Vy
和update
。最后,Vfx
和Vfy
应该更新为self.Vx
和self.Vy
。
此外,最好在局部变量(例如V1_x_initial
,V2_x_initial
等中指示它是哪个粒子
以上是关于使用python模拟2D弹性碰撞的主要内容,如果未能解决你的问题,请参考以下文章