Какое преимущество Half-Edge перед структурой данных Winged Edge представляет для сетки?
Я понимаю оба представления сетки, единственное отличие состоит в том, что половина края использует направленный край, а крылатый край использует ненаправленный край. До сих пор я не могу думать о том, какая польза от использования направленного фронта, но это только увеличивает потребление памяти.
mesh
polygon
data-structure
scene-graph
Bla ...
источник
источник
Ответы:
Насколько я могу судить, главное преимущество половины ребра состоит в том, что обход может быть немного проще благодаря гарантии того, что ребра имеют постоянную ориентацию внутри каждой грани.
Рассмотрим проблему итерации по всем вершинам или ребрам заданной грани в порядке против часовой стрелки. В структуре с половиной ребра это можно сделать, начав с произвольной половины ребра этой грани и просто следуя указателям «следующий», пока вы не вернетесь к тому, с чего начали.
В отличие от этого, делать это в структуре крылатого края немного раздражает, потому что края ориентированы произвольно; Любое заданное ребро, с которым вы сталкиваетесь, может указывать либо по часовой стрелке, либо против часовой стрелки относительно грани, вокруг которой вы пытаетесь выполнить итерацию, поэтому вам нужно выполнять дополнительную условную проверку на каждом шаге, чтобы увидеть, следует ли вам пересекать текущее ребро вперед или назад.
Другие виды запросов на подключение ведут себя аналогично: версия с половинным краем позволяет вам следовать ссылкам в последовательной последовательности, в то время как версия с крылым краем требует проверки ориентации на каждом этапе.
То, являются ли условия на самом деле проблемой производительности для крылатого фронта, вероятно, будет зависеть от других факторов. Для «наивной» реализации с указателями в разные стороны и данными, разбросанными по памяти, я бы ожидал, что издержки, связанные с отсутствием кэша, затушевывают любой эффект условных выражений. С другой стороны, если у вас плотно упакованная структура данных со всем горячим в кэше, вы можете увидеть некоторые эффекты от условий из-за неправильных предсказаний ветвлений и т. Д. Трудно сказать.
Оставляя производительность в покое, я бы предпочел половинное преимущество только потому, что кажется более легким рассуждать и писать правильный код, даже если это приводит к небольшим перегрузкам памяти.
Между прочим, есть несколько других вариантов дизайна с сеточными структурами данных, которые часто путают с этим. Комментатор упомянул одинарное или двойное связывание, но, естественно, вы можете сделать одно или двойное связывание либо с половинным, либо с крылатым краем. (Хотя я не понимаю, как будет работать одиночное связывание с крылатым краем, поскольку, как упоминалось выше, вам, возможно, придется проходить края назад или вперед в ходе запроса.)
Кроме того, возникает вопрос о том, хранят ли структуры вершин и граней список всех своих ребер или только один (и требуют, чтобы вы пересекали ребра, чтобы найти остальные). Наличие списка ребер переменной длины для каждой вершины / грани значительно усложняет логику, если вы хотите сделать это эффективно (т. Е. Не иметь отдельного выделения кучи для каждой вершины / грани), но опять-таки это не зависит от того, являются ли ребра половинными ребрами. или крылатый край.
источник