CGAL:从网格中读取顶点和三角形

4

我刚在Visual Studio C++中花了几个小时学习CGAL,试图理解网格是如何工作的。我想要的是访问顶点和三角形列表(顶点以double[3]形式,三角形以int[3]形式)。这是我正在使用的脚本:

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访问),但我无法仅通过操作c2t3 tr 变量来执行任何类似的操作。 我期望的是:

c2t3.vertices(从0到N),以及c2t3.triangles(从0到M),其值为三个整数。 我得到的是顶点列表、面片列表、单元格列表、边缘列表……而且没有办法从面片中获取顶点编号,除非在未排序的顶点列表中查找每个顶点编号。

有人能解决我的问题并指出我做错了什么吗? 另外,CGAL的API非常……原始。 查看源代码也非常困难-以至于我找不到output_surface函数的主体。

1个回答

1

好的,我在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))];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接