#! /usr/bin/env python # -*- coding: utf-8 -*- #================================================================ # mrua.py - movimiento de un cuerpo con aceleración constante #---------------------------------------------------------------- # FJA - fja@neocipres.com Abril de 2016 #================================================================ import argparse from visual import * from visual.graph import * desc = ("%(prog)s - movimiento uniformemente acelerado") epil = ("· Un click introduce en el movimiento una aceleración negativa") parser = argparse.ArgumentParser(description=desc, epilog=epil) parser.add_argument('-ap', '--acelp', help='aceleración positiva', type=float, default=1) parser.add_argument('-an', '--aceln', help='aceleración negativa', type=float, default=1) parser.add_argument('-e', '--escala', help='valor de la escala, por defecto 10', type=int, default=10) args = parser.parse_args() # Creamos las ventanas ventana = display(title='Movimiento uniformemente acelerado', width=1024, height=600) ventana.autoscale = 1 grafica = gdisplay(x=0, y=610, width=510, height=300, title='x, v - t', xtitle='t(s)', ytitle='x, v', foreground=color.black, background=color.white) # Añadimos dos curvas posicion = gcurve(graph=grafica, color=color.red) velocidad = gcurve(graph=grafica, color=color.blue) # Condiciones iniciales e = abs(args.escala) ap = abs(args.acelp) an = abs(args.aceln) if ap > 3: ap = 3 if an > 3: an = 3 a = ap x = -12 * e y = 0.2 * e z = 0 vecr = vector(x, y, z) v = 0. vecv = vector(v, 0, 0) p = 0 dt = 0.01 # 1. / 100 t = 0 # Creamos los objetos suelo = box(pos=(0, 0, 0), size=(abs(x / e) * 2, 0.1, 10), color=color.orange) bola = sphere(pos=vecr / e, radius=0.2, color=color.cyan) trayectoria1 = points(shape="round", size=3, color=color.white) trayectoria2 = points(shape="round", size=3, color=color.green) flechav = arrow(color=color.yellow, pos=(x / e + 1, 0.5, 0), axis=vecv / e) flechaa = arrow(color=color.green, pos=(x / e, 1, 0), axis=(a, 0, 0)) txtt = label(pos=(-9, 7, 0), box=False, text='t = ') txtv = label(pos=(-3, 7, 0), box=False, text='v = ', color=color.yellow) txta = label(pos=(3, 7, 0), box=False, text='a = ', color=color.green) # Animación while 1: if ventana.mouse.clicked: a = ap - an v = v + a * dt x = x + v * dt vecr = vector(x, y, z) vecv = vector(v, 0, 0) bola.pos = vecr / e if v > 0: d = 1 else: d = -1 flechav.pos = (x / e + d, 0.5, 0) flechav.axis = vecv / e flechaa.pos = (x / e, 1, 0) flechaa.axis = (a, 0, 0) posicion.plot(pos=(t, x)) velocidad.plot(pos=(t, v)) if p > 10 * e: if v > 0: trayectoria1.append(vecr / e) else: trayectoria2.append(vecr / e) p = 0 if abs(x / e) > suelo.length / 2: break p += 1 t += dt txtt.text = 't = ' + str(round(t, 1)) + ' s' txtv.text = 'v = ' + str(round(v, 1)) + ' m/s' txta.text = 'a = ' + str(round(a, 1)) + ' N/kg' rate(100)