c# - Cómo predecir encuentros entre una nave y la esfera de influencia de un cuerpo en 2D
algorithm math (2)
Oyente desde hace mucho tiempo pero primera vez que llamo. Estoy haciendo un pequeño juego de pasatiempos en XNA, se trata de barcos de transporte en el espacio, análogos a los barcos de contenedores en el mar. Necesito poder predecir el encuentro entre una nave y una esfera de influencia gravitacional planeta / lunas en un entorno 2D restringido. Las posiciones en el momento de la Nave y el planeta / luna, Cuerpo para abreviar, se determinan a partir de elementos orbitales keplerianos . La Nave y el Cuerpo orbitan el mismo centro de atracción.
El enfoque que he ideado hasta ahora es el primero en realizar algunos controles preliminares de la apoapsis y la periapsis (los puntos más lejanos y más cercanos del centro de atracción) para ver si es posible un encuentro. Entre controles como este y si la órbita de la Nave está abierta (hiperbólica, aproximo el caso de la parábola a una hipérbola), puede descartar muchos escenarios donde no podría haber un encuentro.
Si estas verificaciones determinan que un encuentro es posible, yo determino la distancia mínima y máxima desde el centro de atracción que el Barco es elegible para un encuentro. Luego obtengo los puntos de intersección de la órbita de las naves con los dos círculos definidos por ese mínimo y máximo. Esto resulta en cero, dos o cuatro puntos en la órbita del Barco, definiendo cero, uno o dos períodos en los que podría encontrarse con la esfera del Cuerpo. En este punto, si hay cero intersecciones, es posible que la totalidad de la órbita de la nave se encuentre en la zona de encuentro, este es probablemente un caso extremo poco común pero debería ser cubierto.
Puedo obtener los tiempos en que el Barco pasará esos puntos en su órbita, dando una o dos ventanas de tiempo para verificar el encuentro, pero desde allí mi mejor solución es buscar el intervalo de tiempo dividiéndolo en pasos, calculando la posición del Cuerpo en Esos tiempos, y luego la prueba de encuentro.
El problema con este enfoque es saber el tamaño para realizar los pasos para encontrar el encuentro de manera eficiente. Obtener la posición del cuerpo en el momento es algo costoso, así que prefiero hacerlo lo menos posible, pero los pasos demasiado grandes podrían perder el encuentro.
¿Existen propiedades de formas cónicas confocales que podrían ayudar a reducir el espacio de búsqueda? O hay otras formas de predecir el encuentro / colisión entre lo que efectivamente es un punto que se mueve a lo largo de un camino cónico y un círculo que se mueve a lo largo de una elipse que comparte un punto focal.
Puedes intentar construir la función que describe la distancia (cuadrada de) entre el planeta y la nave como una función del tiempo, usando la expresión de distancia de Pitágoras habitual. Está buscando ceros de esta función, por lo que se puede aplicar el método de Newton o similar para encontrarlos.
Esto debería funcionar bien siempre que el movimiento del planeta sea mucho más lento que el de la nave; entonces la función será relativamente suave y el método de Newton no tendrá problemas para converger. Sin embargo, si el movimiento del planeta es mucho más rápido que el de la nave, entonces esta función de distancia rebotará hacia arriba y hacia abajo, como un "resorte" superpuesto en una curva similar a una parábola, y posiblemente se intersecará con el eje x varias veces. El método de Newton puede tener problemas con tales funciones, donde la derivada cambia de dirección rápidamente.
Es de esperar que algunos términos se cancelen cuando construyas la función de distancia, o la expresión puede ser simplificada o aproximada, pero si no, puede ser suficiente buscar ceros en las direcciones vertical y horizontal. (De hecho, podría elegir distancias a lo largo de cualquier eje, por ejemplo, el eje mayor de la órbita del planeta). Los ceros en cualquiera de estas funciones son necesarios pero no son condiciones suficientes para la colisión, y pueden ser más simples de calcular. Si tiene una lista de ceros en la dirección x ordenados por tiempo y lo mismo para los ceros en la dirección y, puede encontrar colisiones verdaderas calculando su intersección con una combinación de listas (a la mergesort).
Use la detección de colisión radial (círculos), con un círculo que representa la influencia de la gravedad del planeta (será más grande que el planeta mismo), otro círculo para cada nave, y haga que el punto central de cada círculo se mueva uno hacia el otro en una línea recta. tan ligeramente como la distancia disminuye.
Aplique la cantidad de tracción que cada círculo tiene a la velocidad de movimiento de cada barco. El movimiento se puede hacer con solo trig, cos () para x, sin () para y, sin necesidad de matemáticas más complejas. Cuando la distancia entre dos objetos es menor que la suma de sus radios, se ha producido una colisión.
Pero al hacer esta forma de colisión solo en los "círculos de gravedad", por así decirlo, cuando chocan, puede aumentar la velocidad de la nave en una pequeña cantidad cada iteración para simular el tirón de la gravedad.