Python elasti c столкновения не работают для цикла for - PullRequest
1 голос
/ 11 марта 2020

У меня есть массив частиц, которые являются объектами класса, и я пытаюсь запрограммировать эластичные c столкновения между любыми частицами, когда они сталкиваются. Мне удалось заставить его работать только с двумя жестко закодированными, но, похоже, он не работает с использованием a для l oop:

for _p1 in _particles:
    for _p2 in _particles:
        if _p1 != _p2:
            _p1_x, _p1_y = _p1.get_pos()
            _p2_x, _p2_y = _p2.get_pos()
            _distance = ((_p2_x - _p1_x) ** 2 + (_p2_y - _p1_y) ** 2) ** 0.5

            if _distance <= abs(_p1.get_radius() + _p2.get_radius()):
                _u1x, _u1y = _p1.get_velocity()
                _u2x, _u2y = _p2.get_velocity()
                _m1 = _p1.get_mass()
                _m2 = _p2.get_mass()

                # Calculate the final velocities
                _v1x = _u1x * (_m1 - _m2) / (_m1 + _m2) + 2 * _u2x * _m2 / (
                        _m1 + _m2)
                _v2x = 2 * _u1x * _m1 / (_m1 + _m2) - _u2x * (_m1 - _m2) / (_m1 + _m2)

                # Apply the new velocity in the x plane
                _p1.set_velocity(_v1x, _u1y)
                _p2.set_velocity(_v2x, _u2y)

Частицы просто проходят друг через друга. Моя теория состоит в том, что частицы, переключающиеся в следующем oop, отменяют изменение скорости net, следовательно, их пути остаются неизменными. Любые предложения, как это исправить?

1 Ответ

3 голосов
/ 11 марта 2020

Попробуйте вычислить только каждую комбинацию частиц один раз:

for i, p1 in enumerate(_particles):
    for p2 in _particles[i + 1:]:
       # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...