Problema na minha simulação!

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

Problema na minha simulação!

Mensagempor filipematos em Sábado Dez 10, 2011 4:48 pm

Olá comunidade,
Eu estou aqui com um problema. Fiz uma simulação em Vpython, a simular um lançamento horizontal em que uma bola supostamente desce um escorrega(não está visível) e depois voa no ar(exemplo clássico). Recebe como Input a altura do chão à mesa, e a altura da mesa ao cimo do escorrega de onde a bola é lançada. Estava tudo bem até que quis por a simulação mais formal para poder apresentar na minha turma. Para tal inseri uma janela de controlos, onde posso clicar para repetir, repetir apenas numa dimensão... Até aqui estava tudo bem. Quando inseri sliders e um botão para que possa alterar os valores o programa deixou de funcionar. Aqui está o código:
Código: Seleccionar Todos
from visual.controls import *
import math



# dados e calculos
def valores(a,b):
    global h0,h1,g,vx,t_max,dx,t,vx,ox,oy
    h0=a
    h1=b
    g = 10
    vx = math.sqrt(2*g*h0)
    t_max = math.sqrt((2*h1)/g)
    dx = vx * t_max
    t = 0.00
    vf = math.sqrt(vx**2+(-g*t_max)**2)


    # Janela principal

    screen = display(center=(dx/2+9,h1/2), width = 900, height = 900)
    screen.range = (dx+10,h0,1)
    screen.autoscale = 0

    # objectos

    bola = sphere(pos=(-0.5,h1+0.5), color = color.red, radius = 0.5, make_trail = True)
    ox = bola.pos.x
    oy = bola.pos.y
    mesa = box(pos=(-0.5,h1/2), color=color.green, widht = 0.4, height = h1)
    chao = box(pos =(dx/2+9,0),color = color.blue, length = dx + 20 ,height = 1)
    label(pos=(5,-2-0.05*h1),text = '5')
    label(pos=(10,-2-0.05*h1),text = '10')
    label(pos=(15,-2-0.05*h1),text = '15')
    label(pos=(20,-2-0.05*h1),text = '20')
    label(pos=(25,-2-0.05*h1),text = '25')
    label(pos=(30,-2-0.05*h1),text = '30')
    label(pos=(35,-2-0.05*h1),text = '35')
    label(pos=(40,-2-0.05*h1),text = '40')
    label(pos=(45,-2-0.05*h1),text = '45')
    label(pos=(50,-2-0.05*h1),text = '50')
    label(pos=(70,-2-0.05*h1),text = '70')
    label(pos=(90,-2-0.05*h1),text = '90')
    label(pos=(110,-2-0.05*h1),text = '110')
    label(pos=(130,-2-0.05*h1),text = '130')
    label(pos=(150,-2-0.05*h1),text = '150')
    label(pos=(170,-2-0.05*h1),text = '170')



def xy(t,t_max,vx,g):
   
    while t < t_max:
        rate(100000)
        t += 0.00001
        bola.pos.x = vx * t
        bola.pos.y = 0.5*-g*(t**2)+h1+0.5
    k = 0
    while k < 2:
        rate(10)
        k+=1

    #Resultados
    print "O alcance da bola foi:" , bola.pos.x
    print "O tempo de queda foi:", t_max
    print "A velocidade final da bola foi:", vf
    bola.pos.x = ox
    bola.pos.y = oy

def x(t,t_max,vx,g):
    bola.pos.x = ox
    bola.pos.y = oy

   
    while t < t_max:
        rate(100000)
        t += 0.00001
        bola.pos.x = vx * t

    k = 0
    while k < 2:
        rate(10)
        k+=1

    #Resultados
    print "O alcance da bola foi:" , bola.pos.x
    print "O tempo de queda foi:", t_max
    print "A velocidade final da bola foi:", vf
    bola.pos.x = ox

def y(t,t_max,vx,g):
    bola.pos.x = ox+2
    bola.pos.y = oy

   
    while t < t_max:
        rate(100000)
        t += 0.00001
        bola.pos.y = 0.5*-g*(t**2)+h1

    k = 0
    while k < 2:
        rate(10)
        k+=1
                 
    #Resultados
    print "O alcance da bola foi:" , bola.pos.x
    print "O tempo de queda foi:", t_max
    print "A velocidade final da bola foi:", g*t_max
    bola.pos.y = oy
    bola.pos.x = ox

#Janela de controlos
c = controls()
start = button(pos=(0,0), width=60,height=60, text='Comecar', action=lambda: xy(0.00,t_max,vx,g))
butao_x = button(pos=(-60,-60),width=30,height=30, text='x', action=lambda: x(0.00,t_max,vx,g))
butao_y = button(pos=(60,-60),width=30,height=30, text='y', action=lambda: y(0.00,t_max,vx,g))
h0_s = slider(pos=(-60,40), width=5, height=5, text="Altura da mesa ao ponto de lançamento")
h1_s = slider(pos=(-60,80), width=5, height=5, text="Altura da mesa ao chao")
passar = button(pos=(-50,0), width=30,height=15, text='Inico', action=lambda: valores(h0_s.value,h1_s.value))


O que alterei quando deixou de funcionar, foi por o código que actualmente está na função valores, nessa função. Quando estava livre(em nenhuma função) estava a funcionar bem, mas como queria fazer a implementação para poder mudar os valores das alturas, a única solução que arranjei foi inserir nessa função de modo a que quando clicasse no botão iniciar, ele abria uma nova janela com as alturas alteradas , e depois supostamente quando clicasse em começar, a bola deveria mover-se, o que não acontece. Se alguém me conseguir ajudar, agradecia :)
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor filipematos em Sábado Dez 10, 2011 5:05 pm

Já consegui resolver o problema. Bastava definir bola como global na função valores e já está tudo a funcionar. Deixo aqui o exemplo para quem quiser!!!
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor Bruno Oliveira em Sábado Dez 10, 2011 11:18 pm

Parece muito bom!! :hands:

E já melhoraste muito o teu código!! :D
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: Problema na minha simulação!

Mensagempor filipematos em Domingo Dez 11, 2011 12:03 pm

Obrigado :)
Eu queria compilar o programa para .exe para poder correr no pc da escola(visto não ter python), eu já tentei usando o py2exe, mas ele cria-me um executável que quando o executo abre o cmd durante 2 segundos e depois fecha-se(Tal e qual como carregar no programa se tiver com extensão py) é possível por isto a funcionar?
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor Tharis em Domingo Dez 11, 2011 3:15 pm

É estranho que o .exe corra de forma diferente do .py.

Abre a consola e corre o programa através dela. Caso não o saibas fazer, é assim: abres a consola (cmd), fazes o comando "cd PASTA_DO_EXE" e "NOME_DO_EXE". Coloca aqui o output.

Já agora, coloca aqui o ficheiro .py que usaste para compilar com o py2exe.
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Problema na minha simulação!

Mensagempor filipematos em Segunda Dez 12, 2011 1:48 pm

Ele não corre diferente do .py, o problema é esse. É que só executando o .py através do idle é que o consigo correr...
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor Tharis em Sexta Dez 16, 2011 11:57 am

filipematos Escreveu:Ele não corre diferente do .py, o problema é esse. É que só executando o .py através do idle é que o consigo correr...


Se percebi bem o .exe não abre a janela do VPython, que é suposto abrir, não é? Se assim for, não ele corre diferente do .py. E correr o .py através do IDLE não devia ser a única maneira. Já experimentaste correr o .py através da consola (ou mudar de SO :mrgreen: )?
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Problema na minha simulação!

Mensagempor filipematos em Segunda Dez 19, 2011 4:07 pm

O que eu quis dizer é que se fizer duplo cilque no ficheiro .py ele apenas abre a consola e a fecha em fracções de segundo que é o mesmo que o executável faz! Vou experimentar agora em Linux
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor Tharis em Terça Dez 20, 2011 10:52 am

Ah, nem o .py funciona. Aí já posso ajudar. Uma das coisas que tive de adicionar ao teu código para o poder correr foi o encoding. Tenta adicionar esta linha no início do teu código (deverá ser a primeira linha do código):

Código: Seleccionar Todos
# -*- coding: utf-8 -*-


Vê lá se assim já funciona. Se não, faz o que te disse, vai à consola e corre através da consola. O duplo-clique basicamente mete o programa a correr da consola e assim que o programa acaba fecha-a. Se tu correres o programa por uma consola aberta por ti, dá para ver qual o erro, sem que ela se feche!
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Problema na minha simulação!

Mensagempor filipematos em Terça Dez 20, 2011 12:09 pm

Funcionou perfeitamente :) Obrigado. O que é que esse código modificou?
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor filipematos em Terça Dez 20, 2011 1:01 pm

Já tentei compilar, executei no cmd para ver o erro, e o erro é devido ao módulo visual do vpython :s
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor Tharis em Quarta Dez 21, 2011 1:23 pm

filipematos Escreveu:Funcionou perfeitamente :) Obrigado. O que é que esse código modificou?


O que aquilo faz é dizer ao interpretador que o ficheiro de código fonte está em UTF-8 (basicamente permite-te ter acentos e outros caracteres latinos). Se não o fizesses, o interpretador não conseguiria ler bem o código fonte, que era o que estava a acontecer.

filipematos Escreveu:Já tentei compilar, executei no cmd para ver o erro, e o erro é devido ao módulo visual do vpython :s


Isso já é no py2exe. Põe aqui o erro que dá. Só com um "devido ao módulo visual do vpython" não consigo fazer nada.
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Problema na minha simulação!

Mensagempor filipematos em Quinta Dez 22, 2011 2:34 pm

O erro é este(é tudo o que diz na consola):


Traceback (most recent call last):
File "sn.py", line 3, in <module>
File "visual\__init__.pyc", line 1, in <module>
File "visual\visual_all.pyc", line 1, in <module>
File "vis\__init__.pyc", line 13, in <module>
File "vis\ui.pyc", line 3, in <module>
File "vis\materials.pyc", line 159, in <module>
File "vis\materials.pyc", line 129, in loadTGA
IOError: [Errno 2] No such file or directory: 'visual\\turbulence3.tga'
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Problema na minha simulação!

Mensagempor Tharis em Quinta Dez 22, 2011 3:43 pm

Podes seguir esta maneira, que é mais simples, ou então, vais a C:\Python[Versao Instalada]\lib\site-packages\(vis ou visual, depende da versão)\ e copias o ficheiro turbulence3.tga para a pasta dist\visual que é criada pelo py2exe. ;)
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Problema na minha simulação!

Mensagempor filipematos em Sexta Dez 23, 2011 1:26 pm

Já o tinha tentado... Quando extraio o library ele deixa de reconhecer o módulo. O erro passa a ser no module named visual.controls. Se o descomprimir, inserir o ficheiro turbelence e voltar a comprimir ele dá o mesmo erro de quando o descomprimo

Erro :

Traceback (most recent call last):
File "C:\Python27\lib\site-packages\py2exe\boot_common.py", line 92, in <module>
import linecache
ImportError: No module named linecache
Traceback (most recent call last):
File "sn.py", line 3, in <module>
ImportError: No module named visual.controls
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 2 visitantes