如何使用 CGAL 获取 3D Delaunay 曲面细分的边缘?
How to get the edges of a 3D Delaunay tessellation with CGAL?
从标题看问题就明白了。我尝试了很多
的变体
const DT3::Finite_edges itedges = mesh.finite_edges();
for(DT3::Finite_edges_iterator eit = itedges.begin(); eit != itedges.end(); eit++) {
const CGAL::Triple<DT3::Cell_handle, int, int> edge = *eit;
edge.first->vertex((edge.second+1) % 3)->info();
edge.first->vertex((edge.third+1) % 3)->info();
}
但 none 有效(我尝试了 % 2
、% 4
、+2
等)。
我能够得到四面体和三角形。当然,我可以从中提取边缘,但这需要删除一些重复项。
无需使用加法或模运算。解决方法更简单:
const DT3::Finite_edges itedges = mesh.finite_edges();
for(DT3::Finite_edges_iterator eit = itedges.begin(); eit != itedges.end(); eit++) {
const DT3::Edge edge = *eit;
const DT3::Vertex::Info v1_info = edge.first->vertex(edge.second)->info();
const DT3::Vertex::Info v2_info = edge.first->vertex(edge.third)->info();
}
嵌套类型 Edge
的文档是 here as well as in the section "Representation" of the user manual of 3D Triangulation Data Structure。
编辑:请注意,我选择了尊重您的编码风格,而忽略了现代 C++ 功能。使用 C++11 特性,我更喜欢这样写,使用 auto
and range-based for loop:
for(const auto edge: mesh.finite_edges()) {
const auto v1_info = edge.first->vertex(edge.second)->info();
const auto v2_info = edge.first->vertex(edge.third)->info();
}
从标题看问题就明白了。我尝试了很多
的变体 const DT3::Finite_edges itedges = mesh.finite_edges();
for(DT3::Finite_edges_iterator eit = itedges.begin(); eit != itedges.end(); eit++) {
const CGAL::Triple<DT3::Cell_handle, int, int> edge = *eit;
edge.first->vertex((edge.second+1) % 3)->info();
edge.first->vertex((edge.third+1) % 3)->info();
}
但 none 有效(我尝试了 % 2
、% 4
、+2
等)。
我能够得到四面体和三角形。当然,我可以从中提取边缘,但这需要删除一些重复项。
无需使用加法或模运算。解决方法更简单:
const DT3::Finite_edges itedges = mesh.finite_edges();
for(DT3::Finite_edges_iterator eit = itedges.begin(); eit != itedges.end(); eit++) {
const DT3::Edge edge = *eit;
const DT3::Vertex::Info v1_info = edge.first->vertex(edge.second)->info();
const DT3::Vertex::Info v2_info = edge.first->vertex(edge.third)->info();
}
嵌套类型 Edge
的文档是 here as well as in the section "Representation" of the user manual of 3D Triangulation Data Structure。
编辑:请注意,我选择了尊重您的编码风格,而忽略了现代 C++ 功能。使用 C++11 特性,我更喜欢这样写,使用 auto
and range-based for loop:
for(const auto edge: mesh.finite_edges()) {
const auto v1_info = edge.first->vertex(edge.second)->info();
const auto v2_info = edge.first->vertex(edge.third)->info();
}