У меня проблема с низким качеством тетраэдров в сгенерированной меше.
я использую CGAL::Delaunay_Triangulation_3
для триангуляции из заранее определенного облака точек.
Моя проблема в том, что элементы, сгенерированные CGAL, немного низкого качества — наличие осколков и т. Д. Я хотел бы применить некоторую оптимизацию постобработки для сгенерированной сетки.
Поскольку у меня есть Mesh в форме «облака точек», у меня нет 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]));
}
Вы можете вычислить центр тяжести для каждого тетраэдона и провести ретриангуляцию с помощью взвешенной триангуляции.
Я решил использовать ограниченное сглаживание по Лапласу + дисперсию топологического сглаживания, чтобы улучшить качество тетраэдра в сетке. Я должен был реализовать это сглаживание самостоятельно, поскольку они недоступны в CGAL.
Это значительно улучшило качество сетки. Под качеством я подразумеваю минимальный телесный угол тетраэдров.