首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cgal曲面网格-连通性

Cgal曲面网格-连通性
EN

Stack Overflow用户
提问于 2017-08-12 16:54:50
回答 1查看 820关注 0票数 1

我有点搞不懂连接是如何工作的。我试图从网格中移除脸部,并调整连接性,删除未使用的边缘和顶点。当我使用mesh.is_valid()时,它显示了连接问题

已损坏的h1的先前生命周期的完整性。v0的halfedge不是传入的Halfedge。顶点:迭代:1 vs number_of_vertices():5卤化物:迭代:2 vs number_of_halfedges():14面:迭代:3 vs number_of_faces():3

代码:

代码语言:javascript
复制
#include <string>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
#include <boost/foreach.hpp>
#include <iostream>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Gmpq.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef Mesh::Vertex_index vertex_descriptor;
typedef Mesh::Face_index face_descriptor;
typedef Mesh::Halfedge_index halfedge_descriptor;
typedef Mesh::Edge_index edge_descriptor;

int main()
{
  Mesh mesh;
  vertex_descriptor v0 = mesh.add_vertex(K::Point_3(0,2,0));
  vertex_descriptor v1 = mesh.add_vertex(K::Point_3(2,2,0));
  vertex_descriptor v2 = mesh.add_vertex(K::Point_3(0,0,0));
  vertex_descriptor v3 = mesh.add_vertex(K::Point_3(2,0,0));
  vertex_descriptor v4 = mesh.add_vertex(K::Point_3(1,1,0));
  mesh.add_face(v3, v1, v4);
  mesh.add_face(v0, v4, v1);
  mesh.add_face(v0, v2, v4);
  mesh.add_face(v2, v3, v4);

 int counter = 0;
 std::vector <edge_descriptor> edg;
 BOOST_FOREACH(face_descriptor fd, mesh.faces()){
  if(counter == 0){
    halfedge_descriptor hed = mesh.halfedge(fd);
    halfedge_descriptor prev = mesh.prev(hed);
    halfedge_descriptor next = mesh.next(hed);

    mesh.set_vertex_halfedge_to_border_halfedge (next);
    mesh.set_vertex_halfedge_to_border_halfedge (prev);
    mesh.set_vertex_halfedge_to_border_halfedge (hed);

    if(mesh.is_border(mesh.opposite(next))){
      mesh.remove_edge(mesh.edge(next));
      std::cout << "Remove next halfedge " << next << std::endl;
    }else{
      mesh.set_face(next, mesh.null_face());
      std::cout << "sets next halfedge " << next << std::endl;
    }

    if(mesh.is_border(mesh.opposite(prev))){
      mesh.remove_edge(mesh.edge(prev));
      std::cout << "Remove prev halfedge " << prev << std::endl;
    }else{
      mesh.set_face(prev, mesh.null_face());
      std::cout << "sets prev halfedge " << prev << std::endl;
    }
    if(mesh.is_border(mesh.opposite(hed))){
      mesh.remove_edge(mesh.edge(hed));
      std::cout << "Remove Face halfedge " << hed << std::endl;
    }else{
      mesh.set_face(hed, mesh.null_face());
      std::cout << "sets Face halfedge " << hed << std::endl;
    }
    mesh.remove_face(fd);
    counter++;

    }
  }
  mesh.collect_garbage();
  mesh.is_valid();
  return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 21:13:48

使用remove_face函数的欧拉运算。它将为你在幕后“保持有效性”。欧拉操作工作在任何类型的Graph的值上,它是“MutableFaceGraph的模型”。幸运的是,您的SurfaceMesh就是这样一个模型。

如果您将循环(这是不必要的,因为您只需要一张脸)替换为以下内容,您将看到它是如何工作的:

代码语言:javascript
复制
int counter = 0;
BOOST_FOREACH(face_descriptor fd, mesh.faces()){
  counter++;
}
std::cout << counter << " faces" << std::endl;

CGAL::Euler::remove_face(mesh.halfedge(*mesh.faces().begin()), mesh );
mesh.collect_garbage();
mesh.is_valid();

counter = 0;
BOOST_FOREACH(face_descriptor fd, mesh.faces()){
  counter++;
}
std::cout << counter << " faces" << std::endl;

这不会产生验证错误,并确认在操作后网格中少了一张脸。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45652756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档