Сглаживание сгенерированного Делоне с использованием CGAL

У меня проблема с низким качеством тетраэдров в моей сгенерированной сетке.

Я использую CGAL::Delaunay_Triangulation_3 для триангуляции из предварительно определенного облака точек.
Моя проблема в том, что элементы, сгенерированные CGAL, имеют немного низкое качество - наличие полосы и т. Д., Я хотел бы применить некоторую оптимизацию постобработки к сгенерированному Сетка.

Поскольку у меня есть сетка в виде «облака точек», у меня нет Mesh_Domain_3. Все примеры, которые я нашел для оптимизации сетки, использовали make_mesh_3 вместе с Mesh_Domain.

Есть ли способ применить сглаживание к сгенерированной сетке с задержкой с помощью CGAL или настроить CGAL::Delaunay_triangulation_3 для оптимизации? Однако есть одно ограничение - некоторые точки в сетках нельзя перемещать / стирать из облака, а некоторые можно.

Типы, которые я использую:

 typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
 typedef CGAL::Triangulation_vertex_base_with_info_3<int, Kernel> Vb;
 typedef CGAL::Triangulation_data_structure_3<Vb> Tds;
 typedef CGAL::Delaunay_triangulation_3<Kernel, Tds> Delaunay;

Код поколения

Delaunay triangulation(nodes.begin(), nodes.end());
//woudld be best to apply mesh smoothing here.
for(auto fit = triangulation.finite_cells_begin(); fit != triangulation.finite_cells_end(); ++fit)
{
    auto x1 = fit->vertex(0)->info();
    auto x2 = fit->vertex(1)->info();
    auto x3 = fit->vertex(2)->info();
    auto x4 = fit->vertex(3)->info();

    tetras.push_back(new Tetrahedron(nodesToTriangulate[x1],nodesToTriangulate[x2],nodesToTriangulate[x3],nodesToTriangulate[x4]));
}

person Aleksander Fular    schedule 19.09.2015    source источник
comment
Я предполагаю, что вам нужно 2 шага: 1) использовать некоторый алгоритм реконструкции для определения домена и 2) передать его сетке.   -  person Marc Glisse    schedule 20.09.2015
comment
@MarcGlisse нет возможности улучшить качество: CGAL :: Delaunay_triangulation_3 в CGAL? Нужно использовать другой подход? Вернуться к make_mesh_3?   -  person Aleksander Fular    schedule 20.09.2015
comment
Не очень понятно, что вы хотите делать. Я предполагаю, что вас интересует только некоторая часть пространства, скажем, некоторое подмножество тетраэдров в триангуляции Делоне. Это один из способов определить домен для создателя сетки. Улучшение триангуляции Делоне на самом деле ничего не значит. Для данного набора точек он определяется однозначно. И если вы можете перемещать точки, вам нужно так или иначе определить домен (код дает вам большую гибкость в том, как вы определяете домен).   -  person Marc Glisse    schedule 20.09.2015
comment
Я имел в виду улучшение качества тетраэдров, то есть сделать их более похожими на «правильный тетраэдр». Удалите некачественные элементы, такие как Щепки. Обычно для улучшения качества элементов в сетке нужно выполнять какое-то «топологическое» сглаживание элементов или что-то в этом роде. Также что-то вроде сглаживания лапласа. Это должно применяться ко всей сетке, за исключением того, что некоторые точки нельзя перемещать.   -  person Aleksander Fular    schedule 20.09.2015


Ответы (2)


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

person Gigamegs    schedule 20.09.2015

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

Это значительно улучшило качество сетки. Под Качеством я подразумеваю минимальный телесный угол тетраэдров.

person Aleksander Fular    schedule 20.10.2015