Меняется ли порядок элементов сетки от прогона к прогону для ограниченной триангуляции в CGAL? - PullRequest
0 голосов
/ 13 сентября 2018

Я итерирую по finie_vertieces, finite_edges и finite_faces после генерации ограниченной триангуляции Делоне с оптимизацией Лойда.Я на VS2012 с использованием CGAL 4.12 в режиме выпуска.Я вижу, что для данного случая список finite_verices повторяется (как и список вершин в finite_faces), однако, порядок ребер в finite_edges, кажется, меняется от прогона к прогону

for(auto eit = cdtp.finite_edges_begin(); eit != cdtp.finite_edges_end(); ++eit)
{

    const auto isConstrainedEdge  = cdtp.is_constrained(*eit);
    auto & cFace = *(eit->first);
    auto cwVert = cFace.vertex(cFace.cw(eit->second));
    auto ccwVert = cFace.vertex(cFace.ccw(eit->second));

Я использую приведенный фрагмент кода для извлечения списка вершин, и список вершин с заданным ребром изменяется от прогона к прогону.Любая помощь приветствуется, поскольку я ищу последовательное поведение в коде.Моя триангуляция включает в себя множество линейных ограничений в двумерной области.

1 Ответ

0 голосов
/ 14 сентября 2018

Мне сказали это, вероятно, надежное поведение, но нет гарантии заказа.В документации IIRC сказано, что порядок обхода не гарантирован.Я думаю, что лучше предположить, что трансверсал итераторов не является детерминированным и может измениться.

Вы можете использовать любое из _info расширений для встраивания информации в грань, ребро и т. Д. (Хешвозможно?), который вы могли бы затем проверить, чтобы обнаружить изменение.

В моем случае я хотел проходить через меш параллельно, а OpenMP не поддерживал итераторы.Таким образом, я держу вектор Face_handles в памяти, который я могу легко проиндексировать.В сочетании с данными _info это можно использовать для построения вектора ребер, граней и т. Д. С гарантированным порядком, используя уникальную информацию в поле ->info().

Другой пример _info .

...