Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
""" | |
Graphical user interface to explore the influence | |
of disc throw parameters on the trajectory | |
""" | |
import numpy as np | |
import matplotlib.pyplot as pl | |
from matplotlib.widgets import Slider, TextBox | |
from shotshaper.projectile import DiscGolfDisc | |
name = 'dd2' | |
mass = 0.175 | |
d = DiscGolfDisc(name, mass=mass) | |
speed = 24 | |
omega = d.empirical_spin(speed) | |
z0 = 1.3 | |
pos = np.array((0,0,z0)) | |
pitch = 10 | |
nose = 0.0 | |
roll = 15.0 | |
yaw = 0 | |
adjust_axes = False | |
s = d.shoot(speed=speed, omega=omega, pitch=pitch, position=pos, nose_angle=nose, roll_angle=roll,yaw=yaw) | |
x,y,z = s.position | |
# Creating figure | |
fig = pl.figure(1,figsize=(13, 6), dpi=80) | |
ax1 = pl.subplot(2,3,2) | |
ax2 = pl.subplot(2,3,5) | |
ax3 = pl.subplot(1,3,3) | |
fac = 1.6 | |
ylim = fac*max(abs(min(y)),abs(max(y))) | |
ax1.axis((min(x),fac*max(x),-ylim,ylim)) | |
ax2.axis((min(x),fac*max(x),min(z),fac*max(z))) | |
ax3.axis((-ylim,ylim,min(z),fac*max(z))) | |
ax3.invert_xaxis() | |
l1, = ax1.plot(x,y,lw=2) | |
ax1.set_xlabel('Distance (m)') | |
ax1.set_ylabel('Drift (m)') | |
l2, = ax2.plot(x,z,lw=2) | |
ax2.set_xlabel('Distance (m)') | |
ax2.set_ylabel('Height (m)') | |
l3, = ax3.plot(y,z,lw=2) | |
ax3.set_xlabel('Drift (m)') | |
ax3.set_ylabel('Height (m)') | |
xax = 0.07 | |
ax4 = pl.axes([xax, 0.80, 0.25, 0.03], facecolor='lightgrey') | |
ax5 = pl.axes([xax, 0.75, 0.25, 0.03], facecolor='lightgrey') | |
ax6 = pl.axes([xax, 0.70, 0.25, 0.03], facecolor='lightgrey') | |
#ax7 = pl.axes([xax, 0.65, 0.25, 0.03], facecolor='lightgrey') | |
ax8 = pl.axes([xax, 0.65, 0.25, 0.03], facecolor='lightgrey') | |
ax9 = pl.axes([xax, 0.60, 0.25, 0.03], facecolor='lightgrey') | |
ax11 = pl.axes([xax, 0.55, 0.25, 0.03], facecolor='lightgrey') | |
s1 = Slider(ax=ax4, label='Speed (m/s)', valmin=15, valmax=35, valinit=speed) | |
s2 = Slider(ax=ax5, label='Roll (deg)', valmin=-110, valmax=110, valinit=roll) | |
s3 = Slider(ax=ax6, label='Pitch (deg)', valmin=-10, valmax=50, valinit=pitch) | |
s5 = Slider(ax=ax8, label='Nose (deg)', valmin=-5, valmax=5, valinit=nose) | |
s7 = Slider(ax=ax9, label='Mass (kg)', valmin=0.140, valmax=0.200, valinit=mass) | |
s6 = Slider(ax=ax11, label='Spin (-)', valmin=0, valmax=2, valinit=1.0) | |
def update(x): | |
speed = s1.val | |
roll = s2.val | |
pitch = s3.val | |
nose = s5.val | |
spin = s6.val | |
mass = s7.val | |
d = DiscGolfDisc(name,mass=mass) | |
omega = spin*d.empirical_spin(speed) | |
s = d.shoot(speed=speed, omega=omega, pitch=pitch, position=pos, nose_angle=nose, roll_angle=roll) | |
x,y,z = s.position | |
l1.set_xdata(x) | |
l1.set_ydata(y) | |
l2.set_xdata(x) | |
l2.set_ydata(z) | |
l3.set_xdata(y) | |
l3.set_ydata(z) | |
if adjust_axes: | |
ax1.axis((min(x),max(x),min(y),max(y))) | |
ax2.axis((min(x),max(x),min(z),max(z))) | |
ax3.axis((min(y),max(y),min(z),max(z))) | |
fig.canvas.draw_idle() | |
s1.on_changed(update) | |
s2.on_changed(update) | |
s3.on_changed(update) | |
s5.on_changed(update) | |
s6.on_changed(update) | |
s7.on_changed(update) | |
pl.show() | |