def elasticCircles(mass1, mass2):
"Set final velocities for an elastic collision between two circles"
# Calculate the normal vector at contact point
x1, y1 = mass1.rect.center
x2, y2 = mass2.rect.center
nx = x2 - x1
ny = y2 - y1
r = hypot(nx, ny)
if r >= mass1.radius + mass2.radius or r == 0:
return # No contact!
nx /= r
ny /= r
# Calculate initial momenta
m1 = mass1.mass
m2 = mass2.mass
v1x, v1y = mass1.vel
v2x, v2y = mass2.vel
p1x = m1 * v1x
p1y = m1 * v1y
p2x = m2 * v2x
p2y = m2 * v2y
# Calculate impulse and final velocities
impulse = 2 * (m2 * (p1x * nx + p1y * ny) - m1 * (p2x * nx + p2y * ny)) / (m1 + m2)
if impulse > 0:
mass1.vel = (p1x - impulse * nx) / m1, (p1y - impulse * ny) / m1
mass2.vel = (p2x + impulse * nx) / m2, (p2y + impulse * ny) / m2
return True
评论列表
文章目录