2016-09-15 61 views
0

我只是在Visual Studio C++中花费了几个小时来尝试理解网格如何工作。我想要的是访问顶点和三角形列表(顶点以double [3]的形式,以int [3]形式的三角形)。这里是我工作的脚本:CGAL:从网格中读取顶点和三角形

http://doc.cgal.org/latest/Surface_mesher/Surface_mesher_2mesh_a_3d_gray_image_8cpp-example.html

的一点是 - 功能CGAL::output_surface_facets_to_off (out, c2t3);输出我一个很好的文件格式.off(由MeshLab访问),但我无法通过操纵DO任何类似的只是一个c2t3tr变量。我期待的是类似于:

c2t3.vertices(从0到N)和c2t3.triangles(从0到M),值为整数的三倍。我得到的是顶点列表,方面列表,单元格列表,单元格列表,边缘列表......以及没有办法从facets中获取顶点数字,除了查找非分类顶点列表中的每个顶点数字之外的其他任何方法。

任何人都可以解决我的问题,并指出我做错了什么?此外,CGAL的API非常...原始。用源代码挖掘也非常困难 - 我无法找到output_surface函数体。

回答

0

好的,我在Complex_2_in_triangulation_3_file_writer.h文件中找到了答案。显然,CGAL库正在创建顶点的整个映射并在此映射中查找面顶点。代码部分:

using CGAL::Surface_mesher::number_of_facets_on_surface; 

typedef typename C2t3::Triangulation Tr; 
typedef typename Tr::Finite_facets_iterator Finite_facets_iterator; 
typedef typename Tr::Finite_vertices_iterator Finite_vertices_iterator; 
typedef typename Tr::Facet Facet; 
typedef typename Tr::Edge Edge; 
typedef typename Tr::Vertex_handle Vertex_handle; 

std::map<Vertex_handle, int> V; 
int inum = 0; 
for(Finite_vertices_iterator vit = tr.finite_vertices_begin(); 
vit != tr.finite_vertices_end(); 
++vit) 
{ 
    V[vit] = inum++; 
} 

for(Finite_facets_iterator fit = tr.finite_facets_begin(); 
fit != tr.finite_facets_end(); ++fit) 
{ 
const typename Tr::Cell_handle cell = fit->first; 
const int& index = fit->second; 
    if (cell->is_facet_on_surface(index)==true) 
    { 
    const int index1 = V[cell->vertex(tr.vertex_triple_index(index, 0))]; 
    const int index2 = V[cell->vertex(tr.vertex_triple_index(index, 1))]; 
    const int index3 = V[cell->vertex(tr.vertex_triple_index(index, 2))]; 
    } 
}