您的位置:首页 > 理论基础 > 数据结构算法

半边数据结构

2016-01-16 00:07 405 查看
三维网格信息分为两个部分:几何(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-edge
HE_edge* pair;   // oppositely oriented adjacent half-edge
HE_face* face;   // face the half-edge borders
HE_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 edge
edge = 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: