半边数据结构
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(内容来源)
如下图使用半边数据结构表示三角面片,黄点为点,蓝线为半边,半边具有方向,黄线为指针。
点:位置信息以及和此点相关的一个半边(后面再查找相邻的边的时候会介绍为啥这么处理)
半边:半边的终点,另一条与该半边方向相反的半边,该半边所在的面,以及半边顺时针(或逆时针)的顺序的半边
面:从示图可以看出,一个半边其实就可以表示一个面
应用:半边相邻的点和面(最两个面,封闭模型必定有两个面)
迭代一个面所有的边
处理一个点所有的邻接点:
HE_edge* edge = vert->edge;
优点:相对于邻接矩阵和角表,利用了更少的空间保存了更加丰富的信息,利于很多局部操作。
粗略地实现了半边数据结构,以及将Unity3d的面片存储结构转换为半边结构。https://github.com/GeorgeDon/MyPrivate/blob/master/Unity3dTool/MeshProcessing/HalfEdge.cs
保存点面信息的数据结构:
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
相关文章推荐
- 数据结构-------顺序表的实现
- 算法系列(1)-数据结构
- 飞龙的程序员书单 – 数据结构、算法
- Java数据结构之迭代器
- 20 找出第1500个丑数
- LCT(Link Cut Tree)学习小记
- 数据结构之数组和字符串的反转java实现
- Java数据结构之linkedhashset
- 数据结构优化连边
- 学习笔记------数据结构(C语言版)链表应用~一元多项式求和
- 学习数据结构之链表
- 自底向上伸展树(之字形旋转+一字形旋转)
- 动态规划初体验
- 数据结构_6:树:C++
- 数据结构和抽象数据类型
- hrbustoj 1551 C - 基础数据结构——字符串2 病毒II
- 选择排序法
- leveldb代码阅读(15)——内存中的数据结构Memtable/SkipList
- 浅谈MySQL索引背后的数据结构及算法
- 【哈工大oj】1551 - 基础数据结构——字符串2 病毒II(水)