#!/usr/bin/python3 # ================================================================== # Cannonball Flight Time and Distance # Note: code has hidden (default) values built in for testing # ================================================================== import sys import user_interface as ui from math import pi, radians, cos, sin mvmin = 100.0 # minimum muzzle velocity mvmax = 2000.0 # maximum muzzle velocity angmin = 10.0 # minimum angle angmax = 85.0 # maximum angle default_mv = 100.0 # default muzzle velocity default_ang = 45.0 # angle # ------------------------------------------------------------------- # ---- display description # ------------------------------------------------------------------- def description(): txt = f''' --------------------- Fire a Cannon -------------------- muzzle velocity (feet/second) ({mvmin} <= mv <= {mvmax}) muzzle angle (degrees) ({angmin} <= ang <= {angmax}) ''' print() print(txt) print() # ------------------------------------------------------------------- # ---- main # ------------------------------------------------------------------- if __name__ == '__main__': description() while(True): # ---- ask the user for the muzzle velocity while(True): print() s = ui.get_user_input('Enter muzzle velocity (f/s): ') if not s: print() sys.exit() if s == 'z': # default value - good for testing mv = default_mv break x,mv = ui.is_float(s) if not x: print() print('You did not enter a number - try again') continue if mv < mvmin or mv > mvmax: print() print('illegal muzzle velocity - try again') continue break # ---- ask the user for the angle above horizontal while(True): print() s = ui.get_user_input('Enter muzzle angle (deg): ') if not s: print() sys.exit() if s == 'z': # default value - good for testing ang = default_ang break x,ang = ui.is_float(s) if not x: print() print('You did not enter a number - try again') continue if ang < angmin or ang > angmax: print() print('illegal angle - try again') continue break # ---- do the calculations vv = sin(radians(ang)) * mv # vertical velocity vh = cos(radians(ang)) * mv # horizontal velocity top = vv/32.00 # time to top of arc tt = 2 * top # total flight time dh = tt * vh # horizontal distance traveled dv = vv**2/(2*32.0) # vertical distance to top of arc print() print(f'muzzle velocity : {round(mv,2):<8} (ft/sec)') print(f'muzzle angle : {round(ang,2):<8} (deg)') print(f'vertical velocity : {round(vv,2):<8} (ft/sec)') print(f'horzontal velocity : {round(vh,2):<8} (ft/sec)') print(f'time to top of arc : {round(top,2):<8} (sec)') print(f'total flight time : {round(tt,2):<8} (sec)') print(f'distance horizontal: {round(dh,2):<8} (ft)') print(f'distance vertical : {round(dv,2):<8} (ft)') ui.pause()