Меняется ли порядок элементов сетки от прогона к прогону для ограниченной триангуляции в cgal?

Я перебираю finie_vertieces, finite_edges и finite_faces после генерации ограниченной делауни триангуляции с оптимизацией Loyd. Я использую 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
53
1

Ответы 1

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

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

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

Еще один _info пример.

Другие вопросы по теме