Я работаю над довольно сложным моделированием, касающимся коллапса и образования галактик. При создании этого моделирования я определил class Particle
, который обладает всей необходимой физикой для управления имитацией, а затем построил class Particle_Cloud
, который в основном является группой объектов частиц.
Вкл. при каждом повторении последовательности анимации я использую Particle_Cloud.update(dt)
для расчета изменений положения и тому подобного. Проблема возникает при обработке столкновений частиц. В существующем виде я создал функцию следующим образом:
part_sims = []
"""
Removing merged particles
"""
new_particles = [] #This list will contain the merged particles
for part in self.particles: #iteration through all particles
if part in self.particles: #Checking to make sure the particle is actually still there.
non_self_particles = [i for i in self.particles if i != part] #all of the particles which are not part.
part_sims = []
for i, j in enumerate([part.distance(k) < self.size_parameter for k in non_self_particles]):
if j == True and non_self_particles[i] in self.particles:
part_sims.append(i)
try:
self.particles.remove(part)
except:
pass
new_particles.append(part + non_self_particles[i])
else:
pass
for removed_particle in part_sims:
self.particles.remove(non_self_particles[removed_particle])
for i in new_particles:
self.particles.append(i)
В двух словах, я создал список new_particles
, содержащий комбинации, а затем перебрал каждую комбинацию, чтобы выяснить, какие частицы необходимы длякомбайн. Наконец, я добавил new_particles
к self.particles
и удалил удаляемые частицы.
Проблема в том, что я не могу заставить это работать универсально. По большей части это не удается, когда частицы находятся близко друг к другу, и я не могу понять, почему. Это также крайне неэффективно. Кто-нибудь знает лучший метод?