Algoritmo de detección de colisión usando Line Detection

Para un sandbox de física 2D en el que estoy trabajando, necesito una forma de detectar detectar una colisión usando líneas. Este sandbox usa una class llamada Particle , que tiene ax y ay (almacenado como una estructura llamada vector2 ) y una velocidad, que también tiene ax e y. Previamente, para encontrar una colisión, traté de detectar si las coorderadas + la velocidad eran las coorderadas + velocidad de la otra partícula, y luego dividí las velocidades por la velocidad más alta, luego verifiqué todas las velocidades de forma incremental, para evitar el efecto túnel. Sin embargo, no pude hacer que esto funcionara, y sospechaba que sería lento cuando las velocidades eran muy grandes. Ahora quiero un algorithm que detecte si dos líneas (un punto son las coorderadas, el otro es coorderadas + velocidad) se intersecan, luego coloque las partículas un espacio antes de la colisión. Dado que este algorithm es para un entorno limitado de física, tiene que detectar cualquier colisión, incluyendo, por ejemplo, si las dos líneas colisionarán pero son paralelas. Por razones de simplicidad, no publicaré el código de class de Particle , así que siéntete libre de crear la function usando las variables que desees (siempre que se expliquen por sí mismas)

Ahora quiero un algorithm que detecta si dos líneas (un punto son las coorderadas, el otro es coorderadas + velocidad) se cruzan

Si te entendí correctamente, quieres detectar la colisión entre líneas. Dos líneas se cruzan si tienen un par coincidente de coorderadas x / y.

Por ejemplo, si tenemos la line a (y = 0.5x + 1) y la línea b (y = 0.1x + 3) . obtenemos las siguientes cuatro ecuaciones:

  1. y = 0.5x + 1
  2. y = 0.1x + 3
  3. x = (y-1) / 0.5
  4. x = (y - 3) / 0.1

De eso puedes verificar si estas ecuaciones son verdaderas:

y = 0.5x + 1 = 0.1x + 3

x = (y-1) / 0.5 = (y - 3) / 0.1

Si lo son, tienes una intersección, si no (es decir, 4 = 7), no lo haces.

Esto verificará si dos líneas se cruzan, sin embargo, lo que probablemente desee es verificar si dos segmentos de línea se cruzan. Por lo que yo sé, no puedes verificar eso en la forma y = mx + b . Sin embargo, puede verificarlo a través de la forma paramétrica:

position = initialPoint + direction * scalar donde initialPoint y direction son vectores (en su caso, vector2).

Puedes hacer con esta ecuación como lo hice en el ejemplo anterior. Si no sabes cómo hacerlo, se muestra en la parte superior de SIGHT & LIGHT: cómo crear visibilidad 2D / efectos de sombras para tu juego

Después de get los puntos, puede verificar si el valor escalar de la intersección tiene sentido. Usaría la magnitud de tu vector de velocidad.

Finalmente, si solo desea restablecer el estado en caso de colisión, simplemente puede savelo antes de la mudanza, y si colisiona después de la mudanza, recupérelo.