Para la representación de malla, ¿cuál es el beneficio de usar Half Edge sobre la estructura de datos de Winged Edge?
Entiendo ambas representaciones de malla, la única diferencia es que el medio borde usa el borde direccional y el borde alado usa el borde no direccional. Hasta ahora, no puedo pensar en cuál es la utilidad de usar el borde direccional, pero solo da más consumo de memoria.
mesh
polygon
data-structure
scene-graph
Bla ...
fuente
fuente
Respuestas:
Por lo que puedo decir, la principal ventaja del medio borde es que el recorrido puede ser un poco más simple debido a la garantía de que los bordes tienen una orientación consistente dentro de cada cara.
Considere el problema de iterar sobre todos los vértices o bordes de una cara dada, en orden antihorario. En la estructura de medio borde, esto se puede hacer comenzando con un medio borde arbitrario de esa cara y simplemente siguiendo los "siguientes" punteros hasta que regrese a donde comenzó.
Por el contrario, hacer esto en una estructura de borde con alas es un poco molesto, porque los bordes están orientados arbitrariamente; cualquier borde dado que encuentre puede apuntar hacia la derecha o hacia la izquierda en relación con la cara que está tratando de iterar, por lo que debe hacer una verificación condicional adicional en cada paso para ver si debe atravesar el borde actual hacia adelante o hacia atrás.
Otros tipos de consultas de conectividad se comportan de manera similar: la versión de medio borde le permite seguir enlaces en una secuencia consistente, mientras que la versión de borde alado requiere controles de orientación en cada paso.
Si los condicionales son realmente un problema de rendimiento para el borde alado probablemente dependerá de otros factores. Para una implementación "ingenua" con punteros en todas direcciones y datos dispersos en la memoria, esperaría que la sobrecarga de la memoria caché empañe cualquier efecto de los condicionales. Por otro lado, si tiene una estructura de datos estrechamente empaquetada con todo caliente en la memoria caché, es posible que vea algunos efectos de los condicionales debido a predicciones incorrectas de ramificaciones, etc. Es difícil de decir.
Dejando el rendimiento solo, preferiría la mitad del borde solo porque parece más fácil razonar y escribir el código correcto, incluso si resulta en una ligera sobrecarga de memoria.
Por cierto, hay un par de otras opciones de diseño con estructuras de datos de malla que a menudo parecen confundirse con esta. Un comentarista mencionó el enlace simple vs doble, pero naturalmente puede hacer un enlace simple o doble con medio borde o borde con alas. (Aunque no veo cómo funcionaría la vinculación única con borde con alas, ya que, como se mencionó anteriormente, es posible que tenga que atravesar los bordes hacia atrás o hacia adelante en el transcurso de una consulta).
Además, está la cuestión de si las estructuras de vértices y caras almacenan una lista de todos sus bordes, o solo uno (y requieren que recorra los bordes para encontrar el resto). Tener una lista de bordes de longitud variable por vértice / cara complica considerablemente la lógica si desea hacerlo de manera eficiente (es decir, no tener una asignación de montón separada por vértice / cara), pero nuevamente esto es independiente de si los bordes son de medio borde o borde alado.
fuente