Я не впевнений, чи існує навіть закрита форма для перетягування або вітру, але це досить легко моделювати поетапно (як це роблять усі бібліотеки фізики):
встановіть початкову умову:
x,y,vx,vy(for t=0)
оновити позицію:
x=x+(vx×dt)y=x+(vy×dt)
(де dt - час, що минув з моменту останнього оновлення, aka delta time)
обчисліть ці помічники швидкості:
v2| v |= ( vх)2+ ( vу)2= v2--√
(де представляє довжину )v| v |v
розрахувати силу перетягування:
fгr a g= c × v2
(де c - коефіцієнт тертя малий! )
накопичують сили:
fхfу= ( - fгr a g× vх| v |)= ( - fгr a g× vу| v |) +(-г× м а с с )
(де - маса вашого м'яча для гольфу)м а с с
швидкість оновлення:
vх= vх+ fх× дтм а с сvу= vу+ fу× дтм а с с
Це в основному метод Ейлера для наближення цієї фізики.
Трохи більше про те, як моделювання, як вимагається в коментарях:
- Початкова умова у вашому випадку така( t = 0 )
хуvхvу= 0= 0= v0× c o s ( θ )= v0× s i n ( θ )
Це в основному те саме, що і у вашій базовій формулі траєкторії, де кожне виникнення t замінюється на 0.
Кінетична енергія справедлива для кожного . Дивіться як у (3) вище.КЕ= 0,5 м ( V2)тv2
Потенційна енергія також завжди діє.ПЕ= m × g× у
Якщо ви хочете отримати поточний для заданого , вам потрібно ініціалізувати моделювання для і робити невеликі оновлення dt до( х , у)т1t = 0t = t1
Якщо ви вже обчислили для і хочете знати їх значення для де , все, що вам потрібно зробити, - це обчислити ті невеликі кроки оновлення dt від до( х , у)т1т2т1< т2 t1т2
Псевдокод:
simulate(v0, theta, t1)
dt = 0.1
x = 0
y = 0
vx = v0 * cos(theta)
vy = v0 * sin(theta)
for (t = 0; t < t1; t += dt)
x += vx * dt
y += vy * dt
v_squared = vx * vx + vy * vy
v_length = sqrt(v_squared)
f_drag = c * v_squared
f_grav = g * mass
f_x = (-f_drag * vx / v_length)
f_y = (-f_drag * vy / v_length) + (-f_grav)
v_x += f_x * dt / mass
v_y += f_y * dt / mass
end for
return x, y
end simulate