# Adding air drag to a golf ball trajectory equation

I'm developing a 2D golf game in VB.NET 2005, but I am stuck on how to implement air or wind drag that should affect the ball.

Already I have these equations for projectile:

• $v_0$ for the initial velocity of a golfball when hit or fired
• Vertical and horizontal components the velocity of the golfball: \begin{align} v_x &= v_0 cos(\theta) \\ v_y &= v_0 sin(\theta) - gt* \end{align}

• Vertical and horizontal distance of golfball: \begin{align} x &= v_0cos(\theta)t \\ y &= v_0sin(\theta) t - (0.5)gt^2 \end{align}

How do I add air drag to this equation to properly affect the velocity of the golf ball? I don't have any idea how to do it, has anyone worked with similar equations?

I'm not sure if there even exists a closed form for drag or wind, but it is quite easy to simulate in a step-wise fashion (like all the physics libraries do):

$$x, y, v_x, v_y \; (\text{for }t=0)$$

2. update position:

$$x = x + (v_x \times dt) \\ y = x + (v_y \times dt)$$

(where dt is the time elapsed since the last update, aka delta time)

3. calculate these velocity helpers:

\begin{align} v^2 &= (v_x)^2 + (v_y)^2 \\ \lvert v \rvert &= \sqrt{v^2} \end{align}

(where $\lvert v \rvert$ represents the length of $v$)

4. calculate drag force:

$$f_{drag} = c \times v^2$$

(where c is the coefficient of friction small!)

5. accumulate forces:

\begin{align} f_x &= \left(-f_{drag} \times {v_x \over \lvert v \rvert}\right) \\ f_y &= \left(-f_{drag} \times {v_y \over \lvert v \rvert}\right) + (-g \times mass) \end{align}

(where $mass$ is the mass of your golf ball)

6. update velocity:

$$v_x = v_x + f_x \times \frac{dt}{mass} \\ v_y = v_y + f_y \times \frac{dt}{mass}$$

That's basically Euler's Method for approximating those physics.

A bit more on how the simulation as requested in the comments:

• The initial condition $(t = 0)$ in your case is

\begin{align} x &= 0 \\ y &= 0 \\ v_x &= v_0 \times cos(\theta) \\ v_y &= v_0 \times sin(\theta) \end{align}

It's basically the same as in your basic trajectory formula where every occurrence of t is replaced by 0.

• The kinetic energy $KE = 0.5m(V^2)$ is valid for every $t$. See $v^2$ as in (3) above.

• The potential energy $PE = m \times g \times y$ is also always valid.

• If you want to get the current $(x,y)$ for a given $t_1$, what you need to do is initialize the simulation for $t = 0$ and do small dt updates until $t = t_1$

• If you already calculated $(x,y)$ for a $t_1$ and you want to know their values for a $t_2$ where $t_1 \lt t_2$, all you need to do is calculating those small dt update steps from $t_1$ to $t_2$

## Pseudo-Code:

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
• Thank you so much for this, i'll try it out an get back to you. – Smith Apr 15 '11 at 7:47
• from these equations you provided, i'd like to get the current X & Y for a give time (t), should i replace my Vo with V_x and Vo with v_y? Also if i need to add the initial KE with which the ball was fired, will this KE=0.5*m*(V*V) be valid? – Smith Apr 15 '11 at 8:28
• @Smith I'll edit my answer to account for your questions – Jonas Bötel Apr 15 '11 at 10:00
• this is exactly what i did, and x is always negative, why? – Smith Apr 15 '11 at 11:29