我有以下問題,最好用下圖描述。從表面抽象封閉網格(CGAL?)
我有一個三維表面,所以它可以有垂直重疊,是一個非封閉的網格。我有一個我想從中減去的對象。綠色+黃色區域是原始表面,紅色線條表示一個球體(如三角網格,而不是原始圖形)。黃色區域是與需要從原始表面移除的球體相交的表面的一部分。綠色區域是減法的結果:需要的表面。
我已經在使用CGAL庫,但它仍然是新的,所以使用CGAL的解決方案將是最受歡迎的。但是,如果有人有一個沒有CGAL的解決方案,也會受到歡迎。
我能看到的最好方法是給表面稍微厚一點(保持當前表面爲底部)。然後使用Nef_polyhedron_3減去另一個對象,然後轉換爲Polyhedron_3並僅保留底面。但是這看起來有點像黑客。
編輯: 使用建議的解決方案我捱得很近,但我無法使用反轉法線的建議,使用下面的代碼夾到正確的一邊。 我也嘗試看看臉部頂點順序(順時針/逆時針)是否有任何效果,但它似乎沒有任何效果。
typedef CGAL::Simple_cartesian<double> SC;
typedef CGAL::Surface_mesh<SC::Point_3> SurfaceMesh;
typedef SurfaceMesh::Property_map<SM_fid, SC::Vector_3> SM_fnormals;
typedef SurfaceMesh::Vertex_index SM_vid;
typedef SurfaceMesh::Face_index SM_fid;
namespace PMP = CGAL::Polygon_mesh_processing;
namespace params = PMP::parameters;
void clip(SurfaceMesh P&, SurfaceMesh& Q) {
SM_fnormals fnormals = CGALobstacle->add_property_map<SM_fid, SC::Vector_3>
("f:normals", CGAL::NULL_VECTOR).first;
PMP::compute_face_normals(Q, fnormals);
PMP::clip(P, Q, false, params::all_default(), params::face_normal_map(fnormals));
}
謝謝你的回答。表面網格確實更適合我的使用範圍。 – Aedoro
然而,我卻無法將其夾到修剪的障礙物的正確一側。我編輯了我的問題,是否有明顯的錯誤可以看到? – Aedoro
刪除有關正常計算的所有內容,並在裁剪網格上調用函數['reverse_face_orientations()'](http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__orientation__grp.html#gad8a3439883e3e76651f96d15ba58b2bc)。 – sloriot