From 86d5ca98bfbf6a2e97af8920687857164f3e0fc8 Mon Sep 17 00:00:00 2001 From: Michael Bradley Date: Sat, 7 Oct 2023 21:42:30 -0400 Subject: [PATCH] Add constrained physics sim Performs slightly worse, sends less bodies flying off. --- data.py | 4 ++-- physics.py | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/data.py b/data.py index 29df928..5098d0f 100644 --- a/data.py +++ b/data.py @@ -3,7 +3,7 @@ import matplotlib.cm as cm import matplotlib.pyplot as plt import numpy as np -from physics import n_body_matrix +import physics def parse_csv(filename: str): @@ -54,7 +54,7 @@ class Animator: return self.scat, def update(self, *_args, **_kwargs): - n_body_matrix(self.pos, self.vel, self.mass) + physics.n_body_matrix_constrained(self.pos, self.vel, self.mass) self.scat.set_offsets(self.pos) return self.scat, diff --git a/physics.py b/physics.py index ac0b2a5..232520c 100644 --- a/physics.py +++ b/physics.py @@ -34,3 +34,24 @@ def n_body_matrix(pos: np.ndarray, vel: np.ndarray, mass: np.ndarray): ) pos += vel + + +def n_body_matrix_constrained(pos: np.ndarray, vel: np.ndarray, mass: np.ndarray, close=2.): + dist = np.zeros((len(pos) - 1, len(pos), 2)) + rot_mass = np.zeros((len(mass) - 1, len(mass), 1)) + + pos2 = np.concatenate((pos, pos)) + mass2 = np.concatenate((mass, mass)) + + for i in range(1, len(pos)): + dist[i - 1] = pos2[i: i + len(pos)] - pos + rot_mass[i - 1] = mass2[i: i + len(mass)] + + a = np.linalg.norm(dist, axis=2) + a[a < close] = close + vel += G * np.sum( + dist * rot_mass / (a ** 3)[:, :, np.newaxis], + axis=0 + ) + + pos += vel