Я не уверен, существует ли вообще замкнутая форма для перетаскивания или ветра, но довольно просто смоделировать поэтапно (как это делают все физические библиотеки):
установить ваше начальное условие:
x,y,vx,vy(for t=0)
обновить позицию:
x=x+(vx×dt)y=x+(vy×dt)
(где dt - время, прошедшее с момента последнего обновления, то есть время дельты)
рассчитать эти помощники скорости:
v2|v|=(vx)2+(vy)2=v2−−√
(где представляет длину )v|v|v
рассчитать силу сопротивления:
fdrag=c×v2
(где с - коэффициент трения малый! )
накапливать силы:
fxfy=(−fdrag×vx|v|)=(−fdrag×vy|v|)+(−g×mass)
(где - масса вашего мяча для гольфа)mass
скорость обновления:
vx=vx+fx×dtmassvy=vy+fy×dtmass
Это в основном метод Эйлера для аппроксимации этой физики.
Немного подробнее о том, как симуляция, как просили в комментариях:
- Начальное условие в вашем случае(t=0)
xyvxvy=0=0=v0×cos(θ)=v0×sin(θ)
Это в основном так же, как в вашей базовой формуле траектории, где каждое вхождение t заменяется на 0.
Кинетическая энергия справедлива для каждого . Смотрите как в (3) выше.KE=0.5m(V2)tv2
Потенциальная энергия также всегда верна.PE=m×g×y
Если вы хотите получить текущий для данного , вам нужно инициализировать симуляцию для и делать небольшие обновления dt, покаt 1 t = 0 t = t 1(x,y)t1t=0t=t1
Если вы уже вычислили для и хотите узнать их значения для где , все, что вам нужно сделать, - это рассчитать эти маленькие шаги обновления dt с доt 1 t 2 t 1 < t 2 t 1 t 2(x,y)t1t2t1<t2t1t2
Псевдо-код:
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