En uno de mis proyectos tengo un área de juego en forma de círculo. Dentro de este círculo se mueve otro círculo pequeño. Lo que quiero hacer es evitar que el círculo pequeño se mueva fuera del más grande. A continuación puede ver que en el cuadro 2 el círculo pequeño está parcialmente afuera, necesito una forma de moverlo de regreso justo antes de que esté a punto de moverse afuera. ¿Cómo se puede hacer esto?
Además, necesito el punto de colisión a lo largo del arco del círculo grande para poder actualizar la velocidad del círculo pequeño. ¿Cómo se podría calcular este punto?
Lo que me gustaría hacer es antes de mover el círculo pequeño, predigo su próxima posición y si está afuera encuentro el tiempo de colisión entre t = 0 y t = 1 (t = 1 paso de tiempo completo). Si tengo el tiempo de colisión t, entonces solo muevo el círculo pequeño durante t en lugar de un paso de tiempo completo. Pero nuevamente, el problema es que no sé cómo detectar en ese momento que la colisión ocurre cuando se trata de dos círculos y uno está dentro del otro.
EDITAR:
Ejemplo de punto de colisión (verde) que quiero encontrar. Tal vez la imagen está un poco apagada, pero entiendes la idea.
fuente
B
, yk=0
. Ahora, si lo que desea es la resolución de colisión , no lo he cubierto en mi respuesta porque requeriría conocimiento sobre las propiedades físicas de los objetos. ¿Qué se supone que debe pasar? ¿Debería el círculo interno rebotar dentro? O rodar? ¿Barrer?V
, haga que el círculo interno avance a loV*t
largo de la circunferencia delR-r
círculo. Esto significa una rotación deV*t/(R-r)
radianes en ángulo alrededor del puntoA
. Y el vector de velocidad se puede girar de la misma manera. No es necesario saber lo normal (que siempre está orientado hacia el centro del círculo de todos modos) o actualizar la velocidad de otra manera.Digamos que el círculo grande es el círculo A y el círculo pequeño es el círculo B.
Verifique si B está dentro de A:
Si en el cuadro
n-1
B estaba dentro de A y en el cuadron
B está fuera de A y el tiempo entre cuadros no era demasiado grande (también conocido como B no se movía demasiado rápido), podemos aproximar el punto de colisión simplemente encontrando las coordenadas cartesianas de B relativo a A:Luego podemos convertir estos puntos en un ángulo:
Si quiere saber más exactamente qué
t
B está fuera de A por primera vez, puede hacer una intersección de círculo de rayos en cada cuadro y luego comparar si la distancia desde B hasta el punto de colisión es mayor, entonces la distancia B puede viajar dado que es velocidad actual. Si es así, puede calcular el tiempo exacto de colisión.fuente
Deje (Xa, Ya) la posición del círculo grande y su radio R, y (Xb, Yb) la posición del círculo más pequeño y su radio r.
Puede verificar si estos dos círculos colisionan si
Para averiguar la posición de la colisión, encuentre el momento exacto en que los círculos colisionan, utilizando una búsqueda binaria pero con un número fijo de pasos. Dependiendo de cómo esté hecho su juego, puede optimizar esta parte del código (proporcioné esta solución para que sea independiente de cómo se comporta la bola pequeña. Si tiene aceleración constante o velocidad constante, esta parte del código puede optimizarse y reemplazado con una fórmula simple).
Una vez que sepa el tiempo de colisión, calcule las posiciones de los dos círculos en el momento final y el punto de colisión final es
fuente
He implementado una demostración de una pelota que rebota en un círculo en jsfiddle usando el algoritmo descrito por Sam Hocevar :
http://jsfiddle.net/klenwell/3ZdXf/
Aquí está el javascript que identifica el punto de contacto:
fuente