我只是花了几个小时在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
或{{1}来做任何类似的事情。变量。我期待的是:
c2t3.vertices(从0到N)和c2t3.triangles(从0到M),其值为整数的三倍。我得到的是顶点列表,构面列表,单元格列表,边缘列表......除了在非排序顶点列表中查找每个顶点数字之外,无法以任何其他方式从构面获取顶点数字。
任何人都可以解决我的问题并指出我做错了吗?此外,CGAL的API非常......原始。使用源代码挖掘也非常硬 - 我找不到output_surface函数体。
答案 0 :(得分: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))];
}
}