Предположим, без ограничения общности, что мы находимся в системе отсчета второго объекта до столкновения.
Сохранение импульса:
m1*vx1 = m1*vx1' + m2*vx2'
m1*vy1 = m1*vy1' + m2*vy2'
Решение для vx1 ', vy1':
vx1' = vx1 - (m2/m1)*vx2'
vy1' = vy1 - (m2/m1)*vy2'
В тайне я запомню тот факт, что vx1'*vx1' + vy1'*vy1' = v1'*v1'
.
Сохранение энергии (одна из вещей, которую дают нам упругие столкновения, это то, что угол падения - это угол отражения):
m1*v1*v1 = m1*v1'*v1' + m2*v2'+v2'
Решение для v1 'в квадрате:
v1'*v1' = v1*v1 - (m2/m1)v2'*v2'
Объединение для устранения v1':
(1-m2/m1)*v2'*v2' = 2*(vx2'*vx1+vy2'*vy1)
Теперь, если вы когда-либо виделиСтационарный бильярдный удар, вы знаете, что он улетает в направлении нормального контакта (это то же самое, что ваш тета).
v2x' = v2'cos(theta)
v2y' = v2'sin(theta)
Следовательно:
v2' = 2/(1-m2/m1)*(vx1*sin(theta)+vy1*cos(theta))
Теперь вы можетерешить для v1 '(либо использовать v1'=sqrt(v1*v1-(m2/m1)*v2'*v2')
, либо решить все в терминах входных переменных).
Давайте назовем phi = arctan(vy1/vx1)
.Угол падения относительно касательной к окружности в точке пересечения составляет 90-phi-theta
(pi/2-phi-theta
, если вы предпочитаете).Снова добавьте это для отражения, затем преобразуйте обратно в угол относительно горизонтали.Назовем угол падения psi = 180-phi-2*theta
(pi-phi-2*theta
).Или,
psi = (180 or pi) - (arctan(vy1/vx1))-2*(arctan(dy/dx))
Итак:
vx1' = v1'sin(psi)
vy1' = v1'cos(psi)
Учтите: если эти круги должны быть сплошными трехмерными сферами, то используйте массу, пропорциональную кубу радиуса для каждой (обратите внимание, чтоконстанта пропорциональности отменяется).Если они должны быть похожими на диски, используйте массу, пропорциональную квадрату радиуса.Если они являются кольцами, просто используйте радиус.
Следующий момент, который следует учитывать: поскольку компьютер обновляется при дискретных событиях времени, у вас фактически есть перекрывающиеся объекты.Вы должны отказаться от объектов, чтобы они не перекрывались перед вычислением нового местоположения каждого объекта.Для дополнительного кредита определите время, которое они должны были пересечь, затем переместите их в новом направлении на это количество времени.Обратите внимание, что это время - просто перекрытие / старая скорость.Причина, по которой это важно, заключается в том, что вы можете представить себе вычисляемое столкновение, которое заставляет объекты по-прежнему перекрываться (вызывая их повторное столкновение).
Следующий момент, который следует рассмотреть: перевести исходную проблему в эту проблему, просто вычтите скорость объекта 2 из объекта 1 (по компонентам).После вычисления не забудьте добавить его обратно.
Заключительный момент для рассмотрения: я, вероятно, допустил ошибку алгебры где-то вдоль линии.Тебе следует серьезно подумать о проверке моей работы.