#! /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)