2010-02-19 14 views
5

Tengo una malla, con ciertos tipos de elementos (por ejemplo, triangular, tetra). Para cada elemento, conozco todos sus vértices, es decir, un elemento triangular 2D tendrá 3 vértices v1, v2 y v3 cuyos cocientes x, y, z son conocidos.algoritmo para encontrar bordes utilizando vértices (2D y 3D) en una malla

Pregunta 1

Busco a un algoritmo que devolverá todos los bordes ... en este caso:

borde (v1, v2), el borde (v1, v3), el borde (v2, v3). En función de la cantidad de vértices que tenga cada elemento, el algoritmo debería determinar de manera eficiente los bordes.

Pregunta 2

estoy usando C++, así que, ¿cuál será la forma más eficiente para almacenar la información sobre los bordes devueltos por el algoritmo anterior? Por ejemplo, todo lo que me interesa es una tupla (v1, v2) que quiero usar para algunos cálculos y luego olvidarme de ello.

Gracias

Respuesta

7

Puede utilizar la estructura de datos de media punta.


Básicamente su malla también tiene una lista de bordes, y hay una estructura de borde por par de vértices en cada dirección. Eso significa que si tiene los vértices A y B, entonces hay dos estructuras de borde almacenadas en alguna parte, una para A-> B y otra para B-> A. Cada borde tiene 3 punteros, uno llamado anterior, uno llamado siguiente y uno llamado gemelo. Seguir los punteros siguiente y anterior lo lleva por los bordes del triángulo o polígono en la malla. Llamar gemela te lleva al borde adyacente en el polígono o triángulo adyacente. (Mire las flechas en la imagen) Esta es la estructura de datos más detallada y útil que conozco. Lo he usado para suavizar mallas creando nuevos bordes y actualizando los punteros. Por cierto, cada borde también debe apuntar a un vértice para que sepa dónde está en el espacio.

5

hay realmente tres partes a su pregunta, no dos:

  • estructuras qué datos deben ser usado para representar la malla?
  • ¿Qué algoritmo debo usar para extraer bordes de las estructuras de datos de malla?
  • ¿Cómo se debe representar el conjunto resultante de bordes?

Tienes que hacer más preguntas para encontrar las respuestas adecuadas.

¿Qué estructuras de datos se deben usar para representar la malla?

¿Qué tipos de elementos necesita manejar?

Si solo necesita manejar polígonos (bucles cerrados) y simplicials (cada nodo está conectado a cada otro nodo en el elemento, como un tetraedro), entonces una lista de nodos ordenada es suficiente porque los bordes pueden ser implícitos desde el lista de nodos Si, por otro lado, necesita manejar tipos de elementos como hexahedra, prismas o poliedros generales, entonces necesita más información sobre la topología del elemento. Una simple matriz de mapeos de bordes a menudo es suficiente. Es solo una matriz [] [2] de índices en la lista de nodos del elemento que le indica cómo conectar los puntos para un tipo de elemento dado.

La estructura de medio borde descrita por Chris es una buena opción solo para 2D. En 3D, puede haber un número arbitrario de elementos unidos a cada borde, no solo a dos. Hay una extensión 3D para la representación de medio borde que creo que se llama estructura de molinete.

Si tiene que admitir tipos de elementos arbitrarios, prefiero una estructura de datos más completa para representar la topología de elementos. Una opción común es usar bordes y bordes. Hay una estructura de borde para cada par de nodos conectados, y un borde de borde para cada uso de ese borde en un elemento. Es similar al enfoque de molinete, pero un poco más explícito.

¿Qué algoritmo debo usar para extraer los bordes de los elementos?

¿Cuán importante es la velocidad o la memoria? ¿Debería el resultado incluir cada borde una vez por elemento, o solo una vez sin importar cuántos elementos lo estén usando? ¿Importa el orden de los bordes en el resultado? ¿Importa el orden de los nodos de cada borde?

Es bastante difícil encontrar un algoritmo para tipos de elementos arbitrarios que solo visiten cada borde una vez. Para asegurarse de que cada borde aparezca solo una vez, puede filtrar el resultado, o puede ser un poco hackish y mantener un bit "visitado" en cada borde para asegurarse de no pegarlo en el resultado dos veces.

¿Cómo debo representar los resultados?

¿Qué importancia tiene la forma en que usaré el resultado?

Si va a utilizar el resultado en un cálculo de cálculo intensivo, una gran variedad de coordenadas puede ser la mejor opción. No desea volver a buscar las coordenadas del nodo una y otra vez durante su cálculo. Sin embargo, si está filtrando los resultados para eliminar bordes duplicados, la comparación de coordenadas (6 dobles para un par de nodos) no es el camino a seguir. Si está filtrando, genere una lista de punteros a las estructuras de borde primero, luego filtre los duplicados, y luego genere su lista de coordenadas. También puede usar este enfoque con pares de nodos, pero luego debe filtrar contra ambos posibles pedidos de nodos por borde, duplicando la cantidad de tiempo que lleva filtrar.

Una lista de punteros de borde es también el camino a seguir si la memoria es más importante que el rendimiento. Sin embargo, en lugar de convertir su lista de bordes en una lista de coordenadas, busca coordenadas durante su cálculo. Obtener coordenadas de nodo es más lento de esa manera, pero se evita hacer una lista masiva de coordenadas: se almacena un solo puntero por borde en lugar de 6 dobles por borde.

Muchas aplicaciones de malla almacenan todas las coordenadas en una gran matriz global, con cada nodo teniendo un índice en la matriz. Si este es el caso, en lugar de convertir su lista de bordes a una matriz de coordenadas, conviértala a una lista de índices en la matriz de coordenadas global. El rendimiento no debería estar muy lejos de una matriz de coordenadas local, pero sin la memoria y la sobrecarga de la población.

Cuestiones relacionadas