Em um dos meus projetos, tenho uma área de jogo na forma de um círculo. Dentro deste círculo, outro pequeno círculo está se movendo. O que eu quero fazer é impedir que o pequeno círculo se mova para fora do maior. Abaixo, você pode ver que, no quadro 2, o pequeno círculo está parcialmente fora, preciso de uma maneira de recolocá-lo antes que ele esteja prestes a sair. Como isso pode ser feito?
Além disso, preciso do ponto de colisão ao longo do arco do grande círculo para poder atualizar a velocidade do pequeno círculo. Como alguém calcularia esse ponto?
O que eu gostaria de fazer é antes de mover o pequeno círculo, prevejo sua próxima posição e, se estiver fora, encontro o tempo de colisão entre t = 0 et = 1 (t = 1 etapa em tempo integral). Se eu tiver o tempo de colisão t, basta mover o pequeno círculo durante t em vez de uma etapa em tempo integral. Mas, novamente, o problema é que não sei como detectar naquele momento a colisão quando se trata de dois círculos e um dentro do outro.
EDITAR:
Exemplo de ponto de colisão (verde) que desejo encontrar. Talvez a imagem esteja um pouco errada, mas você entendeu.
fonte
B
, ek=0
. Agora, se você deseja uma resolução de colisão , não cobri isso na minha resposta, pois exigiria conhecimento sobre as propriedades físicas dos objetos. O que deveria acontecer? O círculo interno deve saltar para dentro? Ou rolar? Varrer?V
, faça o círculo interno avançarV*t
ao longo da circunferência doR-r
círculo. Isso significa uma rotação deV*t/(R-r)
radianos angulares em torno do pontoA
. E o vetor de velocidade pode ser girado da mesma maneira. Não há necessidade de conhecer o normal (que está sempre orientado para o centro do círculo) ou de atualizar a velocidade de qualquer outra maneira.Digamos que o grande círculo seja o círculo A e o pequeno círculo seja o círculo B.
Verifique se B está dentro de A:
Se no quadro
n-1
B estava dentro de A e no quadron
B está fora de A e o tempo entre os quadros não era muito grande (também conhecido como B não estava se movendo muito rápido), podemos aproximar o ponto de colisão encontrando as coordenadas cartesianas de B relativas para A:Podemos então converter esses pontos em um ângulo:
Se você quiser saber mais exatamente o que
t
B está fora de A pela primeira vez, poderá fazer uma interseção de círculo de raios a cada quadro e comparar se a distância de B ao ponto de colisão é maior, então a distância que B pode percorrer, velocidade atual. Nesse caso, você pode calcular o tempo exato da colisão.fonte
Deixe (Xa, Ya) a posição do grande círculo e seu raio R, e (Xb, Yb) a posição do círculo menor e seu raio r.
Você pode verificar se esses dois círculos colidem se
Para descobrir a posição da colisão, encontre o momento exato em que os círculos colidem, usando uma pesquisa binária, mas com um número fixo de etapas. Dependendo de como o seu jogo é feito, você pode otimizar essa parte do código (eu forneci esta solução para ser independente de como a pequena bola se comporta. Se ela tem aceleração constante ou velocidade constante, essa parte do código pode ser otimizada e substituído por uma fórmula simples).
Depois de conhecer o tempo de colisão, calcule as posições dos dois círculos no momento final e o ponto de colisão final será
fonte
Implementei uma demonstração de uma bola quicando em círculo no jsfiddle usando o algoritmo descrito por Sam Hocevar :
http://jsfiddle.net/klenwell/3ZdXf/
Aqui está o javascript que identifica o ponto de contato:
fonte