2017-08-02 93 views
0

我有以下問題,最好用下圖描述。從表面抽象封閉網格(CGAL?)

我有一個三維表面,所以它可以有垂直重疊,是一個非封閉的網格。我有一個我想從中減去的對象。綠色+黃色區域是原始表面,紅色線條表示一個球體(如三角網格,而不是原始圖形)。黃色區域是與需要從原始表面移除的球體相交的表面的一部分。綠色區域是減法的結果:需要的表面。

我已經在使用CGAL庫,但它仍然是新的,所以使用CGAL的解決方案將是最受歡迎的。但是,如果有人有一個沒有CGAL的解決方案,也會受到歡迎。

我能看到的最好方法是給表面稍微厚一點(保持當前表面爲底部)。然後使用Nef_polyhedron_3減去另一個對象,然後轉換爲Polyhedron_3並僅保留底面。但是這看起來有點像黑客。

Intersection


編輯: 使用建議的解決方案我捱得很近,但我無法使用反轉法線的建議,使用下面的代碼夾到正確的一邊。 我也嘗試看看臉部頂點順序(順時針/逆時針)是否有任何效果,但它似乎沒有任何效果。

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)); 
} 

回答

1

從CGAL 4.10開始,在Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/clip.h中有一個未公開的功能。功能簽名是:

/// requires face_index_map, vertex_index_map for np_tm 
/// requires face_index_map for np_c 
/// if edge_is_constrained_map is not provided in np_tm a default one is 
/// provided using boost::unordered_set<edge_descriptor> 
template <class TriangleMesh, 
      class NamedParameters1, 
      class NamedParameters2> 
bool 
clip(  TriangleMesh& tm, 
/*const*/ TriangleMesh& clipper, 
      bool close, 
    const NamedParameters1& np_tm, 
    const NamedParameters2& np_c) 

第二個參數是您的球體和第一個曲面。第三個表示您是否希望關閉輸出表面(在您的情況下如此錯誤)。請注意,該功能是剪裁,所以如果你想要球體的外部部分,你需要扭轉球體的方向(內部法線)。

有一個使用示例here

我推薦使用Surface_mesh而不是Polyhedron_3

請注意,該函數沒有記錄,並且標題可能會在即將發佈的版本中消失(如果它確實表示它已正式記錄)。

+0

謝謝你的回答。表面網格確實更適合我的使用範圍。 – Aedoro

+0

然而,我卻無法將其夾到修剪的障礙物的正確一側。我編輯了我的問題,是否有明顯的錯誤可以看到? – Aedoro

+0

刪除有關正常計算的所有內容,並在裁剪網格上調用函數['reverse_face_orientations()'](http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__orientation__grp.html#gad8a3439883e3e76651f96d15ba58b2bc)。 – sloriot