Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Как рассчитать рикошет?

У меня есть два тела круглой формы, они движутся на встречу друг к другу и сталкиваются. При столкновении вектора их направления движения должны измениться. Как их рассчитать? (массы одинаковые, трения нет, размер не важен) V1={x1,y1} V2={x2,y2} N={x3,y3}

Мое предположение что так:

(x1*x3+y1*y3) / sqrt(x1^2 + x3^2) * sqrt(y1^2+y3^2) = получим число F и умножим так вектор V1 - (x1*F, y1*F)
Попробовал просто сложить вектора N+V1 вроде похоже получилось


Ответ

вобщем, сперва как уже сказали в комментариях, нужно определить пересекаются ли круги - для этого нужно добавить условие
if (distBetweebCirles <= circle1.radius + circle2.radius) { // collision happened // resolve it }
в вашем случае distBetweenCirles это длина вектора N(пожалуйста, обозначьте его как то подругому, например distanceVector), а радиус можно считать эквивалентным массе при симуляции.
Далее, допустим круги сталкиваются, так как массы одинаковые, то векторы скоростей просто обменяются друг с другом. Это следует из следующей формулы (которая также применима и для случая с разнымы массами)
1)
v1 = (u1 * (m1 - m2) + 2 * m2 * u2) / (m1 + m2)
v2 = (u2 * (m1 - m2) + 2 * m1 * u1) / (m1 + m2)
где u1, u2 векторы скоростей до столкновения, а v1, v2 после. И если m1 == m2 то получаем
2)
v1 = u2
и соотвественно
v2 = u1 (как это вышло выведите сами из формулы 1))
Откуда взялась первая формула ? - при таком упругом столкновении действуют закон сохранения импульса и закон сохранения энергии
следовательно, необходимо решить систему уравнений относительно v1 и v2
m1 * u1 + m2 * u2 = m1 * v1 + m2 * v2
(m1 * u1^2) / 2 + (m2 * u2^2) / 2 = (m1 * v1^2) / 2 + (m2 * v2^2) / 2
решение которого есть формула 1)
читать подробнее про мат часть тут

Комментариев нет:

Отправить комментарий