半边数据结构

来源:互联网 发布:物流信息软件 编辑:程序博客网 时间:2024/04/28 22:39

三维网格信息分为两个部分:几何(Geometry:顶点的位置信息)信息和拓扑(Topology:点线面之间的邻接关系)信息
保存点面信息的数据结构:
1. 以面为中心(face set):储存面,每个面包含三角形的顶点的坐标值.占用大量内存
2. 共享顶点:顶点坐标数组,三角面片为顶点索引,没有邻接关系。
3. 基于面连接
4. 基于边连接
5. 邻接矩阵
6. 角表
7. 半边数据结构
半边数据结构
http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml(内容来源)
如下图使用半边数据结构表示三角面片,黄点为点,蓝线为半边,半边具有方向,黄线为指针。

点:位置信息以及和此点相关的一个半边(后面再查找相邻的边的时候会介绍为啥这么处理)

struct HE_vert{float x;float y;float z;HE_edge* edge;  // one of the half-edges emantating from the vertex  };

半边:半边的终点,另一条与该半边方向相反的半边,该半边所在的面,以及半边顺时针(或逆时针)的顺序的半边

  struct HE_edge{    HE_vert* vert;   // vertex at the end of the half-edgeHE_edge* pair;   // oppositely oriented adjacent half-edge HE_face* face;   // face the half-edge bordersHE_edge* next;   // next half-edge around the face};

面:从示图可以看出,一个半边其实就可以表示一个面

 struct HE_face{HE_edge* edge;  // one of the half-edges bordering the face};

应用:半边相邻的点和面(最两个面,封闭模型必定有两个面)

 HE_vert* vert1 = edge->vert;HE_vert* vert2 = edge->pair->vert;HE_face* face1 = edge->face;HE_face* face2 = edge->pair->face;

迭代一个面所有的边

  HE_edge* edge = face->edge; do {// do something with edgeedge = edge->next; } while (edge != face->edge);

处理一个点所有的邻接点:
HE_edge* edge = vert->edge;

 do {  // do something with edge, edge->pair or edge->face  edge = edge->pair->next; } while (edge != vert->edge);

优点:相对于邻接矩阵和角表,利用了更少的空间保存了更加丰富的信息,利于很多局部操作。

粗略地实现了半边数据结构,以及将Unity3d的面片存储结构转换为半边结构。https://github.com/GeorgeDon/MyPrivate/blob/master/Unity3dTool/MeshProcessing/HalfEdge.cs

0 0
原创粉丝点击