Не отвечая на ваш вопрос, я бы хотел прокомментировать вашу стратегию реализации и рекомендовать новый подход.Вы представляете скорость мяча в форме полярных координат, как ball.angle
и ball.speed
.
Я думаю, что это будет вообще неудобно для вас.Например, в коде столкновения вы в итоге вызываете atan2
, чтобы превратить вектор (dx
, dy
) в угол, а затем вы вызываете sin
и cos
, чтобы превратить угол обратно в векторснова.(Кроме того, если вы когда-нибудь попытаетесь обобщить свой код на три измерения, вы окажетесь в мире боли.) Поэтому, если у вас нет особых требований, требующих полярных координат, я рекомендую вам делать то, что делают все остальные, а именно представлятьскорость шара в декартовых координатах как вектор (vx
, vy
).
Я также рекомендую изменить свой физический подход с static one ("в настоящее время это объект A")столкновение с объектом B? ") с динамическим единицей (" будет ли объект A сталкиваться с объектом B во время его следующего шага движения? ").В системе статической физики вы часто сталкиваетесь с объектами, пересекающими друг друга в конце шага движения, и затем вам нужно найти лучший способ заставить их снова разделиться, что трудно понять правильно.
Если вы сделаете оба из них, отскок мяча без какой-либо тригонометрии будет простым.
Шаг 1. Преобразуйте столкновение окружности / окружности в столкновение точки / окружности, используя сложение Минковского :
Шаг 2. Рассмотрим временной отрезок, в котором шар начинается с p = (px, py) и перемещается на v = (VX, VY).Это пересекается с кругом?Для этого вы можете использовать стандартный тест отрезка / круга , за исключением того, что смысл теста перевернут.
Шаг 3. Найти точку столкновения c =(сх, су).Мяч отскакивает от круга так же, как и от линии t , касающейся круга в этой точке.Для окружности с центром в начале координат касательный вектор просто (-cy, cx), и я уверен, что вы можете определить, как его вычислить для других окружностей.
См. Этот ответ , чтобы узнать, как рассчитать новый путь мяча на основе коэффициентов трения и восстановления.
Шаг 4. Не забывайте, что мяч все еще может иметь некоторое расстояние додвигаться по новому вектору w .Если шаг по времени достаточно велик или скорость достаточно высока, он может снова столкнуться в течение того же отрезка времени.