Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过删除“从非流形中提取底层2流形”;自由面;?_C++_Mesh_Cgal_Surface_3d Reconstruction - Fatal编程技术网

C++ 如何通过删除“从非流形中提取底层2流形”;自由面;?

C++ 如何通过删除“从非流形中提取底层2流形”;自由面;?,c++,mesh,cgal,surface,3d-reconstruction,C++,Mesh,Cgal,Surface,3d Reconstruction,我试图从非流形网格中提取底层的2流形(闭合曲面)。我正在使用CGAL进行网格操作。我想通过删除“自由面”来实现这一点。所谓自由,我指的是至少有一条边是边界边的面。删除自由面最终可能会创建新的“自由面”。我想继续删除它们,除非没有面有边界边。例如,如果我有一个2-球体和一个鳍状结构附着到它,我想通过删除鳍的所有面来获得2-球体 在CGAL中,我不断地在半边上迭代,如果我得到一条与_border相对的半边,我会删除半边上的面事件(更精确地说,使用make_hole(h))。当不可能删除时,我会继续迭

我试图从非流形网格中提取底层的2流形(闭合曲面)。我正在使用CGAL进行网格操作。我想通过删除“自由面”来实现这一点。所谓自由,我指的是至少有一条边是边界边的面。删除自由面最终可能会创建新的“自由面”。我想继续删除它们,除非没有面有边界边。例如,如果我有一个2-球体和一个鳍状结构附着到它,我想通过删除鳍的所有面来获得2-球体

在CGAL中,我不断地在半边上迭代,如果我得到一条与_border相对的半边,我会删除半边上的面事件(更精确地说,使用make_hole(h))。当不可能删除时,我会继续迭代

typedef CGAL::Exact_predicates_inexact_constructions_kernel I;
typedef CGAL::Polyhedron_3<I> Polyhedron;
Polyhedron mesh;

//
int in_this_iter = 0;
    do {
        in_this_iter = 0;
        for (auto h = mesh.halfedges_begin(); h != mesh.halfedges_end(); h++) {
            //cout << e->is_border() << endl;

            if (h->opposite()->is_border() && !h->is_border()) {
                mesh.make_hole(h);
                /*CGAL::Euler::remove_face(h,mesh);
                *gives trouble*/
                in_this_iter++;
            }
            else if (h->is_border() && !h->opposite()->is_border()) {
                mesh.make_hole(h->opposite());

                in_this_iter++;
            }

        }
        //mesh.normalize_border();
        count = count + in_this_iter;
        std::cout << "Face Deleted in this iter: " << in_this_iter<<endl;
    } while (in_this_iter != 0);
    std::cout << "Face Deleted: " << count<<endl;
我的算法不会删除任何自由面。但是理想的一个应该捕获四面体的4个面,删除其他面。
谢谢你的帮助!如果我没有遵守礼节,请原谅,因为这是我的第一篇帖子。

您不应该修改正在循环的结构,因为结果可能会出乎意料。相反,您可以简单地执行以下操作:

Find all faces that have an halfedge on the border
Put them in a stack
while(stack not empty)
  take the face 'f' top of the stack
  if('f' is already tagged)
    continue
  else
    tag 'f' as "to_be_removed"
    add all neighboring faces that are not already tagged to the stack
done
Remove all faces that were tagged "to_be_removed"

请注意,函数大致就是这样做的:它们将结构的所有面分组,以便一个组的面都可以通过从一个面走到另一个面来彼此接触。因此,您还可以使用这些
CGAL::PMP::connected_components
函数标记连接组件中的面,然后丢弃未形成闭合网格的连接组件。您可以在中找到灵感,其目标是将给定结构拆分为独立的连接组件。这将是代码的第一步;然后,第二步是查看网格是否闭合(
CGAL::is_closed()
)。

谢谢!但我不确定连接的_部件。我担心的是,如果有一个鳍状结构连接着一个两个球体,那么连接的_组件会将其检测为两个连接的组件还是一个?因为它是一个连接的组件。非多边形(在您的情况下,鳍和球体相交处的边)会将网格分割为不同的连接组件。
Find all faces that have an halfedge on the border
Put them in a stack
while(stack not empty)
  take the face 'f' top of the stack
  if('f' is already tagged)
    continue
  else
    tag 'f' as "to_be_removed"
    add all neighboring faces that are not already tagged to the stack
done
Remove all faces that were tagged "to_be_removed"