私は現在のビリヤードシミュレーションで単純な2D衝突検出と処理のために作成されたプログラムを持っていますが、適切な物理学、つまり衝突のニュートン運動の法則を含む解決策を探しているのはごみです。私がこれまでに持っているものは、運動量を保存せず、物理学を単純化します。
def collide(ball1,ball2):
dx = ball1.x - ball2.x
dy = ball1.y - ball2.y
dist = (dx)**2+(dy)**2
if dist < (ball1.radius + ball2.radius)**2:
tangent = atan2(dy, dx)
angle = 0.5 * pi + tangent
angle1 = 2*tangent - ball1.angle
angle2 = 2*tangent - ball2.angle
speed1 = ball2.speed*e
speed2 = ball1.speed*e
(ball1.angle, ball1.speed) = (angle1, speed1)
(ball2.angle, ball2.speed) = (angle2, speed2)
ball1.x += sin(angle)
ball1.y -= cos(angle)
ball2.x -= sin(angle)
ball2.y += cos(angle)
衝突を実行する必要があるのはこれです。bounce()は壁にぶつかるためのものです
running = True
while running:
background()
for i,ball in enumerate(balls,1):
ball.bounce()
ball.move()
for ball2 in balls[i:]:
collide(ball,ball2)
ball.display()
pygame.display.flip()
私はまだこれにかなり慣れていないので、役に立たない/愚かなものは何でも変更してください