首页 > 其他分享 >半边数据结构与OpenMesh中的处理

半边数据结构与OpenMesh中的处理

时间:2022-11-04 11:47:23浏览次数:80  
标签:半边 OpenMesh mesh edge hedH MyMesh verH 数据结构

参考:https://blog.csdn.net/jialong_chen/article/details/118497495

《Springer.3D Mesh Processing and Character Animation.With Examples Using OpenGL, OpenMesh and Assimp》


1. 半边数据结构的基本假设

1)三维模型包含顶点、边、面片三部分结构,在空间中分别是0维、1维和2维的。面即为物体表面的某一多边形区域,边是相邻两个面的交线段或一个面的边缘,顶点为相邻边的交点。
2)每条边只与最多两个面相邻
3)每个面片均有自己的朝向,以区分内侧和外侧
4)两个相邻的面片朝向相同


2.数据结构

半边数据结构中包含了三种对象:顶点、半边和面片。每个对象均为固定长度,并包含了指向其他对象的指针。

image


image


2.OpenMesh中的相关函数

2.1 拓扑关联对象

// Type declarations for handles:
OpenMesh::VertexHandle verH;
OpenMesh::FaceHandle facH;
OpenMesh::HalfedgeHandle hedH, hedH_n, hedH_p;
OpenMesh::Vec3d point;

// Half-edge operations:
half-edge → vert: verH = mesh.to_vertex_handle(hedH);
half-edge→ pair→vert:verH = mesh.from_vertex_handle(hedH);
half-edge→ next:hedH_n = mesh.next_halfedge_handle(hedH);
half-edge→pair:hedH_p=mesh.opposite_halfedge_handle(hedH);
half-edge → face: facH = mesh.face_handle(hedH);
face → half-edge: hedH = mesh.halfedge_handle(facH);
vert → half-edge: hedH = mesh.halfedge_handle(verH);
vert coordinates: point = mesh.point(verH);


2.2 遍历

// vertex iterator

typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;
MyMesh mesh;
OpenMesh::VertexHandle verH;
MyMesh::VertexIter vit;
OpenMesh::Vec3d p;
int valence;
OpenMesh::IO::read_mesh(mesh, "cube.off")
for (vit = mesh.vertices_begin(); vit != mesh.vertices_end(); vit++)
{
    verH = *vit;
    p = mesh.point(verH);
    valence = mesh.valence(verH);
    cout << p[0] << " " << p[1] << " " << p[2] << " " << valence << endl;
}


// face iterator

typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;
MyMesh mesh;
OpenMesh::FaceHandle facH;
MyMesh::FaceIter fit;
int nvert;
OpenMesh::IO::read_mesh(mesh, "cube.off")
for (fit = mesh.faces_begin(); fit != mesh.faces_end(); fit++)
{
    facH = *fit;
    nvert = mesh.valence(facH);
    cout << "Number of vertices = " << nvert << endl;
}


// edge iterator

typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;
MyMesh mesh;
OpenMesh::EdgeHandle edgH;
MyMesh::EdgeIter eit;
float len, angle;
OpenMesh::IO::read_mesh(mesh, "cube.off")
for (eit = mesh.edges_begin(); eit != mesh.edges_end(); eit++)
{
    edgH = *eit;
    len = mesh.calc_edge_length(edgH);
    angle = mesh.calc_dihedral_angle(edgH);
    cout << "Edge length = " << len <<" Dihedral angle = " << angle << endl;
}


2.3 邻接查询

image


image

image







标签:半边,OpenMesh,mesh,edge,hedH,MyMesh,verH,数据结构
From: https://www.cnblogs.com/gispathfinder/p/16857201.html

相关文章

  • 数据结构(一):(顺序表)设计算法删除所有数字字符
    好家伙,写作业 什么是顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性......
  • 数据结构专题总结
    打了一天的数据结构,感觉码力上升的很快,而且也学会了许多方法,但总体来说今天大部分的题很多都是看完题解以后才会的,无论怎么想也想不出来,还是要提高一下想题的能力,不要走神,......
  • 数据结构之线性表的顺序表示和实现1
    #defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;typedefcharElemType;//一些数据......
  • 数据结构 玩转数据结构 6-4 深入理解递归终止条件
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13456 1重点关注1.1代码草图   1.2二分搜索树添加元素代码简化......
  • 【C语言数据结构】EP1顺序表
    1.什么是顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为静态表与动......
  • 【数据结构与算法】有向图的拓扑排序
    前言在现实生活中,我们经常会同一时间接到很多任务去完成,但是这些任务的完成是有先后次序的。以我们学习java学科为例,我们需要学习很多知识,但是这些知识在学习的过程中是需要......
  • 【算法与数据结构2】数据结构基础----数组、列表
    一、物理结构数组  数组是存储相同数据类型的元素的一种有序数据结构,通过下标进行存储。查找的时间复杂度为O(1),而删除和添加的时间复杂度为O(n)。其代码实现如下:pu......
  • 用java判断数据结构进出栈的顺序是否正确
    //通过flag判断出栈顺序是否正确importjava.util.*;publicclassE1{  /**   *@paramargsthecommandlinearguments   */  publicstati......
  • 033——常见数据结构
    常见数据结构数据结构概述、栈、队列数组链表二叉树、二叉查找树平衡二叉树红黑树......
  • Redis数据结构详解
    Redis5种常见数据结构:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(SortedSet),不同结构有不同的底层实现、特点和运用场景。SDS(simpledynamicstring)......