Pour la représentation du maillage, quel est l'avantage d'utiliser la structure de données Half Edge sur Winged Edge?
Je comprends les deux représentations de maillage, la seule différence est que le demi-bord utilise le bord directionnel et le bord ailé utilise le bord non directionnel. Jusqu'à présent, je ne peux pas penser à l'utilité de l'utilisation du bord directionnel, mais cela ne donne que plus de consommation de mémoire.
mesh
polygon
data-structure
scene-graph
Bla ...
la source
la source
Réponses:
Pour autant que je sache, le principal avantage du demi-bord est que la traversée peut être un peu plus simple en raison de la garantie que les bords ont une orientation cohérente à l'intérieur de chaque face.
Considérez le problème de l'itération sur tous les sommets ou bords d'une face donnée, dans le sens antihoraire. Dans la structure en demi-bord, cela peut être fait en commençant par un demi-bord arbitraire de cette face et en suivant simplement les pointeurs "suivants" jusqu'à ce que vous reveniez où vous avez commencé.
En revanche, cela dans une structure à bords ailés est un peu ennuyeux, car les bords sont orientés arbitrairement; tout bord donné que vous rencontrez peut pointer dans le sens horaire ou antihoraire par rapport au visage que vous essayez d'itérer, vous devez donc effectuer une vérification conditionnelle supplémentaire à chaque étape pour voir si vous devez traverser le bord actuel vers l'avant ou vers l'arrière.
D'autres types de requêtes de connectivité se comportent de manière similaire: la version à demi-bord vous permet de suivre les liens dans une séquence cohérente tandis que la version à bord ailé nécessite des vérifications d'orientation à chaque étape.
La question de savoir si les conditions sont réellement un problème de performance pour le bord ailé dépendra probablement d'autres facteurs. Pour une implémentation "naïve" avec des pointeurs dans tous les sens et des données dispersées dans la mémoire, je m'attendrais à ce que le cache manque de surcharge pour submerger tout effet des conditions. D'un autre côté, si vous avez une structure de données très compacte avec tout ce qui est chaud dans le cache, vous pourriez voir certains effets des conditions en raison de prédictions de branchement incorrectes, etc. C'est difficile à dire.
Laissant la performance seule, je préférerais la demi-pointe simplement parce qu'il semble plus facile de raisonner et d'écrire du code correct, même si cela entraîne une légère surcharge de mémoire.
Soit dit en passant, il existe quelques autres choix de conception avec des structures de données maillées qui semblent souvent se confondre avec celle-ci. Un commentateur a mentionné la liaison simple vs double, mais naturellement, vous pouvez faire une liaison simple ou double avec un demi-bord ou un bord ailé. (Bien que je ne vois pas comment une liaison unique avec un bord ailé fonctionnerait même, car comme mentionné ci-dessus, vous devrez peut-être parcourir les bords vers l'arrière ou vers l'avant au cours d'une requête.)
De plus, il y a la question de savoir si les structures de sommet et de face stockent une liste de toutes leurs arêtes, ou une seule (et vous obligent à parcourir les arêtes pour trouver le reste). Avoir une liste d'arêtes de longueur variable par sommet / face complique considérablement la logique si vous voulez le faire efficacement (c.-à-d. Ne pas avoir une allocation de tas distincte par sommet / face), mais là encore, cela est indépendant du fait que les arêtes soient à demi-arête ou bord ailé.
la source