Cgal表面连通性
Cgal surface connectivity
我有点困惑连接是如何工作的。 我正在尝试从网格中删除面,并调整连接性,删除未使用的边缘和顶点。 当我使用mesh.is_valid((时,它向我显示连接问题
h1 的前半边缘的完整性已损坏。v0 的半边不是 传入的半边。 顶点: 迭代: 1 vs number_of_vertices((: 5 个半边: 迭代: 2 vs number_of_halfedges((: 14 面: 迭代: 3 与 number_of_faces((: 3
法典:
#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;
}
使用欧拉运算的remove_face
函数。它将在幕后为您"保持有效性"。欧拉运算处理任何类型的值,Graph
是"模型"MutableFaceGraph
。幸运的是,您的SurfaceMesh
就是这样的模型。
如果您将循环(这是不必要的,因为您只需要一个面(替换为以下内容,您将看到它是如何工作的:
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;
这不会产生验证错误,并确认操作后网格中少了一个面。
相关文章:
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 如何在C++中为表面制作邻接矩阵
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- Mongocxx无法使用SSL连接到mongoDB
- 使用 Outlook 2016 Microsoft Store 连接到 Outlook COM
- QObject::连接无法将信号连接到*this*对象的插槽
- 如何将 2 个 SPI 设备连接到 Arduino MkrZero
- 使用 cl 构建代码并连接到 sqlite 库
- 连接到 URL Sqlite 数据库C++
- 如何将C++系统调用连接到 freertos
- 如何将C++连接到 Matlab
- 如何通过 c++ 连接到 ODBC DSN
- CGAL - 表面网格参数化
- c++无法连接到mysql
- 如何在将Visual Studio C++控制台应用程序连接到Microsoft SQL Server时修复"
- Cgal表面连通性
- 在Windows环境下使用C/ c++检查VPN的连通性
- 连通性问题
- 在知道连通性的情况下,在boost邻接图中构建相邻顶点
- 提高了图连通性计算的性能