Обработка коллизий для больших наборов данных? - PullRequest
1 голос
/ 22 декабря 2019

Я работаю над довольно сложным моделированием, касающимся коллапса и образования галактик. При создании этого моделирования я определил 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 и удалил удаляемые частицы.

Проблема в том, что я не могу заставить это работать универсально. По большей части это не удается, когда частицы находятся близко друг к другу, и я не могу понять, почему. Это также крайне неэффективно. Кто-нибудь знает лучший метод?

...