#! /usr/bin/env python
# -*- coding: utf-8 -*-

"""
Movimento Oblíquo - Lançamento de três objetos de massas diferentes
Autor: Humberto L. Oliveira
Data: Outubro 2011
"""

def deslocamento(corpo):
    global dt
    queda = True
    corpo.pos += dt*corpo.v + dt**2*corpo.a/2.
    if corpo.v.y < 0 and corpo.y < corpo.radius:
        f = (corpo.traj.y[-1] - corpo.radius)/(corpo.traj.y[-1]
                                                   - corpo.y)
        corpo.pos -= (1 - f)*(corpo.pos - corpo.traj.pos[-1])
        corpo.v += f*dt*corpo.a
        corpo.t += f*dt
        queda = False
    else:
        corpo.t += dt
        corpo.v += dt*corpo.a
    corpo.d += mag(corpo.pos - corpo.traj.pos[-1])
    corpo.traj.append(pos=corpo.pos)
    return queda

def trajetoria(corpo):
    corpo.t = 0
    corpo.d = 0
    corpo.traj = curve(color=corpo.color,radius=0.05)
    corpo.traj.append(pos=corpo.pos)
    return

def resultados(corpo):
    alcance = corpo.traj.x[-1] - corpo.traj.x[0]
    velocidade = corpo.d / corpo.t
    print corpo.nome
    print '   Tempo de vôo         = %.2f s' % corpo.t
    label(pos=corpo.pos, xoffset=10, yoffset=20, space=corpo.radius,
          text='%.1f m' % alcance)
    print '   Distância percorrida = %.2f m' % corpo.d
    print '   Velocidade média     = %.2f m/s' % velocidade
    return

from visual import *
scene.autoscale=0
scene.range=11
scene.background=(1,1,1)
scene.forward=(1,-1,-0.6)

dt = 0.01
ang = pi/6     # [HACK] Ângulo de lançamento (em radianos). Tente pi/4 para 45 graus.
g = vector(0,-9.8,0) # [HACK] Gravidade. Tente (0, -1.6, 0) para a Lua.
ro_ar = 1.2    # [HACK] Densidade do ar (kg/m^3). 1000 simula água.
q1 = q2 = q3 = True
r1 = r2 = r3 = True

poste1 = cylinder(pos=(-8,0,0), axis=(0,1.4,0), radius=0.1, color=(0.6,0.5,0))
poste2 = cylinder(pos=(-8,0,-2), axis=(0,1.4,0), radius=0.1, color=(0.6,0.5,0))
poste3 = cylinder(pos=(-8,0,2), axis=(0,1.4,0), radius=0.1, color=(0.6,0.5,0))
solo = box(pos=(0,-0.25,0), size=(17,0.5,16), color=(0.8,1,0.6))
b1 = sphere(pos=(-7,2,0), radius=0.325, color=(1,1,0))
b2 = sphere(pos=(-7,2,-2), radius=0.001, color=(0,0,1))
b3 = sphere(pos=(-7,2,2), radius=0.19, color=(1,0.8,0))
canhao1 = cylinder(pos=b1.pos, axis=(-2*cos(ang),-2*sin(ang),0), radius=0.35,
                   color=(0.5,0.5,0.9))
canhao2 = cylinder(pos=b2.pos, axis=(-2*cos(ang),-2*sin(ang),0), radius=0.1,
                   color=(0.5,0.5,0.9))
canhao3 = cylinder(pos=b3.pos, axis=(-2*cos(ang),-2*sin(ang),0), radius=0.2,
                   color=(0.5,0.5,0.9))

b1.m = 0.062   # Massa da Bola de Tênis (kg)
b3.m = 0.0024  # Massa da Bola de Ping-Pong (kg)
v0 = 12        # [HACK] Velocidade inicial (m/s).
b1.v = v0*vector(cos(ang), sin(ang), 0)
b2.v = v0*vector(cos(ang), sin(ang), 0)
b3.v = v0*vector(cos(ang), sin(ang), 0)
b2.a = g
b1.nome = 'Bola de Tênis'
b2.nome = 'Eletron'
b3.nome = 'Bola de Ping-Pong'
trajetoria(b1)
trajetoria(b2)
trajetoria(b3)

show = 0
while 1:
    rate(1/dt)
    if scene.mouse.clicked:
        scene.mouse.getclick()
        show = show+1
    if show == 4:
        break
    if show == 1:
        while q2:
            rate(100)
            if q2: q2 = deslocamento(b2)
        if r2:
            resultados(b2)
            r2 = False
    if show == 2:
        while q1:
            rate(100)
            b1.a = g - 0.25*ro_ar*pi*(b1.radius/10.)**2*mag(b1.v)*b1.v/b1.m
            if q1: q1 = deslocamento(b1)
        if r1:
            resultados(b1)
            r1 = False
    if show == 3:
        while q3:
            rate(100)
            b3.a = g - 0.25*ro_ar*pi*(b3.radius/10)**2*mag(b3.v)*b3.v/b3.m
            if q3: q3 = deslocamento(b3)
        if r3:
            resultados(b3)
            r3 = False
print 'Fim'
