2011-02-24 9 views
7

Tengo dos polígonos convexos en 3D. Ambos son planos en diferentes planos, por lo que son un par de caras.Distancia entre dos polígonos convexos en 3D

¿Cuál es la forma más sencilla de calcular la distancia más cercana entre estos dos polígonos?

Editar: La longitud de la línea más corta posible que tiene un punto final en el primer polígono y otro punto final en el segundo polígono. La distancia que estoy buscando es la longitud de esta línea lo más corta posible.

+0

¿Está buscando la distancia entre sus centroides o la distancia entre sus dos bordes más cercanos? –

+0

Dos bordes más cercanos. – Dmi

+3

Entonces, ¿no es la distancia entre los dos puntos más cercanos? ¿Cómo se define el "borde más cercano" y, dada una definición adecuada, cómo se define la distancia entre los dos bordes más cercanos? – Troubadour

Respuesta

3

Esta es una optimización limitada simple con restricciones lineales y una función de objetivo cuadrático. Hay muchos algoritmos que se pueden usar, como el descenso de gradiente.

+0

Podría explicar un poco más: ¿cuál sería la función de objetivo cuadrático? –

+0

El objetivo es "minimizar (x2 - x1) ** 2 + (y2 - y1) ** 2 + (z1 - z1) ** 2". Los puntos que dan la distancia mínima también dan la distancia mínima al cuadrado. –

+0

Ah, y las restricciones serían "x1, y1, z1 se encuentran en tal y tal plano", y "x1, y1, z1 se encuentran en esta mitad del plano" para cada borde. ¡Brillante! Mientras puedas dividir un avión por la mitad en el espacio 3D usando una sola ecuación * (que creo que puedes, pero para ser sincero, no lo he pensado) *, esto funcionará, y será más fácil y menos propenso a errores que mi método. +1! –

-3

Pasa por todos los vértices del primer objeto, luego en ese bucle, recorre todos los vértices del segundo objeto. En tu ciclo más interno, compara la distancia entre los dos vértices actuales y almacena la distancia más baja. Lo hago de esta manera todo el tiempo y siempre y cuando no tengas una malla ridículamente grande, es casi instantáneo.

+3

Es posible que los vértices no estén alineados. Por ejemplo, es posible que estos dos polígonos se toquen en ángulo recto, con uno de los vértices del segundo polígono tocando el primer polígono en el centro. – Dmi

1

No está claro lo que has intentado.

This parece probable para los segmentos per se.

Entonces, todo lo que tiene que hacer es verificar todos los pares de aristas. Me gustaría implementar eso primero antes de tratar de optimizar.

Probablemente haya una optimización al considerar el vector de un centroide al otro y solo considerando los bordes que están en algún sentido en esa dirección.

+2

Esto no funcionará por la misma razón que la respuesta de Davido. –

+0

@BlueRaja, @Dmi. OK, se perdió el caso anotado. Todavía me parece que un algoritmo relativamente tonto debería funcionar. ¿El problema es calcular las distancias entre pares primitivos (superficie, borde, vértice) o determinar qué conjuntos de pares primitivos deben computarse? ¿O estar seguro de que incluso el control de todos los pares primitivos cumple el requisito? – Keith

+0

Esto sería bueno, excepto que es posible que un polígono "toque" el otro polígono en su centro en ángulo recto. En este caso, el segundo polígono tendrá un borde o vértice que toque el plano del primer polígono mientras se encuentra a una distancia de los bordes del primer polígono. – Dmi

3

Bueno, solo hay unas pocas posibilidades; la línea más corta entre los dos polígonos podría ser:

  1. entre dos vértices
  2. entre un borde y un vértice
  3. entre dos bordes (imaginar dos polígonos en planos perpendiculares)
  4. entre un vértice y el interior del polígono
  5. O los polígonos se cruzan

Caso s 1-3 se tratan cuidando cada borde + par de vértices como un segmento de línea y enumerando el distance between all line-segment pairs.

Para el caso 4, busque el distance between each vertex and the other polygon's plane. Verifique para asegurarse de que la línea (que abarca desde el vértice hasta el punto más cercano en el plano) se encuentre dentro del otro polígono; si no es así, entonces la línea más corta que la otra polígono estará en su perímetro, que ya fue atendido en el caso 1 o 2.
(asegúrese de hacer esta comprobación para ambos polígonos)

Para el caso 5, al menos un segmento de línea debe intersecarse con el área del otro polígono; si se intersectaran en sus perímetros, ya lo habríamos capturado en los casos 1-3, y si un vértice intersectó el área, tendríamos lo atrapó en el caso 4. Así que simplemente verifique intersection of each edge with the other polygon's plane y vea si el punto de intersección está dentro del otro polígono.
(asegúrese de hacer esta comprobación para ambos polígonos)

Tome la distancia mínima que se encuentra en todo eso, y hemos terminado.

+0

Esto parece lo suficientemente directo, lo probaré. – Dmi

+0

Creo que olvidas mencionar el caso donde los 2 polígonos son paralelos. Está incluido en 1-4, así que no hay problema, pero mejor téngalo en cuenta al hacer las matemáticas para las proyecciones, etc. Porque buscar el punto de intersección sin considerar el caso paralelo a menudo causa errores desagradables. Por ejemplo, el cheque para 5 necesita mirar esto (intersección de cada borde con el plano del otro polígono). – Alink

+0

@Alink: Correcto, no lo mencioné porque está incluido en 1-4, pero es algo de lo que preocuparse. El caso edge/inside-of-other-polygon es otro: está incluido en los casos 3-4, pero aún hay que tenerlo en cuenta (al menos para realizar pruebas). –

2

Lo que la mayoría de la gente ha propuesto en este hilo es "tomar todos los puntos/bordes de un polígono y compararlos con cada punto/borde del otro". Esto probablemente funcionará bien si todo lo que haces es comparar dos polígonos bastante simples y si no estás demasiado preocupado con hacer esto rápidamente.

Sin embargo, si desea un método bastante fácil y mejor. Utilice, como lo sugiere Ben Voigt, un método de optimización cuadrático (es decir, Quadratic Programming). Básicamente, sus polígonos son su conjunto de restricciones lineales, es decir, su punto de solución debe estar hacia el lado interno de cada borde de su polígono (eso es una restricción de desigualdad). Y su función de costo para optimizar es solo la distancia euclidiana, es decir, la Q en la formulación estándar es solo la matriz de identidad. Una vez emitido como un problema así, puede usar una biblioteca que resuelva esto (hay muchos de esos por ahí), o puede estudiarlo desde un libro y rodar su propio código (es un algoritmo bastante fácil de codificar)

Si desea un método real para hacer esto, por ejemplo, si esa simple prueba de polígono a polígono es el primer paso hacia formas 3D más complejas (como un sólido hecho de polígonos). Entonces, lo más probable es que solo uses un paquete que ya lo haga. Here es un conjunto de bibliotecas de detección de colisiones, muchas de las cuales tienen una profundidad de penetración o, lo que es equivalente, una distancia mínima.

+0

Gracias, parece un tema interesante. No voy hacia formas más complejas, solo busco pares de distancia simples para caras 3D. – Dmi

Cuestiones relacionadas