2011-03-22 8 views
10

me encontré con esta pregunta de la entrevistaestructura de datos y el algoritmo para detectar colisiones de mover objetos de forma irregular

Muchos objetos de forma irregular se mueven en direcciones aleatorias. Proporcione una estructura de datos y un algoritmo para detectar colisiones. Recuerde que la cantidad de objetos es de millones.

Supongo que cada objeto tendrá una coordenada xey. Otras suposiciones son bienvenidas. También se debería usar cierto tipo de árbol, supongo, pero no tengo ni idea del algoritmo.

¿Alguna sugerencia?

+3

yo esperaría que estos objetos tienen más de una coordenada X e Y, no sólo uno como usted menciona/esperar. ¿Publicaste la pregunta textualmente? Supongo que no, ya que faltan algunos detalles, IMO. Por ejemplo, ¿qué es una _ "forma irregular" _ exactamente? –

Respuesta

3

me gustaría tener un vistazo a la Plane Sweep Algorithm o la Bently-Ottmann Algorithm. Utiliza el barrido de plano para determinar en el tiempo O(n log(n)) (y el espacio O(n)) la intersección de las líneas en un plano euclidiano.

+0

"forma irregular" vs. intersección de línea? Podría ser una solución en 2D, pero puede hacerlo mejor que O (n log n). En 3D, no funciona. – knivil

+0

@knivil - El algoritmo se puede extender para trabajar en el espacio 3D, es por eso que se llama barrido plano y no barrido de línea. Los algoritmos fueron para referencia. –

+0

Pero sigue siendo O (n log n). – knivil

-2

Supongo que debe haber un bucle que toma referencia de 1 objeto encontrar coordenadas y luego comprueba con el resto de todos los demás objetos para ver si hay una colisión. No estoy seguro de cuán buena es mi solución para millones de objetos. Psuedo-código:

For each irregular shaped object1  

int left1, left2; 
int right1, right2; 
int top1, top2; 
int bottom1, bottom2; 
bool bRet = 1; // No collision 

left1 = object1->x; 
right1 = object1->x + object1->width; 
top1 = object1->y; 
bottom1 = object1->y + object1->height; 

For each irregular shaped object2 
{ 
    left2 = object2->x; 
    right2 = object2->x + object2->width; 
    top2 = object2->y; 
    bottom2 = object2->y + object2->height; 

    if (bottom1 < top2) bRet =0; 
    if (top1 > bottom2) bRet = 0; 

    if (right1 < left2) bRet = 0; 
    if (left1 > right2) bRet = 0; 
} 

return bRet; 
+0

No sé qué tan "irregulares" son estas formas. Suena más como rectángulos. – gablin

+0

el anterior algo de NatashaD está completamente equivocado, no lo sigas. Debe dar un rango de espacio a los objetos y verificar si el rango de obj1 está en obj2 sonó y viceversa, entonces ocurrió una colisión en caso contrario. –

1

Existen muchas soluciones a este problema. Primero: use cuadros o círculos delimitadores (bolas en 3D). Si los cuadros delimitadores no se cruzan, entonces no se necesitan más pruebas. Segundo: subdivida tu espacio. No tiene que probar cada objeto contra todos los demás objetos (es decir, O (n^2)). Puede tener una complejidad promedio de O (n) con quadtrees.

Cuestiones relacionadas