import sympy as sp import numpy as np # Definicja danych wejściowych r1 = 1.0 # średnica piłki 1 m1 = 1.0 # masa piłki 1 x1, y1, z1 = 0.0, 0.0, 0.0 # początkowe położenie piłki 1 vx1, vy1, vz1 = 1.0, 1.0, 1.0 # prędkość piłki 1 r2 = 1.0 # średnica piłki 2 m2 = 1.0 # masa piłki 2 x2, y2, z2 = 1.0, 1.0, 1.0 # początkowe położenie piłki 2 vx2, vy2, vz2 = -1.0, -1.0, -1.0 # prędkość piłki 2 # Promienie piłek R1 = r1 / 2 R2 = r2 / 2 # Promień sumaryczny do sprawdzenia kolizji R = R1 + R2 # Zmienne czasowe t = sp.symbols('t') # Położenie piłek w funkcji czasu x1t = x1 + vx1 * t y1t = y1 + vy1 * t z1t = z1 + vz1 * t x2t = x2 + vx2 * t y2t = y2 + vy2 * t z2t = z2 + vz2 * t # Odległość między piłkami w funkcji czasu distance = sp.sqrt((x2t - x1t)**2 + (y2t - y1t)**2 + (z2t - z1t)**2) # Równanie kolizji collision_eq = sp.Eq(distance, R) # Rozwiązanie równania kolizji collision_time = sp.solve(collision_eq, t) collision_time = [t for t in collision_time if t >= 0] # Sprawdzenie, czy nastąpi kolizja if collision_time: t_collision = collision_time[0] # Punkt zderzenia x_collision = x1 + vx1 * t_collision y_collision = y1 + vy1 * t_collision z_collision = z1 + vz1 * t_collision collision_point = (x_collision.evalf(), y_collision.evalf(), z_collision.evalf()) else: collision_point = None if collision_point: # Przeliczenie położenia w momencie kolizji x1_collision = x1 + vx1 * t_collision y1_collision = y1 + vy1 * t_collision z1_collision = z1 + vz1 * t_collision x2_collision = x2 + vx2 * t_collision y2_collision = y2 + vy2 * t_collision z2_collision = z2 + vz2 * t_collision # Wektor normalny w momencie zderzenia n = np.array([x2_collision - x1_collision, y2_collision - y1_collision, z2_collision - z1_collision]).astype(float) n = n / np.linalg.norm(n) # Wektory prędkości v1 = np.array([vx1, vy1, vz1]) v2 = np.array([vx2, vy2, vz2]) # Prędkości po zderzeniu v1_prime = v1 - (2 * m2 / (m1 + m2)) * np.dot(v1 - v2, n) * n v2_prime = v2 - (2 * m1 / (m1 + m2)) * np.dot(v2 - v1, n) * n new_velocities = (v1_prime, v2_prime) else: new_velocities = None print("Punkt kolizji:", collision_point) print("="*20) print("Nowa prędkość po zderzeniu:", new_velocities) -------------------------------------------------------------- Punkt kolizji: (0.211324865405187, 0.211324865405187, 0.211324865405187) ==================== Nowa prędkość po zderzeniu: (array([-1., -1., -1.]), array([1., 1., 1.]))