2015-09-19 59 views
0

我在生成的網格中存在低質量四面體的問題。使用CGAL平滑生成Delaunay

我正在使用CGAL::Delaunay_Triangulation_3從預先定義的點雲進行三角測量。
我的問題是由CGAL生成的元素有點低質量 - 存在條子等,我想對生成的網格應用一些後處理優化。

因爲我有'點雲'形式的Mesh,我沒有Mesh_Domain_3。我在網格優化中找到的所有示例都使用了make_mesh_3和Mesh_Domain。

有沒有什麼辦法可以對CGAL生成的delaunay網格應用平滑,或者自定義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])); 
} 
+0

我的猜測是你需要2個步驟:1)使用一些重建算法來定義域,2)將其饋送到網格器。 –

+0

@MarcGlisse沒有辦法提高CGAL的質量:CGAL :: Delaunay_triangulation_3?人們必須採取不同的方法?回退到make_mesh_3? –

+0

這是不是很清楚你想要做什麼。我假設你只對空間的某些部分感興趣,比如Delaunay三角剖分中的一些四面體子集。這是爲網格器定義一個域的一種方法。 「改善Delaunay三角測量」並不意味着什麼。對於給定的點集,它是唯一定義的。如果您可以移動點,則需要以某種方式定義域(該代碼爲您定義域的方式提供了很大的靈活性)。 –

回答

0

我決定使用約束拉普拉斯平滑+拓撲平滑的方差來提高網格中四面體的質量。我必須自己實現這些平滑,因爲它們在CGAL中不可用。

這大大提高了網格的質量。按質量我是指四面體的最小立體角。

0

你可以計算重力每個tetrahedon重複三角和一個加權三角中心。