Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
""" | |
This program calculates trajectories that were experimentally conducted in | |
Mencke, J. E., Salewski, M., Trinhammer, O. L., & Adler, A. T. (2020). | |
Flight and bounce of spinning sports balls. American Journal of Physics, | |
88(11), 934-947. | |
Specifically, this includes data for: | |
- a shot put throw, representing a heavy projectile where the | |
gravitational forces dominate over the aerodynamic forces | |
- a soccer ball, with slightly more influence of air drag | |
- a table tennis ball, significantly impacted by air drag due | |
to low weight | |
""" | |
from shotshaper.projectile import SoccerBall, ShotPutBall, TableTennisBall | |
import matplotlib.pyplot as pl | |
import numpy as np | |
cases = ('Shot','Soccer ball','Table tennis ball') | |
projectiles = (ShotPutBall('M'), SoccerBall(), TableTennisBall()) | |
ux = (9.0, 11.0, 11.8) | |
uy = (7.1, 10.2, 12.0) | |
z0 = (2.4, 0.0, 1.0) | |
spin = (0,0,0) | |
f, ax = pl.subplots(1, 1, figsize=(6,4)) | |
for i,c in enumerate(cases): | |
speed = np.sqrt(ux[i]**2 + uy[i]**2) | |
pitch = np.degrees(np.arctan2(uy[i],ux[i])) | |
position = (0, 0, z0[i]) | |
s = projectiles[i].shoot(speed=speed,pitch=pitch,position=position,spin=spin) | |
x,y,z = s.position | |
ax.plot(x,z,'C0-') | |
ax.text(x[0]-0.5, z[0], c, fontsize=9, ha='right') | |
x,z = np.loadtxt(f'data/{c}_trajectory.dat', unpack=True, delimiter=';') | |
ax.plot(x,z,'C1--') | |
ax.legend(('Simulation','Experiment')) | |
ax.axis((-10,25,-1,6)) | |
pl.xlabel('Length (m)') | |
pl.ylabel('Height (m)') | |
pl.show() | |