Entrada

Entrada

by Felipe Augusto Araujo Dias -
Number of replies: 4
Bem, já que podemos colocar aqui dados de entrada, queria colocar esses com velocidades mais altas, pois é geralmente com velocidades acima de 1 m/s que costuma ocorrer problemas:

paredes
v 0.25 0.25 0.75
v 0.75 0.25 0.75
h 0.1 0.25 0.75
h 0.9 0.25 0.75
h 0.05 0.7 1.0
v 0.7 0.0 0.05
particulas
0.5 0.5 57.0 12.0
0.1 0.1 17.0 20.0
0.9 0.9 23.0 50.0
0.9 0.9 50.0 100.0
In reply to Felipe Augusto Araujo Dias

Re: Entrada

by Paulo José da Silva e Silva -
Instante: 200.0000
Posicao: x=0.6000, y = 0.7000
Posicao: x=0.0000, y = 0.4000
Posicao: x=0.2000, y = 0.8000
Posicao: x=0.8000, y = 0.5000


Bom exemplo. Tive que acertar o meu programa para fazê-lo rodar até o fim. Nele descobri o seguinte (divido com vocês para ajudá-los).

Se você calculou o tempo até bater na parede (digamos deltaT) e depois, usando esse tempo você calculou o passo (deltaX, deltaY) para passar para o método move que vai mover a bolinha até a parede onde ocorreu o impacto cuidado. Um particula.move(deltaX, deltaY) pode te levar para o outro lado da parede (e aí bau-bau, é claro que o EP está errado, por exemplo a bolinha pode sair da sala e nunca mais voltar). No meu programa ocorria algo como obter um valor do tipo -1.0e-17 quando queria ter chegado sobre a parede com valor 0.0. Nesse caso a minha partícula tinha saído da sala e depois ela não volta mais.

Como os objetos do graphics.py não tem uma função que permita alterar diretamente a sua posição (só tem o move que altera indiretamente através do passo (deltaX, deltaY)), não há como resolver isso sem alguma ginástica. Achei duas soluções:

1) Sempre diminuir um pouco o tempo calculado. Isso é, se deltaT é o tempo para o próximo choque, dar um passo de deltaT - eps2 (com eps2 < eps, pelo menos de umas duas casas). Assim o programa faz as contas para parar antes do choque, e com a bolinha antes de atingir a parede).

2) (Minha predileta). Se um choque for identificado, colocar a partícula exatamente sobre a parede. Apagando a partícula original e criando uma nova com a coordenada que a coloca sobre a parede com o valor exato. Foi essa a versão que implementei.

Paulo

In reply to Paulo José da Silva e Silva

Re: Entrada

by Paulo José da Silva e Silva -
Ops...

Na mensagem anterior as coordenadas x e y estão trocadas (foi um bug que coloquei no meu programa para exemplificar o uso de um depurador, quem esteve na aula deve lembrar). Vou editar a mensagem para corrigir o erro. Ou seja, os valores no site estarão corretos, mas o que vocês receberam por email não.

Paulo
In reply to Paulo José da Silva e Silva

Re: Entrada

by Felipe Augusto Araujo Dias -
Obrigado, professor.

Tinha implementado como o senhor falou (colocar as bolinhas "exatamente" sobre a parede), mas não sabia se isso ia me retornar uma saída correta, por isso pedi para que os dados fossem testados.

A saída foi a mesma, então acho que está tudo certo agora.
In reply to Felipe Augusto Araujo Dias

Re: Entrada

by Felipe Augusto Araujo Dias -

Só mais uma coisa, professor.

Eu preciso necessarimanete apagar e redesenhar a partícula na posição correta, já que a diferença entre a posição que estava antes e a posição quando for redesenhada é bem pequena, sendo imperceptível na tela?

Por exemplo, se a coordenada x da bolinha for 0.999999999994008, eu sei que ela bateu na parede da direita e altero sua coordenada x para 1.0. Mas a diferença entre 1.0 e aquele número grandão é minúscula, se eu for redesenhar a partícula em 1.0 ao invés de 0.999999999994008, não haverá qualquer diferença visual.