# -*- 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()