2010-06-16 8 views
11

Tengo una colección de puntos que describen la superficie de una forma que debería ser aproximadamente esférica, y necesito un método para determinar si cualquier otro punto dado se encuentra dentro de esta forma. Anteriormente he estado aproximando la forma como una esfera exacta, pero esto ha demostrado ser demasiado inexacto y necesito un método más preciso. La simplicidad y la velocidad son favorables sobre la precisión completa, una buena aproximación será suficiente.¿Cómo puedo probar si un punto se encuentra dentro de una forma 3D con su superficie definida por una nube de puntos?

He encontrado técnicas para convertir una nube de puntos en una malla 3D, pero la mayoría de las cosas que he encontrado han sido muy complicadas, y estoy buscando algo tan simple como sea posible.

¿Alguna idea?

+2

¿Se ha corregido la nube? ¿Es la superficie convexa? ¿Con qué frecuencia necesita hacer las pruebas puntuales? –

+0

La nube no está fijada 'a largo plazo', pero a los fines de estos cálculos es, ya que se realizarán en 'instantáneas' del sistema. No necesita ejecutarse en tiempo real como un juego o cualquier cosa. Las pruebas se realizarán aproximadamente una vez cada 2 segundos. – Ben

Respuesta

10

¿Qué sucede si se calcula el centroide de la nube y se convierten sus coordenadas a un sistema polar cuyo origen es ese centroide?

A continuación, convierta el punto que desea examinar al mismo sistema de coordenadas.

Suponiendo que la superficie es representable mediante una triangulación Delaunay, determine los tres puntos con la menor diferencia de ángulo desde el punto que está examinando.

Proyecte el punto que está examinando en el triángulo determinado por esos tres puntos, y vea si la distancia del punto proyectado desde el centroide es mayor que la distancia del punto real.

Básicamente, estás construyendo una malla triangular del casco convexo, pero si es necesario un triángulo a la vez. Si la velocidad de ejecución realmente importa, puede almacenar en caché los triángulos resultantes sobre la marcha.

Steven Sudit también ha sugerido a useful optimization que recomiendo si sigues este camino.

+0

Esto suena como una buena idea, muchas gracias! Voy a intentarlo ahora y ver si funciona. Ya tengo listas de puntos vecinos para cada punto para la optimización de otro algoritmo, que quizás podría reciclar para acelerar esto también. – Ben

+0

Lo pensé un poco y sospecho que tres deberían ser siempre suficientes. Esto se basa en la idea de que la superficie se puede definir en términos de triángulos. Siempre que el punto esté en el lado del plano triangular que está más cerca del centroide, entonces está dentro de los límites. Por supuesto, si esta suposición es incorrecta, si puede haber huecos y salientes, entonces nada de esto vale. Por otra parte, no sé lo que hace; agregar más puntos no bastará por sí solo. –

+0

O, en la terminología correcta, supongo que es un casco convexo definible en términos de triángulos de Delaunay. –

7

Creo que el método de Bill Carey está en el camino correcto, pero quiero sugerir una posible optimización.

Dado que la forma es más o menos esférica, puede precalcular el radio de la esfera que lo une y de la esfera que lo delimita. De esta manera, si la distancia del punto está dentro de la esfera más pequeña, es un golpe definitivo y si está fuera de la esfera externa, es una falla definitiva.

Esto debería permitirle resolver los casos fáciles muy rápidamente. Para los más duros, el método de Carey se hace cargo.

+0

Definitivamente es una buena optimización. ¿Puedo agregar una referencia atribuida a esto a mi respuesta? –

+0

@ Bill, creo que acabas de hacerlo. :) –

+0

@Bill: ver el enlace "enlace" en la parte inferior izquierda de cada respuesta? Puede usar eso más marcado o html para hacer "Ver la buena optimización de Steven". tipo de enlace en su publicación ... Así es como generalmente administro estas cosas. – dmckee

0

Usa un árbol kd.

http://en.wikipedia.org/wiki/Kd-tree

El artículo proporciona una buena explicación.

Puedo aclarar cualquier otro malentendido.

+0

Un kd-tree es relevante para la parte sobre encontrar los tres puntos más cercanos, aunque parece que Ben tiene otros métodos para lograr esto. –

+0

¿Puedes construir un árbol kd en un sistema de coordenadas polares? No he trabajado con ellos lo suficiente como para saberlo. Si es así, podría ser útil. –

+0

@Bill: Hasta donde sé, los kd-trees son para coordenadas cartesianas. Si es así, siempre puedes convertir. De lo contrario, me gustaría ver cómo manejan el problema de las unidades mixtas (ángulos vs. distancia). –

Cuestiones relacionadas