声明:除了第一张图来自互联网,其他的图片都是使用VISIO和ISKITCH制作
一 先简单介绍一些HalfEdge数据结构
半边结构由三个对象组成:顶点、半边、面,每一个对象都有指针指向其他对象,大致指向情况如下:
1、顶点对象:包含一个指针指向离开它的半边vertex->leaving.
2、半边对象:包含一个指向它离开的顶点的指针halfedge->orgin。
一个它所对应的面(左手定则)halfedge->face.
一个指向它的twins的指针,halfedge->twins
一个指向它的下一条半边的指针,halfedge->next.
3、面对象:包含一个指向与它对应的半边的指针,face->halfedge.
代码展现形式如下:(C#实现)
HalfEdgeMesh 数据结构
List<Edge> edges = new List<Edge>();
List<Face> faces = new List<Face>();
List<Halfedge> halfedges = new List<Halfedge>();
List<Vertex> vertices = new List<Vertex>();
Face 数据结构
public TFaceTraits Traits;
private Halfedge halfedge;
private int index;
Halfedge 数据结构
public THalfedgeTraits Traits;
private Edge edge;
private Face face;
private Halfedge nextHalfedge, oppositeHalfedge, previousHalfedge;
private Vertex vertex;
private int index;
Edge 数据结构
public TEdgeTraits Traits;
private Halfedge halfedge;
private int index;
Vertex 数据结构
public TVertexTraits Traits;
private Halfedge halfedge;
private HalfEdgeMesh<TEdgeTraits, TFaceTraits, THalfedgeTraits, TVertexTraits> mesh;
private int index;
二 基于以上的数据结构我们来实现加面算法
加面算法顾名思义就是在原有模型的基础上添加相应的面
在程序中体现的是接收用户输入的一系列顶点通过相应的算法在模型中构建三角形添加到原有模型中即完成加面功能。如图:
那么核心问题是我们怎么根据数据结果构建新的三角形面呢?下面我们一一解释:
Input: Vertex[]faceVertices
Step1: Check
Make sure input is (mostly) acceptable before making any changes to the mesh
遍历顶点,检查顶点是否已经包含在原有模型中,顶点所构建的半边是否已经包含在模型中等信息
Step2: Create (Step2和Step3是最关键合心的步骤)
遍历数组,根据Step1确定出来的信息,如果构建成的是新変,则创建
Edge,halfedges,Opposite Halfedges
Step3:Connect
1.Connect opposite halfedge to inner halfedge
连接半边和邻边
2.Connect edge to halfedges
将边指向半边
3.Connect halfedges to edge
将半边指向边
4.Connect halfedges to vertices
半边指向顶点
5.Connect vertex to outgoing halfedge if it doesn't have one yet
顶点指向半边
6.Connect next/previous halfedges
连接 半边指向下一半边 半边的前半边 的关系,这是最复杂的一步,有多种出现情况,在下一边文章中详细分析