#python #physics #collision
#python #физика #столкновение
Вопрос:
Итак, я пытаюсь создать симулятор физики 2d-шара. Прежде чем я попытаюсь продвинуться вперед и реализовать визуальные эффекты, я проверяю, как будет работать физика, и я застрял на реализации этого уравнения. Это то, до чего я дошел до сих пор:
import math
b1m = 50 # ball 1 mass
b2m = 40 # ball 2 mass
b1vx = 35 # ball 1 velocity x
b1vy = 10 # ball 1 velocity y
b2vx = -15 # ball 2 velocity x
b2vy = -40 # ball 2 velocity y
b1v = math.sqrt(abs(b1vx) abs(b1vy)) # ball 1 velocity | calculates overall velocity/speed
b2v = math.sqrt(abs(b2vx) abs(b2vy)) # ball 2 velocity | calculates overall velocity/speed
b1ma = math.degrees(math.atan2(b1vy, b1vx)) % 360 # ball 1 movement angle | calculates the angle at
which the ball is travelling
b2ma = math.degrees(math.atan2(b2vy, b2vx)) % 360 # ball 2 movement angle | calculates the angle at
which the ball is travelling
ca = 31.5 # contact angle
b1vx = (b1v * math.cos(b1ma - ca) * (b1m - b2m) 2 * b2m * math.cos(b2ma - ca)) / (b1m b2m) *
math.cos(ca) b1v * math.sin(b1ma - ca) * math.cos(ca (math.pi/2))
b1vy = (b1v * math.cos(b1ma - ca) * (b1m - b2m) 2 * b2m * math.cos(b2ma - ca)) / (b1m b2m) *
math.sin(ca) b1v * math.sin(b1ma - ca) * math.sin(ca (math.pi/2))
print(b1vx) # print to check if correct values | correct value should be -17.11
print(b1vy) # print to check if correct values | correct value should be 21.94
# according to http://www.sciencecalculators.org/mechanics/collisions/
Я не уверен, что происходит не так, но это приводит к неправильным результатам для переменных, которые я присвоил. Я попытался преобразовать углы в радианы, поскольку я знаю, что это python по умолчанию, я попытался немного отредактировать уравнение, чтобы посмотреть, не был ли нарушен порядок операций. Но результатов все еще нет. Я основываю необходимые значения на этом веб-сайте, на котором показано моделирование 2d-шара на основе заданных пользователем переменных. Любая помощь приветствуется!
Ответ №1:
Спасибо за интересный вопрос, мне понравилось работать над ним. В вашем коде есть 3 проблемы:
- Общая скорость обоих шаров зависит от квадратного корня из суммы квадратов составляющих (теорема Пифагора). Отдельные компоненты не были возведены в квадрат в вашем коде
- В вашей формуле для вычисления результирующих скоростей в числителе отсутствует компонент: b2v (in
2* m2 * v2 * cos(θ2−φ)
) math.cos
иmath.sin
bith принимают угловые значения в радианах в качестве входных данных.
Исправив все три, я смог воспроизвести ожидаемые значения. Однако, набирая этот ответ, я заметил, что скорость в направлении y имела неправильный знак. То же самое было верно для компонента y второго шара. Я снова проверил уравнения, но не смог обнаружить еще одну ошибку. Однако, если вы посмотрите на анимацию веб-сайта, на который вы ссылались, вы можете увидеть, что шар движется к нижнему левому краю анимации, поэтому x и y кажутся отрицательными. Я играл с разными входными значениями, и направление движения мяча никогда не соответствовало его представленной скорости y. Если нет какой-либо очевидной инверсии знака, которую я пропускаю, это может быть ошибкой на этом веб-сайте.
Вот код:
import math
b1m = 50 # ball 1 mass
b2m = 40 # ball 2 mass
b1vx = 35 # ball 1 velocity x
b1vy = 10 # ball 1 velocity y
b2vx = -15 # ball 2 velocity x
b2vy = -40 # ball 2 velocity y
#1 square root of squared components
b1v = math.sqrt(b1vx**2 b1vy**2) # ball 1 velocity | calculates overall velocity/speed
b2v = math.sqrt(b2vx**2 b2vy**2) # ball 2 velocity | calculates overall velocity/speed
# ball 1 movement angle | calculates the angle at which the ball is travelling
b1ma = math.atan2(b1vy, b1vx)
# ball 2 movement angle | calculates the angle at which the ball is travelling
b2ma = math.atan2(b2vy, b2vx)
ca = math.radians(31.5) # contact angle
#3 component missing in second component of numerator of fraction (b2v)
b1vx = ((b1v * math.cos(b1ma - ca) * (b1m - b2m) 2 * b2m * b2v * math.cos(b2ma - ca)) / (b1m b2m)) * math.cos(ca) b1v * math.sin(b1ma - ca) * math.cos(ca (math.pi/2))
b1vy = ((b1v * math.cos(b1ma - ca) * (b1m - b2m) 2 * b2m * b2v * math.cos(b2ma - ca)) / (b1m b2m)) * math.sin(ca) b1v * math.sin(b1ma - ca) * math.sin(ca (math.pi/2))
b2vx = ((b2v * math.cos(b2ma - ca) * (b2m - b1m) 2 * b1m * b1v * math.cos(b1ma - ca)) / (b2m b1m)) * math.cos(ca) b2v * math.sin(b2ma - ca) * math.cos(ca (math.pi/2))
b2vy = ((b2v * math.cos(b2ma - ca) * (b2m - b1m) 2 * b1m * b1v * math.cos(b1ma - ca)) / (b2m b1m)) * math.sin(ca) b2v * math.sin(b2ma - ca) * math.sin(ca (math.pi/2))
print(b1vx) # print to check if correct values | correct value should be -17.11
print(b1vy) # print to check if correct values | correct value should be 21.94
print(b2vx)
print(b2vy)
# according to http://www.sciencecalculators.org/mechanics/collisions/
Комментарии:
1. Большое спасибо за помощь. Я могу, наконец, реализовать его. Я полагаю, последняя проблема, о которой вы говорили, может заключаться в том, что система координат на веб-сайте, на который я ссылался, начинается (0,0) снизу слева. Но в любом случае я вставил его в свой код, и он отлично работает благодаря вам.