从 CGAL 3D 网格生成中获取顶点坐标的 -6.27744e+66:mesh_implicit_sphere 示例
Getting -6.27744e+66 for vertex coordinate from CGAL 3D Mesh Generation: mesh_implicit_sphere example
我正在从标题中提到的示例代码生成的网格中提取小平面数据:
vector<CGAL::Mesh_complex_3_in_triangulation_3<Tr>::Facet_iterator> Facets;
for (CGAL::Mesh_complex_3_in_triangulation_3<Tr>::Facet_iterator it = c3t3.facets_begin(); it!=c3t3.facets_end() ; it++)
{
Facets.push_back(it);
}
现在尝试显示一些顶点坐标,如下所示:
CGAL::Mesh_complex_3_in_triangulation_3<Tr>::Facet_iterator fct = Facets[0];
cout << "Vertex 0 has coordinate: \n";
cout << fct->first->vertex(0)->point().x() << ", "
<< fct->first->vertex(0)->point().y() << ", "
<< fct->first->vertex(0)->point().z() << endl<<endl;
cout<< "Vertex 1 has coordinate: \n";
cout << fct->first->vertex(1)->point().x() << ", "
<< fct->first->vertex(1)->point().y() << ", "
<< fct->first->vertex(1)->point().z() << endl<<endl;
cout << "Vertex 2 has coordinate: \n";
cout << fct->first->vertex(2)->point().x() << ", "
<< fct->first->vertex(2)->point().y() << ", "
<< fct->first->vertex(2)->point().z() << endl<<endl;
cout << "Vertex 3 has coordinate: \n";
cout << fct->first->vertex(3)->point().x() << ", "
<< fct->first->vertex(3)->point().y() << ", "
<< fct->first->vertex(3)->point().z() << endl<<endl<<endl;
(假设我正确理解数据结构)fct指向一个std::pair包含(c,i)这意味着:单元格中由fct表示的方面c 和索引为 i 的顶点都属于单元格 c,并且它们满足: fct 与顶点 i 相对。所以我的代码应该显示单元格 fct->first 的顶点坐标(它是一个四面体,因此有四个顶点)。
这是我的问题
以上代码的输出为:
顶点 0 有坐标:
0.282254, -0.638274, -0.716464
顶点 1 有坐标:
0.408885, -0.669831, -0.621398
顶点 2 有坐标:
0.24175, -0.741988, -0.625771
顶点3有坐标:
-6.27744e+66, -6.27744e+66, -6.27744e+66
Vertex3的坐标明显不对,我搜索了一下这个问题发现-6.27744e+66一般是因为喜欢访问未初始化的向量。但即使是这样,我应该怎么做才能得到正确的值呢?或者,谁能告诉我到底哪里出了问题?
编辑:以上来自 sloriot 的 post 是正确的:这是复合体外部的一个单元格,它附加到无限顶点。
顶点3很可能是无限顶点。在 CGAL 中,三角剖分使用连接到凸包上所有点的额外无限顶点表示。您可以使用函数 is_infinite()
来检查。
正如 Alex 所指出的,您应该使用 Cell_in_complex_iterator
来访问网格域的所有有限单元。
我正在从标题中提到的示例代码生成的网格中提取小平面数据:
vector<CGAL::Mesh_complex_3_in_triangulation_3<Tr>::Facet_iterator> Facets;
for (CGAL::Mesh_complex_3_in_triangulation_3<Tr>::Facet_iterator it = c3t3.facets_begin(); it!=c3t3.facets_end() ; it++)
{
Facets.push_back(it);
}
现在尝试显示一些顶点坐标,如下所示:
CGAL::Mesh_complex_3_in_triangulation_3<Tr>::Facet_iterator fct = Facets[0];
cout << "Vertex 0 has coordinate: \n";
cout << fct->first->vertex(0)->point().x() << ", "
<< fct->first->vertex(0)->point().y() << ", "
<< fct->first->vertex(0)->point().z() << endl<<endl;
cout<< "Vertex 1 has coordinate: \n";
cout << fct->first->vertex(1)->point().x() << ", "
<< fct->first->vertex(1)->point().y() << ", "
<< fct->first->vertex(1)->point().z() << endl<<endl;
cout << "Vertex 2 has coordinate: \n";
cout << fct->first->vertex(2)->point().x() << ", "
<< fct->first->vertex(2)->point().y() << ", "
<< fct->first->vertex(2)->point().z() << endl<<endl;
cout << "Vertex 3 has coordinate: \n";
cout << fct->first->vertex(3)->point().x() << ", "
<< fct->first->vertex(3)->point().y() << ", "
<< fct->first->vertex(3)->point().z() << endl<<endl<<endl;
(假设我正确理解数据结构)fct指向一个std::pair包含(c,i)这意味着:单元格中由fct表示的方面c 和索引为 i 的顶点都属于单元格 c,并且它们满足: fct 与顶点 i 相对。所以我的代码应该显示单元格 fct->first 的顶点坐标(它是一个四面体,因此有四个顶点)。
这是我的问题
以上代码的输出为:
顶点 0 有坐标: 0.282254, -0.638274, -0.716464
顶点 1 有坐标: 0.408885, -0.669831, -0.621398
顶点 2 有坐标: 0.24175, -0.741988, -0.625771
顶点3有坐标: -6.27744e+66, -6.27744e+66, -6.27744e+66
Vertex3的坐标明显不对,我搜索了一下这个问题发现-6.27744e+66一般是因为喜欢访问未初始化的向量。但即使是这样,我应该怎么做才能得到正确的值呢?或者,谁能告诉我到底哪里出了问题?
编辑:以上来自 sloriot 的 post 是正确的:这是复合体外部的一个单元格,它附加到无限顶点。
顶点3很可能是无限顶点。在 CGAL 中,三角剖分使用连接到凸包上所有点的额外无限顶点表示。您可以使用函数 is_infinite()
来检查。
正如 Alex 所指出的,您应该使用 Cell_in_complex_iterator
来访问网格域的所有有限单元。