Estoy escribiendo una pieza de software de simulación, y necesito una manera eficiente de probar las colisiones a lo largo de una línea.¿Cuál es la mejor manera de implementar la detección de colisiones unidimensionales?
La simulación es de un tren que cruza varios interruptores en una pista. Cuando una rueda entra a N pulgadas del interruptor, el interruptor se enciende, luego se apaga cuando la rueda se va. Como todas las ruedas son del mismo tamaño y todos los interruptores tienen el mismo tamaño, puedo representarlos como una sola coordenada X a lo largo de la pista. Las distancias de conmutación y las distancias de las ruedas no cambian una con relación a la otra, una vez establecidas.
Este es un problema bastante trivial cuando se hace a través de la fuerza bruta al colocar las coordenadas X en listas y atravesarlas, pero necesito una forma de hacerlo de manera eficiente, porque tiene que ser extremadamente precisa, incluso cuando el tren está moviéndose a altas velocidades. Hay un montón de tutoriales sobre detección de colisiones en 2D, pero no estoy seguro de cuál es la mejor manera de abordar este escenario 1D único.
Aparentemente hay cierta confusión sobre cómo se ven mis datos.
Estoy simulando un solo sitio, no una región completa. Los trenes pueden ser de cualquier longitud, con diferentes tipos de automóviles, pero solo hay un tren. Los datos de mi tren tienen el formato {48,96,508,556,626,674,...}
, que indican las distancias desde la parte delantera del tren (0
) al centro del eje.
(Los datos del tren es más probable que venir a mí en forma de una lista ordenada deCar
objetos, cada uno de los cuales tiene una longitud y una lista de números enteros que representan las distancias del eje de la parte delantera de ese coche, pero todo se agrega en una sola lista, ya que todos los ejes son iguales para mí.)
Mis interruptores están todos dentro de varios cientos de pies, y con frecuencia estarán completamente cubiertos por el tren. Los interruptores pueden estar en cualquier intervalo desde cientos de pies a varias pulgadas de distancia, y está en la misma forma que el tren: {0,8,512,520,...}
, que indica las distancias desde el comienzo del sitio hasta el centro de la conmutación h.
Finalmente, sé la distancia a la que la rueda activa el interruptor, en pulgadas.
Por ejemplo, utilizando los datos de muestra anteriores, y una distancia de activación de 8 pulgadas, el primer interruptor en X = 0 se activaría cuando el tren golpee X = 40, lo que significa que el tren está 40 pulgadas en el sitio. Cuando el tren golpea X = 48, el interruptor en X = 8 también se activa. En X = 56, el primer interruptor se apaga, y en X = 64, el segundo interruptor también se apaga. Diferentes ejes encienden y apagan diferentes interruptores a medida que cruzan el sitio.
El tren suele circular a velocidades inferiores a 10 mph, pero puede llegar mucho más lejos. (En este momento nuestra simulación tiene un tope de 30 mph, pero mayor sería grande.)
Hmm ... lo obvio (para mí) la respuesta es tomar una solución 2D y adaptarla - forma más sencilla de tener siempre una dimensión constante (todo tiene una coordenada y de 0). ¿Hay alguna razón por la que esas soluciones no se puedan adaptar fácilmente? – FrustratedWithFormsDesigner
¿Cómo se ve tu conjunto de datos? ¿Simplemente tiene las ubicaciones (distancias absolutas desde un punto) o tiene algo que puede ocultar? –
He agregado algunos datos de muestra arriba. ¿A qué te refieres con "máscara en contra?" Puedo convertir los datos de una lista en otra estructura. – dlras2