Página 1 de 4

VPython

MensagemEnviado: Segunda Dez 01, 2008 5:50 pm
por Ivo_Timóteo
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!

Re: VPython

MensagemEnviado: Segunda Dez 01, 2008 6:32 pm
por Ivo_Timóteo
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

Re: VPython

MensagemEnviado: Segunda Dez 01, 2008 8:30 pm
por RicardoCampos
Há VPython para 2.6 no Windows?

Re: VPython

MensagemEnviado: Segunda Dez 01, 2008 9:19 pm
por Ivo_Timóteo
Não sei, vê se a última versão do site é compatível

Re: VPython

MensagemEnviado: Segunda Dez 01, 2008 9:28 pm
por jap
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. :?

Re: VPython

MensagemEnviado: Quarta Fev 18, 2009 2:40 pm
por Ivo_Timóteo
Nova versão do vpython Visual 5 aqui.

Re: VPython

MensagemEnviado: Terça Maio 05, 2009 3:20 pm
por Miro
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)


Re: VPython

MensagemEnviado: Terça Maio 05, 2009 6:14 pm
por Miro
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)

Re: VPython

MensagemEnviado: Terça Maio 05, 2009 7:16 pm
por Bruno Oliveira
Se calhar podias pôr aqui o código e algum VPython expert pudesse ajudar-te no debug dele. :wink:

Re: VPython

MensagemEnviado: Terça Maio 05, 2009 7:29 pm
por Miro
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 )


Re: VPython

MensagemEnviado: Terça Maio 05, 2009 8:58 pm
por jap
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

Re: VPython

MensagemEnviado: Terça Maio 05, 2009 11:05 pm
por Tharis
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

Re: VPython

MensagemEnviado: Terça Maio 05, 2009 11:10 pm
por jap
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:

Re: VPython

MensagemEnviado: Quarta Maio 06, 2009 12:27 am
por Miro
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

Re: VPython

MensagemEnviado: Quinta Jun 11, 2009 9:19 pm
por Tharis
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... ;)