Estructura de datos y algoritmo adecuados para la triangulación 3D de Delaunay

8

He elaborado un código pobre para lograr el objetivo de la triangulación 3D Delauney (puntos aleatorios en E3), pero el tiempo es enorme, y cuando cinco puntos son exactamente (o casi debido al error de redondeo) en una esfera, mi código no puede manejar esta situación correctamente.

Utilizo la estructura de datos básica que es una lista de tetraedros y una lista de puntos y una lista de relación de tetraedros con su vecindario. El algoritmo es la inserción incremental.

¿Alguien puede decirme qué tipo de estructuras de datos y algoritmo debería preferir? ¿Se puede utilizar la estructura de datos de cuatro filos en la situación? Cuando leo documentos sobre este tema, encuentro que tal vez esta estructura de datos no es adecuada para la aplicación 3D (estrictamente hablando, ¿no es adecuada para la aplicación múltiple 3D? Solo sé lo que fue múltiple ayer, por favor ayúdenme ...). ¿Es dividir-conquistar un mejor algoritmo? ¡Gracias!

mengxia
fuente
1
Bienvenido a SciComp. Su pregunta parece legítima para este foro. Tal vez, puede trabajar un poco en la claridad y el formato de su publicación, lo que mejorará las posibilidades de obtener una respuesta rápida e instructiva.
Jan
Prueba Voro ++: math.lbl.gov/voro++ Su código está disponible gratuitamente (y se puede modificar) y creo que puedes obtener la triangulación delaunay de él. (O Zeo ++ maciejharanczyk.info/Zeopp para más funciones).
Nick
@ Jan, perdón por mi pobre inglés, terminé estas publicaciones con la ayuda del diccionario, ¡gracias por tu publicación!
mengxia

Respuestas:

4

Esto se implementa en qhull, que está disponible desde scipy (python). Si no puede usar estas implementaciones directamente por alguna razón, las explicaciones de las estructuras de datos en los documentos pueden ser útiles.

http://www.qhull.org/

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Delaunay.html#scipy.spatial.Delaunay

clíper
fuente
El enlace que proporcionó solo tiene 2d ejemplos. La estructura de datos en 3D es significativamente más difícil.
Shuhao Cao
Además, el enlace qhull que proporcionó no enlaza con la página de explicación de la estructura de datos. Según el estándar stackexchange, esta es una respuesta típica de -1.
Shuhao Cao
Hola, @ShuhaoCao, ¿puedes decirme mejor para implementar la triangulación 3D delaunay?
mengxia
@clipper, gracias por tu publicación, leeré los documentos.
mengxia
La parte importante está en la sección de atributos: puntos, simplices, vecinos, ecuaciones
meawoppl
0

La estructura de datos en 3D es puramente algebraica.

Lo que necesita tener son las siguientes matrices:

  • Vertex V(# of vertices)×3xyz

  • Element to Vertex E2V(# of tetrahedra)×4V

  • Face to Vertex F2V(# of faces)×3V

  • Edge to Vertex F2V(# of edges)×2V

Los dos primeros son la estructura de datos necesaria , todos los demás arreglos se pueden generar a partir de los dos primeros mediante operaciones algebraicas. Otras matrices notables son Element to Edge, Face to Edge, Vertex to Element(los elementos que comparten un vértice), Face to Element(los elementos que comparten una cara), Edge to Face(las caras que comparten un borde), etc.

La implementación de la triangulación 3D Delaunay no suena tan trivial como dice la otra respuesta. Depende de su software de interés, puedo actualizar mi respuesta más.

Shuhao Cao
fuente
Gracias por tu publicación, la estructura de datos que he usado era casi la misma que la que dijiste anteriormente. Me resultó difícil determinar la relación adyacente de la tetraédrica. El algoritmo que utilicé fue la inserción incremental y esta vez quiero probar un mejor manera ... perdón por mi pobre inglés.
mengxia
¿A qué tipo de relación de adyacencia te refieres? ¿Desea poder encontrar todos los tetraedros que sean vecinos de un tetraedro dado? ¿O quieres encontrar qué nodos son vecinos de un nodo dado?
Daniel Shapero
@mengxia ¿Tienes esa matriz de Cara a Elemento? Si tiene eso, entonces los elementos vecinos son relativamente fáciles de encontrar.
Shuhao Cao
Hola, @ DanielShapero, gracias por tu publicación, quiero encontrar la relación del tetraedro
mengxia
Hola, @ ShuhaoCao, he terminado mi código y las matrices que preferí fueron V, E2V, E2f (elementos a enfrentar), E2N (elemento a sus neibors), pero no había una matriz de borde. El código se ejecuta de manera ineficiente y la memoria costoso. ¿Cuál es el uso de la matriz de borde? si uso esta matriz, ¿se aceleraría mi código o sería más eficiente? ¡Gracias!
mengxia