Página 1 de 1

Problema na minha simulação!

MensagemEnviado: Sábado Dez 10, 2011 4:48 pm
por filipematos
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 :)

Re: Problema na minha simulação!

MensagemEnviado: Sábado Dez 10, 2011 5:05 pm
por filipematos
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!!!

Re: Problema na minha simulação!

MensagemEnviado: Sábado Dez 10, 2011 11:18 pm
por Bruno Oliveira
Parece muito bom!! :hands:

E já melhoraste muito o teu código!! :D

Re: Problema na minha simulação!

MensagemEnviado: Domingo Dez 11, 2011 12:03 pm
por filipematos
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?

Re: Problema na minha simulação!

MensagemEnviado: Domingo Dez 11, 2011 3:15 pm
por Tharis
É 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.

Re: Problema na minha simulação!

MensagemEnviado: Segunda Dez 12, 2011 1:48 pm
por filipematos
Ele não corre diferente do .py, o problema é esse. É que só executando o .py através do idle é que o consigo correr...

Re: Problema na minha simulação!

MensagemEnviado: Sexta Dez 16, 2011 11:57 am
por Tharis
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: )?

Re: Problema na minha simulação!

MensagemEnviado: Segunda Dez 19, 2011 4:07 pm
por filipematos
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

Re: Problema na minha simulação!

MensagemEnviado: Terça Dez 20, 2011 10:52 am
por Tharis
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!

Re: Problema na minha simulação!

MensagemEnviado: Terça Dez 20, 2011 12:09 pm
por filipematos
Funcionou perfeitamente :) Obrigado. O que é que esse código modificou?

Re: Problema na minha simulação!

MensagemEnviado: Terça Dez 20, 2011 1:01 pm
por filipematos
Já tentei compilar, executei no cmd para ver o erro, e o erro é devido ao módulo visual do vpython :s

Re: Problema na minha simulação!

MensagemEnviado: Quarta Dez 21, 2011 1:23 pm
por Tharis
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.

Re: Problema na minha simulação!

MensagemEnviado: Quinta Dez 22, 2011 2:34 pm
por filipematos
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'

Re: Problema na minha simulação!

MensagemEnviado: Quinta Dez 22, 2011 3:43 pm
por Tharis
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. ;)

Re: Problema na minha simulação!

MensagemEnviado: Sexta Dez 23, 2011 1:26 pm
por filipematos
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