VPython

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

VPython

Mensagempor Ivo_Timóteo em Segunda Dez 01, 2008 5:50 pm

Tal como prometido, vou apresentar o VPython à comunidade Quarkiana.

Vou assumir que já sabem um pouco de Python e passar à frente as partes específicas da linguagem (que acabam por ser muito poucas :) )

Em primeiro lugar têm de ter o VPython instalado no vosso computador.

Windows Users:
Podem ir ao site do VPython e fazer download da última package estável, mesmo que ainda n tenham o Python instalado. (Ela inclui o
IDLE, o modulo visual e outras coisas... )

Linux Users:
A partida já têm o Python :) Para terem o módulo visual, consultem a página :P

Vamos então começar por uma simples simulação de uma bola em queda livre que ressalta ao tocar no chão e tem um coeficiente de restituição igual a 1.


Em primeiro lugar, importamos tudo do módulo visual:
Código: Seleccionar Todos
from visual import *


Depois definimos umas variáveis que nos vão ser úteis :)
Código: Seleccionar Todos
g = 9.8
dt = 0.01


Agora criamos dois objectos, um vai representar a bola que é, naturalmente, uma esfera. O chão vai ser uma caixa.
Os argumentos parecem-me bastante óbvios mas nada como dar aqui um saltinho para ficar a saber tudo sobre como
se inicializam e como interagem os objectos e janelas no VPython.
Código: Seleccionar Todos
bola = sphere(pos=(0., 20., 0.), radius=2.0, color=color.red)
terra = box(pos=(0., -0.5, 0.), size=(20., 0.5, 20.), color=color.blue)


Neste momento estou a definir a variável vel associada ao objecto bola. Naturalmente vai representar a velocidade da bola.
O tipo de dados vector está definido em visual e dá bastante jeito, vejam na reference. Para além de ter várias operações
sobre vectores definidas, pode-se aceder às diferentes coordenadas com o nome x, y e z. Ex. bola.vel.y
Código: Seleccionar Todos
bola.vel = vector(0.,0., 0.)


Aqui controlo a "janela" que tem como nome default "scene"
Código: Seleccionar Todos
scene.autoscale=0
scene.center=(0,10,0)
scene.range=(25,25,25)


finalmente o ciclo de execução do programa:
Código: Seleccionar Todos
while 1:
    rate(100) # faz com que o programa execute 100 ciclos por segundo
                  # com dt= 0.01, temos "tempo real"
    bola.pos = bola.pos + bola.vel*dt  #esta ja todos conhecemos :)
    if bola.pos.y < bola.radius:   #condicao de colisao
        bola.vel.y = -bola.vel.y
    else:
        bola.vel.y = bola.vel.y -g*dt


Finalmente, se vos parecer demasiado lento para tempo real, lembrem-se que é uma esfera de 4 metros de diâmetro a cair de 20 metros de altura :twisted:

Comentários, correcções e perguntas são benvindas!
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: VPython

Mensagempor Ivo_Timóteo em Segunda Dez 01, 2008 6:32 pm

Agora uma pequena evolução! Vamos introduzir multiplas janelas e comandos :)

Julgo que o código não deve levantar muitas dúvidas. Não se esqueçam de dar uma vista de olhos à reference do VPython.
Qualquer dúvida estão à vontade :)

Eu pessoalmente gosto bastante de ver exemplos :D

Código: Seleccionar Todos
from visual import *
from visual.controls import *

#constantes
g = 9.8
dt = 0.01

#lado da janela
lado = 350

#janela principal
display(x=0, y=0, width=lado, height=lado, range=(25,25,25), center=(0,10,0))
#janela dos controlos
c = controls(x=lado, y=0, width=lado, height=lado, range=60,
             title="coef. restituicao");

#inicializacao dos objectos
bola = sphere(pos=(0., 20., 0.), radius=2.0, color=color.red)
terra = box(pos=(0., -0.5, 0.), size=(20, 0.5, 20), color=color.blue)

#algumas propriedades da bola
bola.vel = vector(0.,-0.1, 0.)
bola.cr = 1

#evita o autoscale
scene.autoscale=0

#funcao que altera o coeficiente de restituicao
def setC_r(x):
    bola.cr=x.value

#reset da posicao da bola
def setPos():
    bola.pos.y = 20.
    bola.vel.y = 0.

#inicializacao do slider
s = slider(pos=(-15, 40), width=10, length=80, axis=(0,-1,0), min=0, max=1,
           action=lambda: setC_r(s))

#inicializacao do reset
b = button(pos=(25, 0), witdth=15, length=20, text="RESET", action=lambda: setPos())

#escolha do valor inicial do slider
s.value=1


while 1:
    #controla o rate do ciclo (deve ser usado com atencao ao dt
    rate(100)
    #procura interaccoes nos controlos
    c.interact()
    #actualiza a posicao
    bola.pos = bola.pos + bola.vel*dt

    #teste de colisao
    if bola.pos.y < bola.radius:
        bola.pos.y=bola.radius
        bola.vel.y = -bola.vel.y*bola.cr
    else:
        bola.vel.y = bola.vel.y -g*dt
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: VPython

Mensagempor RicardoCampos em Segunda Dez 01, 2008 8:30 pm

Há VPython para 2.6 no Windows?
\emph{Ricardo Campos}\in \delta \bigcap q\overline{q}
O Matemático-Físico de 2008
Avatar do utilizador
RicardoCampos
top-Quark!
top-Quark!
 
Mensagens: 1280
Registado: Sexta Jun 01, 2007 3:49 pm
Localização: Figueira da Foz/Coimbra/DMUC/DFUC, Paris... E agora Zurique!

Re: VPython

Mensagempor Ivo_Timóteo em Segunda Dez 01, 2008 9:19 pm

Não sei, vê se a última versão do site é compatível
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: VPython

Mensagempor jap em Segunda Dez 01, 2008 9:28 pm

Creio que a última versão disponível para Windows do VPython só funciona (por enquanto) com o Python 2.5. Na realidade, não experimentei ainda usá-lo com o Python 2.6, é preciso testar. :?
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: VPython

Mensagempor Ivo_Timóteo em Quarta Fev 18, 2009 2:40 pm

Nova versão do vpython Visual 5 aqui.
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: VPython

Mensagempor Miro em Terça Maio 05, 2009 3:20 pm

já não pegava em python desde a fisica@UC no verão, decidi pegar ontem e exprimentar o Vpython, isto é bem porreiro!

fiz um programita simples, deve estar um bocado "estouvado" mas cumpre o objectivo :D

simula um "xuto" numa bola (um bloco vermelho a ir contra uma bola conta como xuto?)

inserimos a altura a que se dá o xuto, a velocidade imprimida pelo xuto, o angulo, aquilo simula a 3D e dá alguns dados, como tempo de voo, distancia etc.

agora tenho e incluir ressaltos, atritos do ar e por ai fora

deixo aqui para se alguem quiser ver

http://www.megaupload.com/?d=04S3UA9B

um screenshot:

Imagem

fica aqui o codigo (aumentei o tamanho do chao, no programa e na pic está minusculo)

última vez editado por Miro s Terça Maio 05, 2009 7:38 pm, editado 1 vez no total
666
Avatar do utilizador
Miro
down-Quark!
down-Quark!
 
Mensagens: 212
Registado: Sexta Jun 15, 2007 2:53 pm
Localização: Guimarães

Re: VPython

Mensagempor Miro em Terça Maio 05, 2009 6:14 pm

apos adicionar 3 linhas o meu programa deixou de dar direito, os objectos a certa altura "encolhem" todos ate so ver um ecran preto :?: :?: :?:

ja apaguei essas linhas extra de codigo e nada....ja reiniciei o python varias vezes e tudo

ele estava a dar perfeitamente!

(desculpem o double post)
666
Avatar do utilizador
Miro
down-Quark!
down-Quark!
 
Mensagens: 212
Registado: Sexta Jun 15, 2007 2:53 pm
Localização: Guimarães

Re: VPython

Mensagempor Bruno Oliveira em Terça Maio 05, 2009 7:16 pm

Se calhar podias pôr aqui o código e algum VPython expert pudesse ajudar-te no debug dele. :wink:
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: VPython

Mensagempor Miro em Terça Maio 05, 2009 7:29 pm

bem, já resolvi o problema

a velocidade é dado pela equação v = v0 + at

se eu meter o v0 acontece isso mas se o tirar não.....

vou masé fazer o programa de raiz, estava a reciclar coisas de outro lado deve estar ai o problema....

fica ai o codigo anyways (nao liguem aos nomes parvos :P )

666
Avatar do utilizador
Miro
down-Quark!
down-Quark!
 
Mensagens: 212
Registado: Sexta Jun 15, 2007 2:53 pm
Localização: Guimarães

Re: VPython

Mensagempor jap em Terça Maio 05, 2009 8:58 pm

Miro Escreveu:bem, já resolvi o problema

a velocidade é dado pela equação v = v0 + at

se eu meter o v0 acontece isso mas se o tirar não.....
(...)


:lol: :lol:

Há uma muito boa razão para o teu programa não funcionar com a linha onde implementas v = v0 + at e que agora está comentada no código! :P

Quem é o primeiro a explicar a razão desse bug? :D
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: VPython

Mensagempor Tharis em Terça Maio 05, 2009 11:05 pm

Li assim o código por alto e tentei perceber por alto o que faz. Supostamente temos um objecto que é atirado com velocidade inicial v0 e que depois tem a aceleração gravítica e o vento ao barulho.

Se bixo.velocity é a velocidade de bixo, então, se ja foi inicializada a variável com o valor de v0, porque é que se havia de estar a cada dt a adicionar-lhe de novo?

Será isto ou não percebi o programa?


Já agora Miro, quando encontrar o link de uma espécie de "manual de bom Python Coding" aconselho-te a ler. ;)

EDIT

Ora aqui está: PEP 8
última vez editado por Tharis s Terça Maio 05, 2009 11:15 pm, editado 1 vez no total
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: VPython

Mensagempor jap em Terça Maio 05, 2009 11:10 pm

Tharis Escreveu:(...)
Se bixo.velocity é a velocidade de bixo, então, se ja foi inicializada a variável com o valor de v0, porque é que se havia de estar a cada dt a adicionar-lhe de novo?

Será isto ou não percebi o programa?
(...)


É isso mesmo! :hands:

Por isso é que a linha substituta de código ... está absolutamente correcta, e a supostamente correcta está errada.

Ou seja:

no ciclo apenas implementamos o incremento da velocidade,

v += a*dt

a inicialização de v (atribuindo a v o valor da velocidade inicial) só deve ser feito uma vez e não dentro do ciclo!

Repara que

v + = a*dt significa, na realidade

v_novo = v_antigo + a*dt ...

onde o v_antigo é a velocidade do ciclo anterior!

Deu para perceber, Miro? :roll:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: VPython

Mensagempor Miro em Quarta Maio 06, 2009 12:27 am

oh, estupidez a minha! estava a ignorar completamente o + antes do =

sim já entendi! obrigado pela explicação professor e Tharis

vou ler esse PEP quando tiver tempo, eu sempre ui desorganizado em tudo mas alguma coisa hade adiantar :D
666
Avatar do utilizador
Miro
down-Quark!
down-Quark!
 
Mensagens: 212
Registado: Sexta Jun 15, 2007 2:53 pm
Localização: Guimarães

Re: VPython

Mensagempor Tharis em Quinta Jun 11, 2009 9:19 pm

Fiz esta coisinha como uma preparação para o hyper-mega projecto que hei-de fazer conjuntamente com people daqui. ;)

O código tá um bocadinho forçado e tá assim à papo-seco as coisas lá.... Utilizei a 1a lei de kepler e pouco mais de interessante... ;)

última vez editado por Tharis s Quinta Jun 11, 2009 9:38 pm, editado 1 vez no total
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Próximo

Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante

cron