Página 1 de 1

Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 4:50 pm
por ruifm
Eu ainda sei muito pouco de vpython por isso estou-me a ver em dificuldades numa parte da minha simulação.
Em termos gerais, tenho um cubo, e dentro do cubo tenho 2 bolas (balll, e ball2) com uma dada posição e velocidade inicial. O movimento delas rege-se pelas leis do movimento (com g=9.8 ), estando acompanhadas de um "rasto", e um vector de velocidade. Posso ainda mudar o coeficiente de restituição, para as bolas gradualmente perderem velocidade.
Tudo o que me falta é a parte da colisão. Já consigo fazer com que ele detecte a colisão:
Código: Seleccionar Todos
while True:
    rate(100)
    d = sqrt((ball.pos.x-ball2.pos.x)**2 + (ball.pos.y-ball2.pos.y)**2 + (ball.pos.z-ball2.pos.z)**2)
    if d <= 2*r:
        ball.vel=-ball.vel
        ball2.vel=-ball2.vel

só que ele não inverte a velocidade. As bolas ficam A "tremer" juntinhas...paradas
Imagem

Ah, e eu sei que para ser realista não posso apenas inverter o vector velocidade :inocent: , mas numa primeira fase é o que eu quero que o programa faça.
Também queria saber se dá para o computador dar valores aleatorios dentro de um intervalo, para por exemplo fazer com que a bola apareça num ponto aleatorio do cubo, com uma velocidade aleatoria.
E também se dá para fazer alguma coisa do estilo: introduzir o valor de n e o programa fazer o movimento da 1ª bola para n bolas, todas com posição inicial e velocidade radom dentro de um certo intervalo. Isso seria exelente.

Re: Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 6:07 pm
por filipematos
Eu não percebi muito bem o que é que estás a simular, explica um pouco melhor. Em relação aos aleatórios tu podes utilizar funções do módulo random http://docs.python.org/library/random.h ... ght=random, Por exeplo:

bola.pos.x = randint(1,4)
bola.pos.y = randint(1,4)
output:
bola.pos = (2,3), por exemplo
E o mesmo para a velocidade. Não consigo perceber o que perguntaste a seguir ...

Re: Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 6:25 pm
por ruifm
filipematos Escreveu:Eu não percebi muito bem o que é que estás a simular, explica um pouco melhor. Em relação aos aleatórios tu podes utilizar funções do módulo random http://docs.python.org/library/random.h ... ght=random, Por exeplo:

bola.pos.x = randint(1,4)
bola.pos.y = randint(1,4)
output:
bola.pos = (2,3), por exemplo
E o mesmo para a velocidade. Não consigo perceber o que perguntaste a seguir ...

obrigado pela solução dos valores aleatorios, funcionou lindamente.
Imagina uma caixa com um gás lá dentro. Imagina que as particulas de gás são "bolas". Eu queria simular o seu movimento, as suas colisões, tanto para 2 bolas, como para n bolas, sem repetir a programação toda cada vez que quisesse adicionar mais uma bola... Depois queria que o programa me indicasse o nº de colisões, os tempos da colisão, e talvez as suas posições.

Re: Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 6:47 pm
por filipematos
Ah já percebi :)

Como as leis que determinam o movimento delas são iguais, crias uma função onde explixites o movimento delas, geres a posição inicial etc...Mas vou pensar melhor no assunto

Re: Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 8:15 pm
por Bruno Oliveira
A cada objecto pertencente à classe ball, podes associar um conjunto de métodos como os que aqui descreveste: velocidade, posição, etc, mas para repetir isso para N bolas, seria um pouco (muito) mais complexo, visto que terias de detectar múltiplas colisões, tanto entre bolas como com as paredes, o que torna a programação algo mais complexo de se fazer... :roll:

Já vi que tens bastantes ideias interessantes, vi o teu problema das bolas de snooker, mas sugiro que não sejas tão ambicioso e olhes logo para a "big picture", tipo querer simular tudo com muitos detalhes, e muito realismo... Não digo que não seja algo de útil para ser feito. Mas numa primeira fase, fazer várias simulações, mas mais simples, pode compensar em relação aos projectos mais ambiciosos, just my 2 cents :wink:

Re: Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 8:20 pm
por ruifm
Bruno Oliveira Escreveu:A cada objecto pertencente à classe ball, podes associar um conjunto de métodos como os que aqui descreveste: velocidade, posição, etc, mas para repetir isso para N bolas, seria um pouco (muito) mais complexo, visto que terias de detectar múltiplas colisões, tanto entre bolas como com as paredes, o que torna a programação algo mais complexo de se fazer... :roll:

Já vi que tens bastantes ideias interessantes, vi o teu problema das bolas de snooker, mas sugiro que não sejas tão ambicioso e olhes logo para a "big picture", tipo querer simular tudo com muitos detalhes, e muito realismo... Não digo que não seja algo de útil para ser feito. Mas numa primeira fase, fazer várias simulações, mas mais simples, pode compensar em relação aos projectos mais ambiciosos, just my 2 cents :wink:

:lol: quantas vezes já ouvi isso dos meus professores :P. Mas pela minha experiencia, mesmo que não consiga o tal "grande objectivo", acabo por aprender muito pelo caminho :D , porque sou forçado a entender as bases.

Re: Colisão de esferas

MensagemEnviado: Domingo Jan 22, 2012 9:00 pm
por Bruno Oliveira
Claro que sim!! :D

Só estares no Quark! já demonstra que tens um interesse acima da média e isso é mesmo muito bom :)
Mas, aprender aos poucos também o é! :D

Re: Colisão de esferas

MensagemEnviado: Segunda Jan 23, 2012 1:52 pm
por Tharis
Penso que o teu problema das colisões é que tu invertes a velocidade quando elas estão a sobrepor-se. Ora, se tu não fazes com que elas avancem dx = v * dt na nova direcção, elas (na próxima iteracção) vão continuar a sobrepor-se e tu vais alterar de novo o sentido da velocidade para o original, ad infinitum.

Existe um exemplo de vpython com a simulação de um gás. Vê como é que eles "handlam" as colisões.

Re: Colisão de esferas

MensagemEnviado: Segunda Jan 23, 2012 4:51 pm
por ruifm
Tharis Escreveu:Penso que o teu problema das colisões é que tu invertes a velocidade quando elas estão a sobrepor-se. Ora, se tu não fazes com que elas avancem dx = v * dt na nova direcção, elas (na próxima iteracção) vão continuar a sobrepor-se e tu vais alterar de novo o sentido da velocidade para o original, ad infinitum.

Existe um exemplo de vpython com a simulação de um gás. Vê como é que eles "handlam" as colisões.

xDDD já vi, não percebo mais de metade do codigo. Usam tantas variaveis. estas a dizer que para cada teste de colisão (if ... :) eu tenho de reescrever a lei das posições, para as bolas não encravarem?

Re: Colisão de esferas

MensagemEnviado: Segunda Jan 23, 2012 6:51 pm
por Tharis
Tu o que tens de fazer é ver qual a distância de intersecção (a variável d do teu código) e fazer com que as bolas deixem de se tocar. Tens duas maneiras de fazer. Fazes o if tal como tens e depois afastas uma bola uma distância d da outra. Ou então, o que fazes é modificar o if de (ball.x - ball2.x) para (ball.x + ball.vx*dt - ball.x - ball.vx*dt), que assim verifica se na próxima iteracção elas vão colidir e assim podes fazer já a colisão.

Já agora, convém teres várias ball.vx, ball.vy, ball.vz porque tu só podes fazer vel = -vel se as velocidades das duas bolas estiverem na mesma direcção. Caso contrário terás de resolver as equações de uma colisão elástica para X, Y e Z.

Em relação a esse ficheiro, havia um mais simples, vou ver se encontro. No que te dei, o código que interessa começa aqui:

######################
## atom-to-atom collisions
## find time of next impending atom-to-atom collision
## without regard to the walls

Re: Colisão de esferas

MensagemEnviado: Terça Jan 24, 2012 12:10 pm
por filipematos
Ele diz que se baiseia num exemplo que já vem com o Vpython, tenta analisá-lo, eu agora não tenho aqui o Vpython, mas procura lá nos exemplos :)