/ PiCollisions / physics.py
physics.py
 1  from decimal import Decimal
 2  from typing import Tuple
 3  
 4  
 5  def calculate_collision(m1: int, v1: Decimal, m2: int, v2: Decimal) -> Tuple[Decimal, Decimal]:
 6      """
 7      Calculates the new velocities after the two blocks collide.
 8  
 9      :param m1: Mass of first block
10      :param v1: Velocity of first block
11      :param m2: Mass of second block
12      :param v2: Velocity of second block
13      :return: The two new velocities
14      """
15  
16      mv: Decimal = m1 * v1 + m2 * v2
17      s: Decimal = m1 + m2
18      b: Decimal = mv / s
19      d: Decimal = (b ** 2 - (mv ** 2 - (m1 * v1 ** 2 + m2 * v2 ** 2) * m2) / (m1 * s)).sqrt()
20      new_v1: Decimal = max([b - d, b + d], key=lambda a: abs(a - v1))
21      d: Decimal = (b ** 2 - (mv ** 2 - (m1 * v1 ** 2 + m2 * v2 ** 2) * m1) / (m2 * s)).sqrt()
22      new_v2: Decimal = max([b - d, b + d], key=lambda a: abs(a - v2))
23      return new_v1, new_v2