所以我有一个看起来像这样的 Ball 类:
class Ball(object):
def __init__(self,n,x0,y0,dx,dy,r,c):
self.xc = x0
self.yc = y0
self.dx = dx
self.dy = dy
self.radius = r
self.area = math.pi*((r)**2)
self.color = c
self.name = n
def position(self):
return (self.xc,self.yc)
def move(self):
self.xc+=self.dx
self.yc+=self.dy
def collide(self,o,new_name):
x = ((self.area*self.xc)+(o.area*o.xc))/(self.area+o.area)
y = ((self.area*self.yc)+(o.area*o.yc))/(self.area+o.area)
dx = ((self.area*self.dx)+(o.area*o.dx))/(self.area+o.area)
dy = ((self.area*self.dy)+(o.area*o.dy))/(self.area+o.area)
if self.area >= o.area:
c = self.color
else:
c = o.color
area = (self.area+o.area)
r = math.sqrt(area/(math.pi))
return Ball(new_name,x,y,dx,dy,r,c)
def does_collide(self,o):
if math.hypot((self.xc-o.xc),(self.yc-o.yc))<=(self.radius+o.radius):
return True
else:
return False
我在我的主代码中运行了一个 while 循环来模拟各种球,每个球在每次迭代时都按其 dx 和 dy 值移动。为此,我有一个名为 balls 的列表,其中包含我所有的球对象。它看起来像这样:
balls=[ball1,ball2,ball3,ball4...] and so forth
我想要做的是在我的球类中使用 dos_collide 函数来检查两个球是否发生碰撞,如果发生碰撞,我想从列表中删除两个球并在列表中插入一个由 collide 函数创建的新球。collide 函数创建一个新球,其 x、y、dx 和 dy 值是两个球的加权平均值,其颜色是最大球的颜色。
那么对于我列表中的所有球,我如何使用 dos_collide 函数主动检查是否有任何两个球发生碰撞并将它们从列表中删除?我还想将新球添加到列表中,这是碰撞功能的结果。
我试着做这样的事情:
for ball1 in balls:
for ball2 in balls:
if ball1.name!=ball2.name:
if ball1.does_collide(ball2) == True:
ball = ball1.collide(ball2,(int(N)+1))
balls.append(ball)
balls.remove(ball1)
balls.remove(ball2)
但这似乎很混乱,每次发生碰撞时都会崩溃。