問題:如何使用OpenMesh完成三角形單元的分割,同時保護原始的拓撲信息。
解決方法一:
採用OpenMesh中封裝的接口,mesh.split()可直接完成面片的分割
解決方法二:
將原始的三角形刪除,然後再添加分割後的三角形。
特別注意!!!
使用方法一,之前的三角形並沒有被刪除,只是在此基礎上添加了新的三角形。若只有一個三角形,將其分割成兩個
三角形,最終會得到三個三角形,並且拓撲關係維護有問題,這留作進一步探討!!!建立大家使用第二種方法。
方法一主要代碼
關於OpenMesh常用的數據定義,請看:OpenMesh番外篇:頭文件
//方法一
//例子,將兩個相鄰的三角形分割,分割後得到四個三角形
MyMesh mesh;
//首先添加4個頂點
VertexHandle v[4];
v[0] = mesh.add_vertex(Point(0,0,0));
v[1] = mesh.add_vertex(Point(100,0,0));
v[2] = mesh.add_vertex(Point(100,100,0));
v[3] = mesh.add_vertex(Point(0,100,0));
//添加面片
FaceHandle face[2];
vector<VertexHandle> vechandles;
vechandles.push_back(v[0]);
vechandles.push_back(v[1]);
vechandles.push_back(v[2]);
face[0] = mesh.add_face(vechandles);
vechandles.clear();
vechandles.push_back(v[0]);
vechandles.push_back(v[2]);
vechandles.push_back(v[3]);
face[1] = mesh.add_face(vechandles);
vechandles.clear();
//寫出測試
OpenMesh::IO::write_mesh(mesh,"before.off");
//取共用邊的中點作爲分割點
VertexHandle vertex_split = mesh.add_vertex(Point(50,50,0));
//對兩個邊進行分割,split分割函數默認將多邊長分割成三角形的形式
mesh.split(face[0],vertex_split);
mesh.split(face[1],vertex_split);
//寫出測試
OpenMesh::IO::write_mesh(mesh,"after.off");
return;
方法二主要代碼:
將原始的三角形刪除,然後添加分割後的三角形,分割後的三角形並不難求得
//方法二
MyMesh mesh;
mesh.request_face_status();
mesh.request_edge_status();
mesh.request_vertex_status();
//首先添加4個頂點
VertexHandle v[4];
v[0] = mesh.add_vertex(Point(0,0,0));
v[1] = mesh.add_vertex(Point(100,0,0));
v[2] = mesh.add_vertex(Point(100,100,0));
v[3] = mesh.add_vertex(Point(0,100,0));
//添加面片
FaceHandle face[2];
vector<VertexHandle> vechandles;
vechandles.push_back(v[0]);
vechandles.push_back(v[1]);
vechandles.push_back(v[2]);
face[0] = mesh.add_face(vechandles);
vechandles.clear();
vechandles.push_back(v[0]);
vechandles.push_back(v[2]);
vechandles.push_back(v[3]);
face[1] = mesh.add_face(vechandles);
vechandles.clear();
//寫出測試
OpenMesh::IO::write_mesh(mesh,"before.off");
//取共用邊的中點作爲分割點
VertexHandle vertex_split = mesh.add_vertex(Point(50,50,0));
//刪除第一個三角形,然後添加兩個三角形
mesh.delete_face(face[0]);
vechandles.push_back(v[0]);
vechandles.push_back(v[1]);
vechandles.push_back(vertex_split);
mesh.add_face(vechandles);
vechandles.clear();
vechandles.push_back(v[2]);
vechandles.push_back(v[1]);
vechandles.push_back(vertex_split);
mesh.add_face(vechandles);
vechandles.clear();
mesh.delete_face(face[1]);
vechandles.push_back(v[0]);
vechandles.push_back(v[3]);
vechandles.push_back(vertex_split);
mesh.add_face(vechandles);
vechandles.clear();
vechandles.push_back(v[2]);
vechandles.push_back(v[3]);
vechandles.push_back(vertex_split);
mesh.add_face(vechandles);
vechandles.clear();
//寫出測試
OpenMesh::IO::write_mesh(mesh,"after.off");
示例
before
after
譯者說明:因科研需要,避免重複造輪子,近來借用OpenMesh,因其結構封裝嚴謹,靈活可靠,且十分方便,故抽出時間對官網的說明做點翻譯。英文水平不高,如翻譯有誤請多多包涵,也請您多多指正。
英文原文地址:http://www.openmesh.org/Documentation/OpenMesh-Doc-Latest/index.html