Segmento de segmento de segmento de segmento de detección de colisión

Ya he implementado la detección de colisión en mi juego siguiendo este tutorial , que funciona muy bien, pero me di count de que hay un defecto importante.
El jugador y los enemigos son círculos, mientras que los obstáculos pueden ser segmentos o polígonos o círculos.
Ahora, digamos que tengo el segment A desde el point (100, 100) hasta el point (300, 100) y el segment B desde el point (100, 200) hasta el point (300, 100) , lo que significa que forman un ángulo agudo, y el jugador tiene el centro en el point (100, 125) , con un radio de 25.
Si el jugador comienza a moverse hacia la derecha, eventualmente colisionará contra el segmento B. Mi método checkCollisions() devolverá un vector, pero si aplico ese vector en el jugador, se moverá hacia arriba y hacia la izquierda, y se superpondrá con el segmento A.
Si llamo checkCollisions() por segunda vez, el jugador será empujado hacia abajo y colisionará nuevamente con el segmento B, por lo que las invocaciones recursivas no son una solución. ¿Algunas ideas?

Aquí hay una image para explicar: Aquí hay una foto para explicar La dirección del vector g-> n está a lo largo de la bisectriz de los dos pequeños vectores, pero ¿cómo puedo encontrar la longitud?

Creo que la resolución iterativa puede ayudar.

El concepto aquí es que resolverá varias veces cada fotogtwig, pero solo aplicará una parte del vector devuelto por checkCollisions() en cada fotogtwig. El primer bash de resolución puede comenzar aplicando el vector de respuesta de colisión completa, porque funcionará bien en casos simples. Si aún hay intersecciones después de eso, no desea simplemente regresar a la position original. Para evitar eso, las iteraciones posteriores aplican solo una fracción del vector de respuesta devuelto por checkCollisions() . Para ayudar a que la solución converja, la fracción se networkinguce para cada iteración.

No sé nada de ActionScript, pero aquí hay un pseudocódigo realmente terrible:

 collisionResponseFactor = 1 for (i = 0; i < 20; ++i) responseVector = checkCollisions (player) player.position = player.position + responseVector * collisionResponseFactor collisionResponseFactor *= 0.8 

Puede simplemente sumr múltiples vectores de respuesta de colisión. Los elementos contradictorios se cancelarán mutuamente y el vector resultante se orientará como se esperaba. Recuerde normalizar y reescalar en la magnitud correcta después de sumr.

EDITAR (después de la image añadida OP): para manejar ese problema en particular, debe encontrar la position única en la que el círculo toca el segmento de línea AB y CD .

Necesitarás resolver A + (BA) * t1 + r * n1 = C + (DC) * t2 + r * n2 donde las letras mayúsculas son los puntos en tu diagtwig, r es el radio del círculo, n1 es la colisión de longitud de unidad normal del cuadrilátero, n2 es la misma para el triángulo, t1 es un valor real en [0,1] que representa "qué tan lejos" el vector AB del punto de contacto deseado y t2 es el mismo para el vector CD . Solo t1 y t2 son desconocidos y dado que todo, excepto las t ' r son vectores, tenemos 2 ecuaciones (una para x, una para y) en las incógnitas. Una vez que resuelves para cualquier t , puedes conectar todo en el lado correspondiente de la ecuación anterior, que te dará la position del círculo deseada.